@lastshotlabs/bunshot 0.0.27 → 0.0.28
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.oclif.manifest.json +39 -0
- package/README.md +8282 -2147
- package/dist/cli/commands/init.js +690 -0
- package/dist/cli/index.js +6 -0
- package/dist/cli.js +4 -4
- package/dist/packages/bunshot-admin/src/index.d.ts +15 -0
- package/dist/packages/bunshot-admin/src/index.js +11 -0
- package/dist/packages/bunshot-admin/src/lib/resourceTypes.d.ts +8 -0
- package/dist/packages/bunshot-admin/src/lib/resourceTypes.js +33 -0
- package/dist/packages/bunshot-admin/src/lib/typedRoute.d.ts +14 -0
- package/dist/packages/bunshot-admin/src/lib/typedRoute.js +17 -0
- package/dist/packages/bunshot-admin/src/plugin.d.ts +4 -0
- package/dist/packages/bunshot-admin/src/plugin.js +46 -0
- package/dist/packages/bunshot-admin/src/providers/auth0Access.d.ts +6 -0
- package/dist/packages/bunshot-admin/src/providers/auth0Access.js +32 -0
- package/dist/packages/bunshot-admin/src/routes/admin.d.ts +10 -0
- package/dist/packages/bunshot-admin/src/routes/admin.js +923 -0
- package/dist/packages/bunshot-admin/src/routes/mail.d.ts +6 -0
- package/dist/packages/bunshot-admin/src/routes/mail.js +114 -0
- package/dist/packages/bunshot-admin/src/routes/permissions.d.ts +8 -0
- package/dist/packages/bunshot-admin/src/routes/permissions.js +315 -0
- package/dist/packages/bunshot-admin/src/types/config.d.ts +16 -0
- package/dist/packages/bunshot-admin/src/types/config.js +37 -0
- package/dist/packages/bunshot-admin/src/types/env.d.ts +14 -0
- package/dist/packages/bunshot-admin/src/types/provider.d.ts +1 -0
- package/dist/packages/bunshot-admin/src/types/provider.js +4 -0
- package/dist/packages/bunshot-auth/src/adapters/memoryAuth.d.ts +66 -0
- package/dist/packages/bunshot-auth/src/adapters/memoryAuth.js +1063 -0
- package/dist/packages/bunshot-auth/src/adapters/mongoAuth.d.ts +2 -0
- package/dist/packages/bunshot-auth/src/adapters/mongoAuth.js +536 -0
- package/dist/packages/bunshot-auth/src/adapters/sqliteAuth.d.ts +88 -0
- package/dist/packages/bunshot-auth/src/adapters/sqliteAuth.js +1366 -0
- package/dist/packages/bunshot-auth/src/admin/bunshotAccess.d.ts +2 -0
- package/dist/packages/bunshot-auth/src/admin/bunshotAccess.js +23 -0
- package/dist/packages/bunshot-auth/src/admin/bunshotUsers.d.ts +5 -0
- package/dist/packages/bunshot-auth/src/admin/bunshotUsers.js +131 -0
- package/dist/packages/bunshot-auth/src/bootstrap.d.ts +38 -0
- package/dist/packages/bunshot-auth/src/bootstrap.js +384 -0
- package/dist/packages/bunshot-auth/src/config/appConfig.d.ts +3 -0
- package/dist/packages/bunshot-auth/src/config/appConfig.js +4 -0
- package/dist/packages/bunshot-auth/src/config/authConfig.d.ts +478 -0
- package/dist/packages/bunshot-auth/src/config/authConfig.js +46 -0
- package/dist/packages/bunshot-auth/src/config/configLock.d.ts +2 -0
- package/dist/packages/bunshot-auth/src/config/configLock.js +10 -0
- package/dist/packages/bunshot-auth/src/index.d.ts +25 -0
- package/dist/packages/bunshot-auth/src/index.js +23 -0
- package/dist/packages/bunshot-auth/src/infra/mongo.d.ts +15 -0
- package/dist/packages/bunshot-auth/src/infra/mongo.js +44 -0
- package/dist/packages/bunshot-auth/src/infra/queue.d.ts +14 -0
- package/dist/packages/bunshot-auth/src/infra/queue.js +27 -0
- package/dist/packages/bunshot-auth/src/infra/redis.d.ts +5 -0
- package/dist/packages/bunshot-auth/src/infra/redis.js +15 -0
- package/dist/packages/bunshot-auth/src/infra/signing.d.ts +7 -0
- package/dist/packages/bunshot-auth/src/infra/signing.js +8 -0
- package/dist/packages/bunshot-auth/src/lib/accountLockout.d.ts +34 -0
- package/dist/packages/bunshot-auth/src/lib/accountLockout.js +244 -0
- package/dist/packages/bunshot-auth/src/lib/adapterTiers.d.ts +1 -0
- package/dist/packages/bunshot-auth/src/lib/adapterTiers.js +1 -0
- package/dist/packages/bunshot-auth/src/lib/authAdapter.d.ts +1 -0
- package/dist/packages/bunshot-auth/src/lib/authAdapter.js +1 -0
- package/dist/packages/bunshot-auth/src/lib/authContext.d.ts +15 -0
- package/dist/packages/bunshot-auth/src/lib/authContext.js +1 -0
- package/dist/packages/bunshot-auth/src/lib/authEventBus.d.ts +4 -0
- package/dist/packages/bunshot-auth/src/lib/authEventBus.js +15 -0
- package/dist/packages/bunshot-auth/src/lib/authRateLimit.d.ts +28 -0
- package/dist/packages/bunshot-auth/src/lib/authRateLimit.js +205 -0
- package/dist/{lib → packages/bunshot-auth/src/lib}/breachedPassword.d.ts +8 -2
- package/dist/{lib → packages/bunshot-auth/src/lib}/breachedPassword.js +22 -9
- package/dist/packages/bunshot-auth/src/lib/cache.d.ts +12 -0
- package/dist/packages/bunshot-auth/src/lib/cache.js +120 -0
- package/dist/packages/bunshot-auth/src/lib/clientIp.d.ts +4 -0
- package/dist/{lib → packages/bunshot-auth/src/lib}/clientIp.js +14 -7
- package/dist/packages/bunshot-auth/src/lib/cookieOptions.d.ts +27 -0
- package/dist/packages/bunshot-auth/src/lib/cookieOptions.js +33 -0
- package/dist/packages/bunshot-auth/src/lib/credentialStuffing.d.ts +40 -0
- package/dist/packages/bunshot-auth/src/lib/credentialStuffing.js +221 -0
- package/dist/packages/bunshot-auth/src/lib/deletionCancelToken.d.ts +19 -0
- package/dist/packages/bunshot-auth/src/lib/deletionCancelToken.js +148 -0
- package/dist/packages/bunshot-auth/src/lib/emailTemplates.d.ts +23 -0
- package/dist/packages/bunshot-auth/src/lib/emailTemplates.js +265 -0
- package/dist/packages/bunshot-auth/src/lib/emailVerification.d.ts +30 -0
- package/dist/packages/bunshot-auth/src/lib/emailVerification.js +200 -0
- package/dist/packages/bunshot-auth/src/lib/env.d.ts +1 -0
- package/dist/packages/bunshot-auth/src/lib/env.js +3 -0
- package/dist/packages/bunshot-auth/src/lib/fingerprint.js +36 -0
- package/dist/{lib → packages/bunshot-auth/src/lib}/groups.d.ts +15 -16
- package/dist/{lib → packages/bunshot-auth/src/lib}/groups.js +22 -34
- package/dist/packages/bunshot-auth/src/lib/jwks.d.ts +28 -0
- package/dist/packages/bunshot-auth/src/lib/jwks.js +79 -0
- package/dist/packages/bunshot-auth/src/lib/jwt.d.ts +12 -0
- package/dist/packages/bunshot-auth/src/lib/jwt.js +86 -0
- package/dist/{lib → packages/bunshot-auth/src/lib}/logger.js +3 -3
- package/dist/{lib → packages/bunshot-auth/src/lib}/m2m.d.ts +5 -4
- package/dist/{lib → packages/bunshot-auth/src/lib}/m2m.js +6 -10
- package/dist/packages/bunshot-auth/src/lib/magicLink.d.ts +13 -0
- package/dist/packages/bunshot-auth/src/lib/magicLink.js +145 -0
- package/dist/packages/bunshot-auth/src/lib/mfaChallenge.d.ts +60 -0
- package/dist/packages/bunshot-auth/src/lib/mfaChallenge.js +419 -0
- package/dist/packages/bunshot-auth/src/lib/oauth.d.ts +82 -0
- package/dist/packages/bunshot-auth/src/lib/oauth.js +177 -0
- package/dist/packages/bunshot-auth/src/lib/oauthCode.d.ts +19 -0
- package/dist/packages/bunshot-auth/src/lib/oauthCode.js +182 -0
- package/dist/packages/bunshot-auth/src/lib/oauthReauth.d.ts +19 -0
- package/dist/packages/bunshot-auth/src/lib/oauthReauth.js +255 -0
- package/dist/packages/bunshot-auth/src/lib/organization.d.ts +66 -0
- package/dist/packages/bunshot-auth/src/lib/organization.js +225 -0
- package/dist/packages/bunshot-auth/src/lib/passwordHistory.d.ts +12 -0
- package/dist/packages/bunshot-auth/src/lib/passwordHistory.js +31 -0
- package/dist/packages/bunshot-auth/src/lib/resetPassword.d.ts +20 -0
- package/dist/packages/bunshot-auth/src/lib/resetPassword.js +148 -0
- package/dist/packages/bunshot-auth/src/lib/roles.d.ts +9 -0
- package/dist/packages/bunshot-auth/src/lib/roles.js +93 -0
- package/dist/packages/bunshot-auth/src/lib/saml.d.ts +29 -0
- package/dist/packages/bunshot-auth/src/lib/saml.js +73 -0
- package/dist/packages/bunshot-auth/src/lib/samlRequestId.d.ts +13 -0
- package/dist/packages/bunshot-auth/src/lib/samlRequestId.js +129 -0
- package/dist/{lib → packages/bunshot-auth/src/lib}/scim.d.ts +7 -7
- package/dist/{lib → packages/bunshot-auth/src/lib}/scim.js +15 -13
- package/dist/packages/bunshot-auth/src/lib/securityEventWiring.d.ts +22 -0
- package/dist/packages/bunshot-auth/src/lib/securityEventWiring.js +65 -0
- package/dist/packages/bunshot-auth/src/lib/session.d.ts +45 -0
- package/dist/packages/bunshot-auth/src/lib/session.js +1211 -0
- package/dist/packages/bunshot-auth/src/lib/storeInfra.d.ts +26 -0
- package/dist/packages/bunshot-auth/src/lib/storeInfra.js +18 -0
- package/dist/{lib → packages/bunshot-auth/src/lib}/suspension.d.ts +3 -2
- package/dist/{lib → packages/bunshot-auth/src/lib}/suspension.js +2 -5
- package/dist/packages/bunshot-auth/src/lib/validateAdapter.d.ts +16 -0
- package/dist/packages/bunshot-auth/src/lib/validateAdapter.js +161 -0
- package/dist/packages/bunshot-auth/src/middleware/bearerAuth.d.ts +13 -0
- package/dist/packages/bunshot-auth/src/middleware/bearerAuth.js +58 -0
- package/dist/{middleware → packages/bunshot-auth/src/middleware}/csrf.d.ts +5 -4
- package/dist/packages/bunshot-auth/src/middleware/csrf.js +138 -0
- package/dist/packages/bunshot-auth/src/middleware/identify.d.ts +4 -0
- package/dist/packages/bunshot-auth/src/middleware/identify.js +124 -0
- package/dist/{middleware → packages/bunshot-auth/src/middleware}/requireMfaSetup.d.ts +2 -2
- package/dist/{middleware → packages/bunshot-auth/src/middleware}/requireMfaSetup.js +10 -8
- package/dist/{middleware → packages/bunshot-auth/src/middleware}/requireRole.d.ts +2 -2
- package/dist/{middleware → packages/bunshot-auth/src/middleware}/requireRole.js +20 -16
- package/dist/{middleware → packages/bunshot-auth/src/middleware}/requireScope.d.ts +2 -2
- package/dist/{middleware → packages/bunshot-auth/src/middleware}/requireScope.js +6 -6
- package/dist/{middleware → packages/bunshot-auth/src/middleware}/requireStepUp.d.ts +2 -2
- package/dist/{middleware → packages/bunshot-auth/src/middleware}/requireStepUp.js +8 -7
- package/dist/{middleware → packages/bunshot-auth/src/middleware}/requireVerifiedEmail.d.ts +2 -2
- package/dist/{middleware → packages/bunshot-auth/src/middleware}/requireVerifiedEmail.js +7 -6
- package/dist/packages/bunshot-auth/src/middleware/scimAuth.d.ts +8 -0
- package/dist/packages/bunshot-auth/src/middleware/scimAuth.js +29 -0
- package/dist/packages/bunshot-auth/src/middleware/userAuth.d.ts +3 -0
- package/dist/packages/bunshot-auth/src/middleware/userAuth.js +6 -0
- package/dist/{models → packages/bunshot-auth/src/models}/AuthUser.d.ts +12 -8
- package/dist/packages/bunshot-auth/src/models/AuthUser.js +53 -0
- package/dist/packages/bunshot-auth/src/models/Group.d.ts +19 -0
- package/dist/packages/bunshot-auth/src/models/Group.js +22 -0
- package/dist/{models → packages/bunshot-auth/src/models}/GroupMembership.d.ts +6 -8
- package/dist/packages/bunshot-auth/src/models/GroupMembership.js +19 -0
- package/dist/{models → packages/bunshot-auth/src/models}/M2MClient.d.ts +1 -1
- package/dist/{models → packages/bunshot-auth/src/models}/M2MClient.js +5 -5
- package/dist/packages/bunshot-auth/src/models/TenantRole.d.ts +13 -0
- package/dist/packages/bunshot-auth/src/models/TenantRole.js +17 -0
- package/dist/packages/bunshot-auth/src/plugin.d.ts +4 -0
- package/dist/packages/bunshot-auth/src/plugin.js +274 -0
- package/dist/packages/bunshot-auth/src/routes/auth.d.ts +15 -0
- package/dist/packages/bunshot-auth/src/routes/auth.js +1624 -0
- package/dist/packages/bunshot-auth/src/routes/groups.d.ts +4 -0
- package/dist/packages/bunshot-auth/src/routes/groups.js +481 -0
- package/dist/packages/bunshot-auth/src/routes/m2m.d.ts +2 -0
- package/dist/packages/bunshot-auth/src/routes/m2m.js +145 -0
- package/dist/packages/bunshot-auth/src/routes/mfa.d.ts +6 -0
- package/dist/packages/bunshot-auth/src/routes/mfa.js +991 -0
- package/dist/packages/bunshot-auth/src/routes/oauth.d.ts +3 -0
- package/dist/packages/bunshot-auth/src/routes/oauth.js +1727 -0
- package/dist/packages/bunshot-auth/src/routes/oidc.d.ts +2 -0
- package/dist/packages/bunshot-auth/src/routes/oidc.js +84 -0
- package/dist/packages/bunshot-auth/src/routes/organizations.d.ts +3 -0
- package/dist/packages/bunshot-auth/src/routes/organizations.js +741 -0
- package/dist/packages/bunshot-auth/src/routes/passkey.d.ts +2 -0
- package/dist/packages/bunshot-auth/src/routes/passkey.js +199 -0
- package/dist/packages/bunshot-auth/src/routes/saml.d.ts +2 -0
- package/dist/packages/bunshot-auth/src/routes/saml.js +226 -0
- package/dist/packages/bunshot-auth/src/routes/scim.d.ts +3 -0
- package/dist/packages/bunshot-auth/src/routes/scim.js +588 -0
- package/dist/packages/bunshot-auth/src/runtime.d.ts +52 -0
- package/dist/packages/bunshot-auth/src/runtime.js +11 -0
- package/dist/{schemas → packages/bunshot-auth/src/schemas}/auth.d.ts +4 -5
- package/dist/packages/bunshot-auth/src/schemas/auth.js +24 -0
- package/dist/packages/bunshot-auth/src/schemas/error.d.ts +10 -0
- package/dist/packages/bunshot-auth/src/schemas/error.js +10 -0
- package/dist/packages/bunshot-auth/src/schemas/success.d.ts +10 -0
- package/dist/packages/bunshot-auth/src/schemas/success.js +10 -0
- package/dist/packages/bunshot-auth/src/services/auth.d.ts +39 -0
- package/dist/packages/bunshot-auth/src/services/auth.js +378 -0
- package/dist/{services → packages/bunshot-auth/src/services}/mfa.d.ts +41 -17
- package/dist/{services → packages/bunshot-auth/src/services}/mfa.js +259 -183
- package/dist/packages/bunshot-auth/src/testing.d.ts +31 -0
- package/dist/packages/bunshot-auth/src/testing.js +23 -0
- package/dist/packages/bunshot-auth/src/types/adapter.d.ts +1 -0
- package/dist/packages/bunshot-auth/src/types/adapter.js +1 -0
- package/dist/packages/bunshot-auth/src/types/config.d.ts +152 -0
- package/dist/packages/bunshot-auth/src/types/config.js +179 -0
- package/dist/{routes → packages/bunshot-auth/src/types}/groups.d.ts +2 -3
- package/dist/packages/bunshot-auth/src/types/groups.js +1 -0
- package/dist/packages/bunshot-auth/src/types/oauthCode.d.ts +6 -0
- package/dist/packages/bunshot-auth/src/types/oauthCode.js +1 -0
- package/dist/packages/bunshot-auth/src/types/oauthReauth.d.ts +13 -0
- package/dist/packages/bunshot-auth/src/types/oauthReauth.js +1 -0
- package/dist/packages/bunshot-auth/src/types/redis.d.ts +1 -0
- package/dist/packages/bunshot-auth/src/types/redis.js +1 -0
- package/dist/packages/bunshot-auth/src/types/saml.d.ts +10 -0
- package/dist/packages/bunshot-auth/src/types/saml.js +1 -0
- package/dist/packages/bunshot-auth/src/types/session.d.ts +18 -0
- package/dist/packages/bunshot-auth/src/types/session.js +1 -0
- package/dist/packages/bunshot-auth/src/types/store.d.ts +1 -0
- package/dist/packages/bunshot-auth/src/types/store.js +1 -0
- package/dist/packages/bunshot-core/src/adminProvider.d.ts +95 -0
- package/dist/packages/bunshot-core/src/adminProvider.js +1 -0
- package/dist/packages/bunshot-core/src/auditLog.d.ts +34 -0
- package/dist/packages/bunshot-core/src/auditLog.js +1 -0
- package/dist/packages/bunshot-core/src/auth-adapter.d.ts +227 -0
- package/dist/packages/bunshot-core/src/auth-adapter.js +4 -0
- package/dist/packages/bunshot-core/src/authVariables.d.ts +14 -0
- package/dist/packages/bunshot-core/src/authVariables.js +4 -0
- package/dist/packages/bunshot-core/src/cache.d.ts +12 -0
- package/dist/packages/bunshot-core/src/cache.js +21 -0
- package/dist/{lib → packages/bunshot-core/src}/captcha.d.ts +1 -10
- package/dist/packages/bunshot-core/src/captcha.js +1 -0
- package/dist/packages/bunshot-core/src/clearRegistry.d.ts +6 -0
- package/dist/packages/bunshot-core/src/clearRegistry.js +17 -0
- package/dist/packages/bunshot-core/src/clientIp.d.ts +3 -0
- package/dist/packages/bunshot-core/src/clientIp.js +45 -0
- package/dist/packages/bunshot-core/src/configLock.d.ts +4 -0
- package/dist/packages/bunshot-core/src/configLock.js +7 -0
- package/dist/packages/bunshot-core/src/configValidation.d.ts +22 -0
- package/dist/packages/bunshot-core/src/configValidation.js +39 -0
- package/dist/packages/bunshot-core/src/constants.js +10 -0
- package/dist/packages/bunshot-core/src/context/bunshotContext.d.ts +232 -0
- package/dist/packages/bunshot-core/src/context/bunshotContext.js +1 -0
- package/dist/packages/bunshot-core/src/context/contextAccess.d.ts +3 -0
- package/dist/packages/bunshot-core/src/context/contextAccess.js +16 -0
- package/dist/packages/bunshot-core/src/context/contextStore.d.ts +16 -0
- package/dist/packages/bunshot-core/src/context/contextStore.js +31 -0
- package/dist/packages/bunshot-core/src/context/frameworkConfig.d.ts +38 -0
- package/dist/packages/bunshot-core/src/context/frameworkConfig.js +1 -0
- package/dist/packages/bunshot-core/src/context/index.d.ts +4 -0
- package/dist/packages/bunshot-core/src/context/index.js +2 -0
- package/dist/packages/bunshot-core/src/context.d.ts +40 -0
- package/dist/packages/bunshot-core/src/context.js +35 -0
- package/dist/packages/bunshot-core/src/coreContracts.d.ts +47 -0
- package/dist/packages/bunshot-core/src/coreContracts.js +1 -0
- package/dist/packages/bunshot-core/src/coreRegistrar.d.ts +6 -0
- package/dist/packages/bunshot-core/src/coreRegistrar.js +42 -0
- package/dist/{lib → packages/bunshot-core/src}/createRoute.d.ts +4 -30
- package/dist/{lib → packages/bunshot-core/src}/createRoute.js +39 -88
- package/dist/packages/bunshot-core/src/cronRegistry.d.ts +11 -0
- package/dist/packages/bunshot-core/src/cronRegistry.js +1 -0
- package/dist/packages/bunshot-core/src/crypto.d.ts +43 -0
- package/dist/packages/bunshot-core/src/crypto.js +74 -0
- package/dist/packages/bunshot-core/src/csrf.d.ts +8 -0
- package/dist/packages/bunshot-core/src/csrf.js +1 -0
- package/dist/packages/bunshot-core/src/defaults/defaultFingerprint.d.ts +7 -0
- package/dist/packages/bunshot-core/src/defaults/defaultFingerprint.js +19 -0
- package/dist/packages/bunshot-core/src/defaults/memoryCacheAdapter.d.ts +6 -0
- package/dist/packages/bunshot-core/src/defaults/memoryCacheAdapter.js +40 -0
- package/dist/packages/bunshot-core/src/defaults/memoryRateLimit.d.ts +6 -0
- package/dist/packages/bunshot-core/src/defaults/memoryRateLimit.js +24 -0
- package/dist/packages/bunshot-core/src/emailTemplates.d.ts +5 -0
- package/dist/packages/bunshot-core/src/emailTemplates.js +10 -0
- package/dist/{lib/HttpError.d.ts → packages/bunshot-core/src/errors.d.ts} +4 -1
- package/dist/{lib/HttpError.js → packages/bunshot-core/src/errors.js} +7 -1
- package/dist/packages/bunshot-core/src/eventBus.d.ts +270 -0
- package/dist/packages/bunshot-core/src/eventBus.js +143 -0
- package/dist/packages/bunshot-core/src/idempotency.d.ts +18 -0
- package/dist/packages/bunshot-core/src/idempotency.js +1 -0
- package/dist/packages/bunshot-core/src/index.d.ts +60 -0
- package/dist/packages/bunshot-core/src/index.js +34 -0
- package/dist/packages/bunshot-core/src/mail.d.ts +14 -0
- package/dist/packages/bunshot-core/src/mail.js +8 -0
- package/dist/packages/bunshot-core/src/memoryEviction.d.ts +24 -0
- package/dist/packages/bunshot-core/src/memoryEviction.js +52 -0
- package/dist/packages/bunshot-core/src/pagination.d.ts +45 -0
- package/dist/packages/bunshot-core/src/pagination.js +61 -0
- package/dist/packages/bunshot-core/src/permissions.d.ts +64 -0
- package/dist/packages/bunshot-core/src/permissions.js +27 -0
- package/dist/packages/bunshot-core/src/plugin.d.ts +44 -0
- package/dist/packages/bunshot-core/src/plugin.js +1 -0
- package/dist/packages/bunshot-core/src/rateLimit.d.ts +5 -0
- package/dist/packages/bunshot-core/src/rateLimit.js +18 -0
- package/dist/packages/bunshot-core/src/redis.d.ts +21 -0
- package/dist/packages/bunshot-core/src/redis.js +1 -0
- package/dist/packages/bunshot-core/src/routeAuth.d.ts +5 -0
- package/dist/packages/bunshot-core/src/routeAuth.js +11 -0
- package/dist/packages/bunshot-core/src/routeOverrides.d.ts +24 -0
- package/dist/packages/bunshot-core/src/routeOverrides.js +25 -0
- package/dist/packages/bunshot-core/src/routerAdapter.d.ts +6 -0
- package/dist/packages/bunshot-core/src/routerAdapter.js +56 -0
- package/dist/packages/bunshot-core/src/secrets.d.ts +48 -0
- package/dist/packages/bunshot-core/src/secrets.js +8 -0
- package/dist/packages/bunshot-core/src/signing.d.ts +41 -0
- package/dist/packages/bunshot-core/src/signing.js +1 -0
- package/dist/packages/bunshot-core/src/sse.d.ts +36 -0
- package/dist/packages/bunshot-core/src/sse.js +1 -0
- package/dist/packages/bunshot-core/src/storageAdapter.js +1 -0
- package/dist/packages/bunshot-core/src/storeInfra.d.ts +44 -0
- package/dist/packages/bunshot-core/src/storeInfra.js +18 -0
- package/dist/packages/bunshot-core/src/storeType.d.ts +7 -0
- package/dist/packages/bunshot-core/src/storeType.js +1 -0
- package/dist/packages/bunshot-core/src/testing.d.ts +1 -0
- package/dist/packages/bunshot-core/src/testing.js +1 -0
- package/dist/packages/bunshot-core/src/uploadRegistry.d.ts +23 -0
- package/dist/packages/bunshot-core/src/uploadRegistry.js +4 -0
- package/dist/packages/bunshot-core/src/userResolver.d.ts +5 -0
- package/dist/packages/bunshot-core/src/userResolver.js +14 -0
- package/dist/packages/bunshot-core/src/wsMessages.d.ts +42 -0
- package/dist/packages/bunshot-core/src/wsMessages.js +4 -0
- package/dist/packages/bunshot-permissions/src/adapters/memory.d.ts +7 -0
- package/dist/packages/bunshot-permissions/src/adapters/memory.js +73 -0
- package/dist/packages/bunshot-permissions/src/index.d.ts +10 -0
- package/dist/packages/bunshot-permissions/src/index.js +5 -0
- package/dist/packages/bunshot-permissions/src/lib/bootstrap.d.ts +7 -0
- package/dist/packages/bunshot-permissions/src/lib/bootstrap.js +12 -0
- package/dist/packages/bunshot-permissions/src/lib/evaluator.d.ts +10 -0
- package/dist/packages/bunshot-permissions/src/lib/evaluator.js +165 -0
- package/dist/packages/bunshot-permissions/src/lib/registry.d.ts +2 -0
- package/dist/packages/bunshot-permissions/src/lib/registry.js +31 -0
- package/dist/packages/bunshot-permissions/src/lib/validation.d.ts +1 -0
- package/dist/packages/bunshot-permissions/src/lib/validation.js +1 -0
- package/dist/packages/bunshot-permissions/src/types/adapter.d.ts +1 -0
- package/dist/packages/bunshot-permissions/src/types/adapter.js +1 -0
- package/dist/packages/bunshot-permissions/src/types/evaluator.d.ts +1 -0
- package/dist/packages/bunshot-permissions/src/types/evaluator.js +1 -0
- package/dist/packages/bunshot-permissions/src/types/models.d.ts +1 -0
- package/dist/packages/bunshot-permissions/src/types/models.js +1 -0
- package/dist/packages/bunshot-permissions/src/types/registry.d.ts +1 -0
- package/dist/packages/bunshot-permissions/src/types/registry.js +1 -0
- package/dist/packages/bunshot-postgres/src/adapter.d.ts +6 -0
- package/dist/packages/bunshot-postgres/src/adapter.js +794 -0
- package/dist/packages/bunshot-postgres/src/connection.d.ts +15 -0
- package/dist/packages/bunshot-postgres/src/connection.js +16 -0
- package/dist/packages/bunshot-postgres/src/index.d.ts +4 -0
- package/dist/packages/bunshot-postgres/src/index.js +2 -0
- package/dist/packages/bunshot-postgres/src/schema.d.ts +997 -0
- package/dist/packages/bunshot-postgres/src/schema.js +105 -0
- package/dist/src/app.d.ts +230 -0
- package/dist/src/app.js +182 -0
- package/dist/src/cli/commands/init.d.ts +10 -0
- package/dist/src/cli/commands/init.js +709 -0
- package/dist/src/cli/index.d.ts +1 -0
- package/dist/src/cli/index.js +3 -0
- package/dist/src/entrypoints/mongo.d.ts +6 -0
- package/dist/src/entrypoints/mongo.js +4 -0
- package/dist/src/entrypoints/queue.d.ts +2 -0
- package/dist/src/entrypoints/queue.js +1 -0
- package/dist/src/entrypoints/redis.d.ts +1 -0
- package/dist/src/entrypoints/redis.js +1 -0
- package/dist/{adapters → src/framework/adapters}/localStorage.d.ts +1 -1
- package/dist/{adapters → src/framework/adapters}/localStorage.js +10 -10
- package/dist/src/framework/adapters/memoryStorage.d.ts +2 -0
- package/dist/src/framework/adapters/memoryStorage.js +45 -0
- package/dist/{adapters → src/framework/adapters}/s3Storage.d.ts +1 -1
- package/dist/{adapters → src/framework/adapters}/s3Storage.js +12 -12
- package/dist/src/framework/admin/bunshotAccess.d.ts +2 -0
- package/dist/src/framework/admin/bunshotAccess.js +23 -0
- package/dist/src/framework/admin/bunshotUsers.d.ts +2 -0
- package/dist/src/framework/admin/bunshotUsers.js +103 -0
- package/dist/src/framework/admin/index.d.ts +7 -0
- package/dist/src/framework/admin/index.js +21 -0
- package/dist/src/framework/boundaryAdapters/cacheFactories.d.ts +13 -0
- package/dist/src/framework/boundaryAdapters/cacheFactories.js +86 -0
- package/dist/src/framework/boundaryAdapters/index.d.ts +2 -0
- package/dist/src/framework/boundaryAdapters/index.js +1 -0
- package/dist/src/framework/boundaryAdapters.d.ts +17 -0
- package/dist/src/framework/boundaryAdapters.js +62 -0
- package/dist/src/framework/buildContext.d.ts +33 -0
- package/dist/src/framework/buildContext.js +119 -0
- package/dist/src/framework/config/schema.d.ts +447 -0
- package/dist/src/framework/config/schema.js +528 -0
- package/dist/src/framework/createInfrastructure.d.ts +76 -0
- package/dist/src/framework/createInfrastructure.js +221 -0
- package/dist/src/framework/lib/auditLog.d.ts +23 -0
- package/dist/src/framework/lib/auditLog.js +416 -0
- package/dist/src/framework/lib/captcha.d.ts +11 -0
- package/dist/{lib → src/framework/lib}/captcha.js +13 -10
- package/dist/{lib → src/framework/lib}/createDtoMapper.js +4 -4
- package/dist/src/framework/lib/createRoute.d.ts +1 -0
- package/dist/src/framework/lib/createRoute.js +2 -0
- package/dist/{lib → src/framework/lib}/idempotency.d.ts +2 -6
- package/dist/src/framework/lib/idempotency.js +74 -0
- package/dist/src/framework/lib/logger.d.ts +3 -0
- package/dist/src/framework/lib/logger.js +14 -0
- package/dist/src/framework/lib/metrics.d.ts +34 -0
- package/dist/{lib → src/framework/lib}/metrics.js +49 -57
- package/dist/src/framework/lib/pagination.d.ts +42 -0
- package/dist/src/framework/lib/pagination.js +51 -0
- package/dist/src/framework/lib/redisTransport.d.ts +38 -0
- package/dist/src/framework/lib/redisTransport.js +107 -0
- package/dist/src/framework/lib/resolveUserId.d.ts +2 -0
- package/dist/src/framework/lib/resolveUserId.js +5 -0
- package/dist/src/framework/lib/sseCollision.d.ts +6 -0
- package/dist/src/framework/lib/sseCollision.js +26 -0
- package/dist/src/framework/lib/storageAdapter.d.ts +1 -0
- package/dist/src/framework/lib/storageAdapter.js +1 -0
- package/dist/{lib → src/framework/lib}/stripUnreferencedSchemas.js +4 -4
- package/dist/src/framework/lib/tenant.d.ts +21 -0
- package/dist/src/framework/lib/tenant.js +70 -0
- package/dist/{lib → src/framework/lib}/upload.d.ts +11 -10
- package/dist/src/framework/lib/upload.js +132 -0
- package/dist/src/framework/lib/uploadRegistry.d.ts +23 -0
- package/dist/src/framework/lib/uploadRegistry.js +34 -0
- package/dist/{lib → src/framework/lib}/validate.d.ts +1 -1
- package/dist/{lib → src/framework/lib}/validate.js +2 -2
- package/dist/src/framework/lib/ws.d.ts +19 -0
- package/dist/src/framework/lib/ws.js +130 -0
- package/dist/src/framework/lib/wsHeartbeat.d.ts +12 -0
- package/dist/src/framework/lib/wsHeartbeat.js +53 -0
- package/dist/src/framework/lib/wsMessages.d.ts +25 -0
- package/dist/src/framework/lib/wsMessages.js +45 -0
- package/dist/src/framework/lib/wsNamespace.d.ts +17 -0
- package/dist/src/framework/lib/wsNamespace.js +19 -0
- package/dist/src/framework/lib/wsPresence.d.ts +17 -0
- package/dist/src/framework/lib/wsPresence.js +84 -0
- package/dist/src/framework/lib/wsTransport.d.ts +38 -0
- package/dist/src/framework/lib/wsTransport.js +9 -0
- package/dist/{lib → src/framework/lib}/zodToMongoose.d.ts +1 -1
- package/dist/{lib → src/framework/lib}/zodToMongoose.js +11 -11
- package/dist/{middleware → src/framework/middleware}/auditLog.d.ts +4 -3
- package/dist/src/framework/middleware/auditLog.js +42 -0
- package/dist/{middleware → src/framework/middleware}/botProtection.d.ts +2 -2
- package/dist/{middleware → src/framework/middleware}/botProtection.js +8 -9
- package/dist/src/framework/middleware/cacheResponse.d.ts +35 -0
- package/dist/src/framework/middleware/cacheResponse.js +126 -0
- package/dist/{middleware → src/framework/middleware}/captcha.d.ts +2 -3
- package/dist/src/framework/middleware/captcha.js +37 -0
- package/dist/{middleware → src/framework/middleware}/errorHandler.d.ts +1 -1
- package/dist/{middleware → src/framework/middleware}/errorHandler.js +2 -2
- package/dist/src/framework/middleware/index.js +1 -0
- package/dist/{middleware → src/framework/middleware}/logger.d.ts +1 -1
- package/dist/src/framework/middleware/metrics.d.ts +12 -0
- package/dist/src/framework/middleware/metrics.js +26 -0
- package/dist/{middleware → src/framework/middleware}/rateLimit.d.ts +2 -2
- package/dist/src/framework/middleware/rateLimit.js +22 -0
- package/dist/src/framework/middleware/requestId.d.ts +3 -0
- package/dist/{middleware → src/framework/middleware}/requestId.js +2 -2
- package/dist/{middleware → src/framework/middleware}/requestLogger.d.ts +3 -3
- package/dist/{middleware → src/framework/middleware}/requestLogger.js +17 -12
- package/dist/{middleware → src/framework/middleware}/requestSigning.d.ts +2 -2
- package/dist/{middleware → src/framework/middleware}/requestSigning.js +18 -20
- package/dist/src/framework/middleware/tenant.d.ts +14 -0
- package/dist/{middleware → src/framework/middleware}/tenant.js +31 -27
- package/dist/src/framework/middleware/upload.d.ts +5 -0
- package/dist/{middleware → src/framework/middleware}/upload.js +4 -4
- package/dist/{middleware → src/framework/middleware}/webhookAuth.d.ts +3 -3
- package/dist/{middleware → src/framework/middleware}/webhookAuth.js +11 -12
- package/dist/src/framework/models/AuditLog.d.ts +21 -0
- package/dist/src/framework/models/AuditLog.js +31 -0
- package/dist/src/framework/mountMiddleware.d.ts +91 -0
- package/dist/src/framework/mountMiddleware.js +128 -0
- package/dist/src/framework/mountOptionalEndpoints.d.ts +103 -0
- package/dist/src/framework/mountOptionalEndpoints.js +47 -0
- package/dist/src/framework/mountRoutes.d.ts +21 -0
- package/dist/src/framework/mountRoutes.js +144 -0
- package/dist/src/framework/persistence/cronRegistry.d.ts +28 -0
- package/dist/src/framework/persistence/cronRegistry.js +139 -0
- package/dist/src/framework/persistence/idempotency.d.ts +26 -0
- package/dist/src/framework/persistence/idempotency.js +178 -0
- package/dist/src/framework/persistence/index.d.ts +6 -0
- package/dist/src/framework/persistence/index.js +8 -0
- package/dist/src/framework/persistence/storeInfra.d.ts +9 -0
- package/dist/src/framework/persistence/storeInfra.js +1 -0
- package/dist/src/framework/persistence/uploadRegistry.d.ts +35 -0
- package/dist/src/framework/persistence/uploadRegistry.js +235 -0
- package/dist/src/framework/persistence/wsMessages.d.ts +22 -0
- package/dist/src/framework/persistence/wsMessages.js +296 -0
- package/dist/src/framework/preloadSchemas.d.ts +24 -0
- package/dist/src/framework/preloadSchemas.js +42 -0
- package/dist/src/framework/registerBoundaryAdapters.d.ts +23 -0
- package/dist/src/framework/registerBoundaryAdapters.js +46 -0
- package/dist/src/framework/routes/admin.d.ts +9 -0
- package/dist/src/framework/routes/admin.js +361 -0
- package/dist/src/framework/routes/health.d.ts +1 -0
- package/dist/src/framework/routes/health.js +21 -0
- package/dist/src/framework/routes/home.d.ts +1 -0
- package/dist/src/framework/routes/home.js +18 -0
- package/dist/src/framework/routes/jobs.d.ts +3 -0
- package/dist/{routes → src/framework/routes}/jobs.js +128 -103
- package/dist/src/framework/routes/metrics.d.ts +10 -0
- package/dist/src/framework/routes/metrics.js +57 -0
- package/dist/{routes → src/framework/routes}/uploads.d.ts +3 -3
- package/dist/src/framework/routes/uploads.js +262 -0
- package/dist/src/framework/runPluginLifecycle.d.ts +27 -0
- package/dist/src/framework/runPluginLifecycle.js +121 -0
- package/dist/src/framework/secrets/frameworkSecretSchema.d.ts +58 -0
- package/dist/src/framework/secrets/frameworkSecretSchema.js +20 -0
- package/dist/src/framework/secrets/index.d.ts +9 -0
- package/dist/src/framework/secrets/index.js +7 -0
- package/dist/src/framework/secrets/providers/envProvider.d.ts +15 -0
- package/dist/src/framework/secrets/providers/envProvider.js +18 -0
- package/dist/src/framework/secrets/providers/fileProvider.d.ts +8 -0
- package/dist/src/framework/secrets/providers/fileProvider.js +82 -0
- package/dist/src/framework/secrets/providers/ssmProvider.d.ts +20 -0
- package/dist/src/framework/secrets/providers/ssmProvider.js +127 -0
- package/dist/src/framework/secrets/resolveSecretBundle.d.ts +53 -0
- package/dist/src/framework/secrets/resolveSecretBundle.js +84 -0
- package/dist/src/framework/secrets/resolveSecrets.d.ts +18 -0
- package/dist/src/framework/secrets/resolveSecrets.js +34 -0
- package/dist/src/framework/sse/index.d.ts +21 -0
- package/dist/src/framework/sse/index.js +109 -0
- package/dist/src/framework/ws/index.d.ts +11 -0
- package/dist/src/framework/ws/index.js +8 -0
- package/dist/src/index.d.ts +87 -0
- package/dist/src/index.js +58 -0
- package/dist/src/lib/appConfig.d.ts +7 -0
- package/dist/src/lib/appConfig.js +27 -0
- package/dist/src/lib/appMeta.d.ts +7 -0
- package/dist/src/lib/appMeta.js +3 -0
- package/dist/src/lib/authConfig.d.ts +532 -0
- package/dist/{lib/appConfig.js → src/lib/authConfig.js} +75 -17
- package/dist/{lib → src/lib}/context.d.ts +6 -12
- package/dist/{lib → src/lib}/context.js +5 -5
- package/dist/src/lib/logger.d.ts +1 -0
- package/dist/src/lib/logger.js +1 -0
- package/dist/src/lib/mongo.d.ts +58 -0
- package/dist/src/lib/mongo.js +96 -0
- package/dist/src/lib/queue.d.ts +72 -0
- package/dist/src/lib/queue.js +152 -0
- package/dist/src/lib/redis.d.ts +28 -0
- package/dist/src/lib/redis.js +72 -0
- package/dist/{lib → src/lib}/signing.d.ts +2 -2
- package/dist/src/lib/signing.js +210 -0
- package/dist/src/lib/signingConfig.d.ts +40 -0
- package/dist/src/lib/signingConfig.js +28 -0
- package/dist/src/server.d.ts +146 -0
- package/dist/src/server.js +469 -0
- package/dist/src/shared/lib/HttpError.d.ts +1 -0
- package/dist/src/shared/lib/HttpError.js +2 -0
- package/dist/src/shared/lib/constants.d.ts +10 -0
- package/dist/src/shared/lib/crypto.d.ts +43 -0
- package/dist/src/shared/lib/crypto.js +74 -0
- package/dist/src/shared/lib/signing.d.ts +52 -0
- package/dist/{lib → src/shared/lib}/signing.js +35 -8
- package/dist/src/testing.d.ts +34 -0
- package/dist/src/testing.js +93 -0
- package/package.json +60 -24
- package/dist/adapters/memoryAuth.d.ts +0 -52
- package/dist/adapters/memoryAuth.js +0 -749
- package/dist/adapters/memoryStorage.d.ts +0 -3
- package/dist/adapters/memoryStorage.js +0 -44
- package/dist/adapters/mongoAuth.d.ts +0 -2
- package/dist/adapters/mongoAuth.js +0 -403
- package/dist/adapters/sqliteAuth.d.ts +0 -72
- package/dist/adapters/sqliteAuth.js +0 -858
- package/dist/app.d.ts +0 -559
- package/dist/app.js +0 -651
- package/dist/entrypoints/mongo.d.ts +0 -5
- package/dist/entrypoints/mongo.js +0 -4
- package/dist/entrypoints/queue.d.ts +0 -2
- package/dist/entrypoints/queue.js +0 -1
- package/dist/entrypoints/redis.d.ts +0 -1
- package/dist/entrypoints/redis.js +0 -1
- package/dist/index.d.ts +0 -117
- package/dist/index.js +0 -88
- package/dist/lib/appConfig.d.ts +0 -275
- package/dist/lib/auditLog.d.ts +0 -58
- package/dist/lib/auditLog.js +0 -218
- package/dist/lib/authAdapter.d.ts +0 -246
- package/dist/lib/authAdapter.js +0 -7
- package/dist/lib/authRateLimit.d.ts +0 -13
- package/dist/lib/authRateLimit.js +0 -117
- package/dist/lib/clientIp.d.ts +0 -14
- package/dist/lib/credentialStuffing.d.ts +0 -31
- package/dist/lib/credentialStuffing.js +0 -77
- package/dist/lib/crypto.d.ts +0 -11
- package/dist/lib/crypto.js +0 -22
- package/dist/lib/deletionCancelToken.d.ts +0 -12
- package/dist/lib/deletionCancelToken.js +0 -88
- package/dist/lib/emailVerification.d.ts +0 -19
- package/dist/lib/emailVerification.js +0 -129
- package/dist/lib/fingerprint.js +0 -36
- package/dist/lib/idempotency.js +0 -182
- package/dist/lib/jwks.d.ts +0 -25
- package/dist/lib/jwks.js +0 -51
- package/dist/lib/jwt.d.ts +0 -15
- package/dist/lib/jwt.js +0 -111
- package/dist/lib/metrics.d.ts +0 -14
- package/dist/lib/mfaChallenge.d.ts +0 -55
- package/dist/lib/mfaChallenge.js +0 -398
- package/dist/lib/mongo.d.ts +0 -39
- package/dist/lib/mongo.js +0 -124
- package/dist/lib/oauth.d.ts +0 -40
- package/dist/lib/oauth.js +0 -101
- package/dist/lib/oauthCode.d.ts +0 -15
- package/dist/lib/oauthCode.js +0 -95
- package/dist/lib/pagination.d.ts +0 -119
- package/dist/lib/pagination.js +0 -166
- package/dist/lib/queue.d.ts +0 -37
- package/dist/lib/queue.js +0 -117
- package/dist/lib/redis.d.ts +0 -9
- package/dist/lib/redis.js +0 -61
- package/dist/lib/resetPassword.d.ts +0 -12
- package/dist/lib/resetPassword.js +0 -93
- package/dist/lib/roles.d.ts +0 -7
- package/dist/lib/roles.js +0 -49
- package/dist/lib/saml.d.ts +0 -25
- package/dist/lib/saml.js +0 -64
- package/dist/lib/securityEvents.d.ts +0 -28
- package/dist/lib/securityEvents.js +0 -26
- package/dist/lib/session.d.ts +0 -49
- package/dist/lib/session.js +0 -597
- package/dist/lib/tenant.d.ts +0 -15
- package/dist/lib/tenant.js +0 -65
- package/dist/lib/upload.js +0 -112
- package/dist/lib/uploadRegistry.d.ts +0 -18
- package/dist/lib/uploadRegistry.js +0 -83
- package/dist/lib/ws.d.ts +0 -22
- package/dist/lib/ws.js +0 -96
- package/dist/lib/wsHeartbeat.d.ts +0 -12
- package/dist/lib/wsHeartbeat.js +0 -57
- package/dist/lib/wsMessages.d.ts +0 -40
- package/dist/lib/wsMessages.js +0 -330
- package/dist/lib/wsPresence.d.ts +0 -25
- package/dist/lib/wsPresence.js +0 -99
- package/dist/middleware/auditLog.js +0 -39
- package/dist/middleware/bearerAuth.d.ts +0 -2
- package/dist/middleware/bearerAuth.js +0 -11
- package/dist/middleware/cacheResponse.d.ts +0 -15
- package/dist/middleware/cacheResponse.js +0 -178
- package/dist/middleware/captcha.js +0 -36
- package/dist/middleware/csrf.js +0 -129
- package/dist/middleware/identify.d.ts +0 -3
- package/dist/middleware/identify.js +0 -122
- package/dist/middleware/index.js +0 -1
- package/dist/middleware/metrics.d.ts +0 -9
- package/dist/middleware/metrics.js +0 -26
- package/dist/middleware/rateLimit.js +0 -22
- package/dist/middleware/requestId.d.ts +0 -3
- package/dist/middleware/scimAuth.d.ts +0 -8
- package/dist/middleware/scimAuth.js +0 -29
- package/dist/middleware/tenant.d.ts +0 -5
- package/dist/middleware/upload.d.ts +0 -5
- package/dist/middleware/userAuth.d.ts +0 -3
- package/dist/middleware/userAuth.js +0 -6
- package/dist/models/AuditLog.d.ts +0 -30
- package/dist/models/AuditLog.js +0 -39
- package/dist/models/AuthUser.js +0 -55
- package/dist/models/Group.d.ts +0 -21
- package/dist/models/Group.js +0 -28
- package/dist/models/GroupMembership.js +0 -25
- package/dist/models/TenantRole.d.ts +0 -15
- package/dist/models/TenantRole.js +0 -23
- package/dist/routes/auth.d.ts +0 -12
- package/dist/routes/auth.js +0 -744
- package/dist/routes/groups.js +0 -346
- package/dist/routes/health.d.ts +0 -1
- package/dist/routes/health.js +0 -22
- package/dist/routes/home.d.ts +0 -1
- package/dist/routes/home.js +0 -16
- package/dist/routes/jobs.d.ts +0 -2
- package/dist/routes/m2m.d.ts +0 -2
- package/dist/routes/m2m.js +0 -72
- package/dist/routes/metrics.d.ts +0 -8
- package/dist/routes/metrics.js +0 -55
- package/dist/routes/mfa.d.ts +0 -5
- package/dist/routes/mfa.js +0 -628
- package/dist/routes/oauth.d.ts +0 -2
- package/dist/routes/oauth.js +0 -520
- package/dist/routes/oidc.d.ts +0 -2
- package/dist/routes/oidc.js +0 -29
- package/dist/routes/passkey.d.ts +0 -1
- package/dist/routes/passkey.js +0 -157
- package/dist/routes/saml.d.ts +0 -2
- package/dist/routes/saml.js +0 -86
- package/dist/routes/scim.d.ts +0 -2
- package/dist/routes/scim.js +0 -255
- package/dist/routes/uploads.js +0 -227
- package/dist/schemas/auth.js +0 -30
- package/dist/server.d.ts +0 -57
- package/dist/server.js +0 -112
- package/dist/services/auth.d.ts +0 -29
- package/dist/services/auth.js +0 -238
- package/dist/ws/index.d.ts +0 -10
- package/dist/ws/index.js +0 -39
- package/docs/sections/adding-middleware/full.md +0 -35
- package/docs/sections/adding-models/full.md +0 -125
- package/docs/sections/adding-models/overview.md +0 -13
- package/docs/sections/adding-routes/full.md +0 -182
- package/docs/sections/adding-routes/overview.md +0 -23
- package/docs/sections/auth-flow/full.md +0 -790
- package/docs/sections/auth-flow/overview.md +0 -10
- package/docs/sections/auth-security-examples/full.md +0 -388
- package/docs/sections/authentication/full.md +0 -130
- package/docs/sections/authentication/overview.md +0 -5
- package/docs/sections/cli/full.md +0 -42
- package/docs/sections/configuration/full.md +0 -172
- package/docs/sections/configuration/overview.md +0 -18
- package/docs/sections/configuration-example/full.md +0 -117
- package/docs/sections/configuration-example/overview.md +0 -30
- package/docs/sections/documentation/full.md +0 -171
- package/docs/sections/environment-variables/full.md +0 -55
- package/docs/sections/exports/full.md +0 -123
- package/docs/sections/extending-context/full.md +0 -59
- package/docs/sections/header.md +0 -3
- package/docs/sections/installation/full.md +0 -6
- package/docs/sections/jobs/full.md +0 -140
- package/docs/sections/jobs/overview.md +0 -15
- package/docs/sections/logging/full.md +0 -83
- package/docs/sections/metrics/full.md +0 -131
- package/docs/sections/mongodb-connections/full.md +0 -45
- package/docs/sections/mongodb-connections/overview.md +0 -7
- package/docs/sections/multi-tenancy/full.md +0 -66
- package/docs/sections/multi-tenancy/overview.md +0 -15
- package/docs/sections/oauth/full.md +0 -189
- package/docs/sections/oauth/overview.md +0 -16
- package/docs/sections/package-development/full.md +0 -7
- package/docs/sections/pagination/full.md +0 -93
- package/docs/sections/passkey-login/full.md +0 -90
- package/docs/sections/passkey-login/overview.md +0 -1
- package/docs/sections/peer-dependencies/full.md +0 -47
- package/docs/sections/quick-start/full.md +0 -43
- package/docs/sections/response-caching/full.md +0 -117
- package/docs/sections/response-caching/overview.md +0 -13
- package/docs/sections/roles/full.md +0 -225
- package/docs/sections/roles/overview.md +0 -14
- package/docs/sections/running-without-redis/full.md +0 -16
- package/docs/sections/running-without-redis-or-mongodb/full.md +0 -60
- package/docs/sections/signing/full.md +0 -203
- package/docs/sections/stack/full.md +0 -10
- package/docs/sections/uploads/full.md +0 -208
- package/docs/sections/versioning/full.md +0 -85
- package/docs/sections/webhook-auth/full.md +0 -100
- package/docs/sections/websocket/full.md +0 -196
- package/docs/sections/websocket/overview.md +0 -5
- package/docs/sections/websocket-rooms/full.md +0 -102
- package/docs/sections/websocket-rooms/overview.md +0 -5
- /package/dist/{lib/storageAdapter.js → packages/bunshot-admin/src/types/env.js} +0 -0
- /package/dist/{lib → packages/bunshot-auth/src/lib}/fingerprint.d.ts +0 -0
- /package/dist/{lib → packages/bunshot-auth/src/lib}/logger.d.ts +0 -0
- /package/dist/{lib → packages/bunshot-core/src}/constants.d.ts +0 -0
- /package/dist/{lib → packages/bunshot-core/src}/storageAdapter.d.ts +0 -0
- /package/dist/{lib → src/framework/lib}/createDtoMapper.d.ts +0 -0
- /package/dist/{lib → src/framework/lib}/stripUnreferencedSchemas.d.ts +0 -0
- /package/dist/{middleware → src/framework/middleware}/cors.d.ts +0 -0
- /package/dist/{middleware → src/framework/middleware}/cors.js +0 -0
- /package/dist/{middleware → src/framework/middleware}/index.d.ts +0 -0
- /package/dist/{middleware → src/framework/middleware}/logger.js +0 -0
- /package/dist/{lib → src/shared/lib}/constants.js +0 -0
|
@@ -1,77 +0,0 @@
|
|
|
1
|
-
// In-memory store: key → BoundedSet
|
|
2
|
-
const _store = new Map();
|
|
3
|
-
function cleanExpired() {
|
|
4
|
-
const now = Date.now();
|
|
5
|
-
for (const [key, entry] of _store.entries()) {
|
|
6
|
-
if (entry.expiresAt < now)
|
|
7
|
-
_store.delete(key);
|
|
8
|
-
}
|
|
9
|
-
}
|
|
10
|
-
function addToSet(key, member, windowMs) {
|
|
11
|
-
cleanExpired();
|
|
12
|
-
const now = Date.now();
|
|
13
|
-
let entry = _store.get(key);
|
|
14
|
-
if (!entry || entry.expiresAt < now) {
|
|
15
|
-
entry = { members: new Set(), expiresAt: now + windowMs };
|
|
16
|
-
_store.set(key, entry);
|
|
17
|
-
}
|
|
18
|
-
entry.members.add(member);
|
|
19
|
-
return entry.members.size;
|
|
20
|
-
}
|
|
21
|
-
function getSetSize(key) {
|
|
22
|
-
cleanExpired();
|
|
23
|
-
const now = Date.now();
|
|
24
|
-
const entry = _store.get(key);
|
|
25
|
-
if (!entry || entry.expiresAt < now)
|
|
26
|
-
return 0;
|
|
27
|
-
return entry.members.size;
|
|
28
|
-
}
|
|
29
|
-
let _config = null;
|
|
30
|
-
export function setCredentialStuffingConfig(config) {
|
|
31
|
-
_config = config;
|
|
32
|
-
}
|
|
33
|
-
export function getCredentialStuffingConfig() {
|
|
34
|
-
return _config;
|
|
35
|
-
}
|
|
36
|
-
/**
|
|
37
|
-
* Track a failed login attempt. Call this AFTER confirming the login failed.
|
|
38
|
-
*/
|
|
39
|
-
export function trackFailedLogin(ip, identifier) {
|
|
40
|
-
if (!_config)
|
|
41
|
-
return;
|
|
42
|
-
const ipWindowMs = _config.maxAccountsPerIp?.windowMs ?? 15 * 60 * 1000;
|
|
43
|
-
const accountWindowMs = _config.maxIpsPerAccount?.windowMs ?? 15 * 60 * 1000;
|
|
44
|
-
addToSet(`ip:${ip}`, identifier, ipWindowMs);
|
|
45
|
-
addToSet(`account:${identifier}`, ip, accountWindowMs);
|
|
46
|
-
}
|
|
47
|
-
/**
|
|
48
|
-
* Check whether this login attempt should be blocked.
|
|
49
|
-
* Call this BEFORE verifying credentials.
|
|
50
|
-
*/
|
|
51
|
-
export function isStuffingBlocked(ip, identifier) {
|
|
52
|
-
if (!_config)
|
|
53
|
-
return false;
|
|
54
|
-
const ipMax = _config.maxAccountsPerIp?.count ?? 5;
|
|
55
|
-
const accountMax = _config.maxIpsPerAccount?.count ?? 10;
|
|
56
|
-
const ipCount = getSetSize(`ip:${ip}`);
|
|
57
|
-
if (ipCount >= ipMax) {
|
|
58
|
-
try {
|
|
59
|
-
_config.onDetected?.({ type: "ip", key: ip, count: ipCount });
|
|
60
|
-
}
|
|
61
|
-
catch { /* swallow */ }
|
|
62
|
-
return true;
|
|
63
|
-
}
|
|
64
|
-
const accountCount = getSetSize(`account:${identifier}`);
|
|
65
|
-
if (accountCount >= accountMax) {
|
|
66
|
-
try {
|
|
67
|
-
_config.onDetected?.({ type: "account", key: identifier, count: accountCount });
|
|
68
|
-
}
|
|
69
|
-
catch { /* swallow */ }
|
|
70
|
-
return true;
|
|
71
|
-
}
|
|
72
|
-
return false;
|
|
73
|
-
}
|
|
74
|
-
/** Clear the in-memory store (for testing). */
|
|
75
|
-
export function clearCredentialStuffingStore() {
|
|
76
|
-
_store.clear();
|
|
77
|
-
}
|
package/dist/lib/crypto.d.ts
DELETED
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Constant-time string comparison to prevent timing attacks.
|
|
3
|
-
* Returns true if both strings are equal, false otherwise.
|
|
4
|
-
* Always compares the full length even on mismatch.
|
|
5
|
-
*/
|
|
6
|
-
export declare function timingSafeEqual(a: string, b: string): boolean;
|
|
7
|
-
/**
|
|
8
|
-
* SHA-256 hash a string and return the hex digest.
|
|
9
|
-
* Centralized to avoid duplicate implementations across modules.
|
|
10
|
-
*/
|
|
11
|
-
export declare function sha256(input: string): string;
|
package/dist/lib/crypto.js
DELETED
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
import { createHash, timingSafeEqual as nodeTimingSafeEqual } from "crypto";
|
|
2
|
-
/**
|
|
3
|
-
* Constant-time string comparison to prevent timing attacks.
|
|
4
|
-
* Returns true if both strings are equal, false otherwise.
|
|
5
|
-
* Always compares the full length even on mismatch.
|
|
6
|
-
*/
|
|
7
|
-
export function timingSafeEqual(a, b) {
|
|
8
|
-
if (a.length !== b.length) {
|
|
9
|
-
// Compare against self to burn the same time, then return false
|
|
10
|
-
const buf = Buffer.from(a, "utf-8");
|
|
11
|
-
nodeTimingSafeEqual(buf, buf);
|
|
12
|
-
return false;
|
|
13
|
-
}
|
|
14
|
-
return nodeTimingSafeEqual(Buffer.from(a, "utf-8"), Buffer.from(b, "utf-8"));
|
|
15
|
-
}
|
|
16
|
-
/**
|
|
17
|
-
* SHA-256 hash a string and return the hex digest.
|
|
18
|
-
* Centralized to avoid duplicate implementations across modules.
|
|
19
|
-
*/
|
|
20
|
-
export function sha256(input) {
|
|
21
|
-
return createHash("sha256").update(input).digest("hex");
|
|
22
|
-
}
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
type CancelStore = "redis" | "mongo" | "sqlite" | "memory";
|
|
2
|
-
export declare const setDeletionCancelTokenStore: (store: CancelStore) => void;
|
|
3
|
-
/** Create a cancel token. Returns the raw token (to embed in the cancel link).
|
|
4
|
-
* Only the SHA-256 hash is persisted. TTL is gracePeriod + a 5-minute buffer. */
|
|
5
|
-
export declare const createDeletionCancelToken: (userId: string, jobId: string, gracePeriodSeconds: number) => Promise<string>;
|
|
6
|
-
/** Atomically consume a cancel token — returns its payload and deletes it.
|
|
7
|
-
* Returns null if the token is invalid, expired, or already used. */
|
|
8
|
-
export declare const consumeDeletionCancelToken: (token: string) => Promise<{
|
|
9
|
-
userId: string;
|
|
10
|
-
jobId: string;
|
|
11
|
-
} | null>;
|
|
12
|
-
export {};
|
|
@@ -1,88 +0,0 @@
|
|
|
1
|
-
import { getRedis } from "./redis";
|
|
2
|
-
import { appConnection, mongoose } from "./mongo";
|
|
3
|
-
import { getAppName } from "./appConfig";
|
|
4
|
-
import { sqliteCreateDeletionCancelToken, sqliteConsumeDeletionCancelToken, } from "../adapters/sqliteAuth";
|
|
5
|
-
import { memoryCreateDeletionCancelToken, memoryConsumeDeletionCancelToken, } from "../adapters/memoryAuth";
|
|
6
|
-
import { sha256 as hashToken } from "./crypto";
|
|
7
|
-
function getCancelModel() {
|
|
8
|
-
if (appConnection.models["DeletionCancelToken"])
|
|
9
|
-
return appConnection.models["DeletionCancelToken"];
|
|
10
|
-
const { Schema } = mongoose;
|
|
11
|
-
const schema = new Schema({
|
|
12
|
-
token: { type: String, required: true, unique: true },
|
|
13
|
-
userId: { type: String, required: true },
|
|
14
|
-
jobId: { type: String, required: true },
|
|
15
|
-
expiresAt: { type: Date, required: true, index: { expireAfterSeconds: 0 } },
|
|
16
|
-
}, { collection: "deletion_cancel_tokens" });
|
|
17
|
-
return appConnection.model("DeletionCancelToken", schema);
|
|
18
|
-
}
|
|
19
|
-
// ---------------------------------------------------------------------------
|
|
20
|
-
// Redis helpers
|
|
21
|
-
// ---------------------------------------------------------------------------
|
|
22
|
-
async function redisGetDel(key) {
|
|
23
|
-
const redis = getRedis();
|
|
24
|
-
if (typeof redis.getdel === "function") {
|
|
25
|
-
try {
|
|
26
|
-
return await redis.getdel(key);
|
|
27
|
-
}
|
|
28
|
-
catch (err) {
|
|
29
|
-
const msg = err?.message ?? "";
|
|
30
|
-
if (!/unknown command|ERR unknown command/i.test(msg))
|
|
31
|
-
throw err;
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
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);
|
|
35
|
-
return result ?? null;
|
|
36
|
-
}
|
|
37
|
-
let _store = "redis";
|
|
38
|
-
export const setDeletionCancelTokenStore = (store) => { _store = store; };
|
|
39
|
-
// ---------------------------------------------------------------------------
|
|
40
|
-
// Public API
|
|
41
|
-
// ---------------------------------------------------------------------------
|
|
42
|
-
/** Create a cancel token. Returns the raw token (to embed in the cancel link).
|
|
43
|
-
* Only the SHA-256 hash is persisted. TTL is gracePeriod + a 5-minute buffer. */
|
|
44
|
-
export const createDeletionCancelToken = async (userId, jobId, gracePeriodSeconds) => {
|
|
45
|
-
const token = crypto.randomUUID();
|
|
46
|
-
const hash = hashToken(token);
|
|
47
|
-
const ttl = gracePeriodSeconds + 300; // 5-min buffer after grace period expires
|
|
48
|
-
if (_store === "memory") {
|
|
49
|
-
memoryCreateDeletionCancelToken(hash, userId, jobId, ttl);
|
|
50
|
-
return token;
|
|
51
|
-
}
|
|
52
|
-
if (_store === "sqlite") {
|
|
53
|
-
sqliteCreateDeletionCancelToken(hash, userId, jobId, ttl);
|
|
54
|
-
return token;
|
|
55
|
-
}
|
|
56
|
-
if (_store === "mongo") {
|
|
57
|
-
await getCancelModel().create({
|
|
58
|
-
token: hash,
|
|
59
|
-
userId,
|
|
60
|
-
jobId,
|
|
61
|
-
expiresAt: new Date(Date.now() + ttl * 1000),
|
|
62
|
-
});
|
|
63
|
-
return token;
|
|
64
|
-
}
|
|
65
|
-
await getRedis().set(`delcancel:${getAppName()}:${hash}`, JSON.stringify({ userId, jobId }), "EX", ttl);
|
|
66
|
-
return token;
|
|
67
|
-
};
|
|
68
|
-
/** Atomically consume a cancel token — returns its payload and deletes it.
|
|
69
|
-
* Returns null if the token is invalid, expired, or already used. */
|
|
70
|
-
export const consumeDeletionCancelToken = async (token) => {
|
|
71
|
-
const hash = hashToken(token);
|
|
72
|
-
if (_store === "memory")
|
|
73
|
-
return memoryConsumeDeletionCancelToken(hash);
|
|
74
|
-
if (_store === "sqlite")
|
|
75
|
-
return sqliteConsumeDeletionCancelToken(hash);
|
|
76
|
-
if (_store === "mongo") {
|
|
77
|
-
const doc = await getCancelModel()
|
|
78
|
-
.findOneAndDelete({ token: hash, expiresAt: { $gt: new Date() } })
|
|
79
|
-
.lean();
|
|
80
|
-
if (!doc)
|
|
81
|
-
return null;
|
|
82
|
-
return { userId: doc.userId, jobId: doc.jobId };
|
|
83
|
-
}
|
|
84
|
-
const raw = await redisGetDel(`delcancel:${getAppName()}:${hash}`);
|
|
85
|
-
if (!raw)
|
|
86
|
-
return null;
|
|
87
|
-
return JSON.parse(raw);
|
|
88
|
-
};
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
type VerificationStore = "redis" | "mongo" | "sqlite" | "memory";
|
|
2
|
-
export declare const setEmailVerificationStore: (store: VerificationStore) => void;
|
|
3
|
-
/** Create a verification token. Returns the raw token (for the email link).
|
|
4
|
-
* Only the SHA-256 hash is persisted in the store. */
|
|
5
|
-
export declare const createVerificationToken: (userId: string, email: string) => Promise<string>;
|
|
6
|
-
/** Look up a verification token by its raw value. Hashes before lookup. */
|
|
7
|
-
export declare const getVerificationToken: (token: string) => Promise<{
|
|
8
|
-
userId: string;
|
|
9
|
-
email: string;
|
|
10
|
-
} | null>;
|
|
11
|
-
/** Delete a verification token by its raw value. Hashes before lookup. */
|
|
12
|
-
export declare const deleteVerificationToken: (token: string) => Promise<void>;
|
|
13
|
-
/** Atomically consume a verification token — returns its payload and deletes it in one operation.
|
|
14
|
-
* Returns null if the token is invalid, expired, or already used. */
|
|
15
|
-
export declare const consumeVerificationToken: (token: string) => Promise<{
|
|
16
|
-
userId: string;
|
|
17
|
-
email: string;
|
|
18
|
-
} | null>;
|
|
19
|
-
export {};
|
|
@@ -1,129 +0,0 @@
|
|
|
1
|
-
import { getRedis } from "./redis";
|
|
2
|
-
import { appConnection, mongoose } from "./mongo";
|
|
3
|
-
import { getAppName, getTokenExpiry } from "./appConfig";
|
|
4
|
-
import { sha256 } from "./crypto";
|
|
5
|
-
import { sqliteCreateVerificationToken, sqliteGetVerificationToken, sqliteDeleteVerificationToken, sqliteConsumeVerificationToken, } from "../adapters/sqliteAuth";
|
|
6
|
-
import { memoryCreateVerificationToken, memoryGetVerificationToken, memoryDeleteVerificationToken, memoryConsumeVerificationToken, } from "../adapters/memoryAuth";
|
|
7
|
-
function getVerificationModel() {
|
|
8
|
-
if (appConnection.models["EmailVerification"])
|
|
9
|
-
return appConnection.models["EmailVerification"];
|
|
10
|
-
const { Schema } = mongoose;
|
|
11
|
-
const verificationSchema = new Schema({
|
|
12
|
-
token: { type: String, required: true, unique: true },
|
|
13
|
-
userId: { type: String, required: true },
|
|
14
|
-
email: { type: String, required: true },
|
|
15
|
-
expiresAt: { type: Date, required: true, index: { expireAfterSeconds: 0 } },
|
|
16
|
-
}, { collection: "email_verifications" });
|
|
17
|
-
return appConnection.model("EmailVerification", verificationSchema);
|
|
18
|
-
}
|
|
19
|
-
// ---------------------------------------------------------------------------
|
|
20
|
-
// Redis helpers
|
|
21
|
-
// ---------------------------------------------------------------------------
|
|
22
|
-
/** Atomically GET+DEL a key. Uses native GETDEL (Redis >= 6.2) with a Lua fallback. */
|
|
23
|
-
async function redisGetDel(key) {
|
|
24
|
-
const redis = getRedis();
|
|
25
|
-
if (typeof redis.getdel === "function") {
|
|
26
|
-
try {
|
|
27
|
-
return await redis.getdel(key);
|
|
28
|
-
}
|
|
29
|
-
catch (err) {
|
|
30
|
-
const msg = err?.message ?? "";
|
|
31
|
-
if (!/unknown command|ERR unknown command/i.test(msg))
|
|
32
|
-
throw err;
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
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);
|
|
36
|
-
return result ?? null;
|
|
37
|
-
}
|
|
38
|
-
let _store = "redis";
|
|
39
|
-
export const setEmailVerificationStore = (store) => { _store = store; };
|
|
40
|
-
// ---------------------------------------------------------------------------
|
|
41
|
-
// Public API
|
|
42
|
-
// ---------------------------------------------------------------------------
|
|
43
|
-
/** Create a verification token. Returns the raw token (for the email link).
|
|
44
|
-
* Only the SHA-256 hash is persisted in the store. */
|
|
45
|
-
export const createVerificationToken = async (userId, email) => {
|
|
46
|
-
const bytes = new Uint8Array(32);
|
|
47
|
-
crypto.getRandomValues(bytes);
|
|
48
|
-
const token = Buffer.from(bytes).toString("base64url");
|
|
49
|
-
const hash = sha256(token);
|
|
50
|
-
const ttl = getTokenExpiry();
|
|
51
|
-
if (_store === "memory") {
|
|
52
|
-
memoryCreateVerificationToken(hash, userId, email, ttl);
|
|
53
|
-
return token;
|
|
54
|
-
}
|
|
55
|
-
if (_store === "sqlite") {
|
|
56
|
-
sqliteCreateVerificationToken(hash, userId, email, ttl);
|
|
57
|
-
return token;
|
|
58
|
-
}
|
|
59
|
-
if (_store === "mongo") {
|
|
60
|
-
await getVerificationModel().create({
|
|
61
|
-
token: hash,
|
|
62
|
-
userId,
|
|
63
|
-
email,
|
|
64
|
-
expiresAt: new Date(Date.now() + ttl * 1000),
|
|
65
|
-
});
|
|
66
|
-
return token;
|
|
67
|
-
}
|
|
68
|
-
await getRedis().set(`verify:${getAppName()}:${hash}`, JSON.stringify({ userId, email }), "EX", ttl);
|
|
69
|
-
return token;
|
|
70
|
-
};
|
|
71
|
-
/** Look up a verification token by its raw value. Hashes before lookup. */
|
|
72
|
-
export const getVerificationToken = async (token) => {
|
|
73
|
-
const hash = sha256(token);
|
|
74
|
-
if (_store === "memory")
|
|
75
|
-
return memoryGetVerificationToken(hash);
|
|
76
|
-
if (_store === "sqlite")
|
|
77
|
-
return sqliteGetVerificationToken(hash);
|
|
78
|
-
if (_store === "mongo") {
|
|
79
|
-
const doc = await getVerificationModel()
|
|
80
|
-
.findOne({ token: hash, expiresAt: { $gt: new Date() } })
|
|
81
|
-
.lean();
|
|
82
|
-
if (!doc)
|
|
83
|
-
return null;
|
|
84
|
-
return { userId: doc.userId, email: doc.email };
|
|
85
|
-
}
|
|
86
|
-
const raw = await getRedis().get(`verify:${getAppName()}:${hash}`);
|
|
87
|
-
if (!raw)
|
|
88
|
-
return null;
|
|
89
|
-
return JSON.parse(raw);
|
|
90
|
-
};
|
|
91
|
-
/** Delete a verification token by its raw value. Hashes before lookup. */
|
|
92
|
-
export const deleteVerificationToken = async (token) => {
|
|
93
|
-
const hash = sha256(token);
|
|
94
|
-
if (_store === "memory") {
|
|
95
|
-
memoryDeleteVerificationToken(hash);
|
|
96
|
-
return;
|
|
97
|
-
}
|
|
98
|
-
if (_store === "sqlite") {
|
|
99
|
-
sqliteDeleteVerificationToken(hash);
|
|
100
|
-
return;
|
|
101
|
-
}
|
|
102
|
-
if (_store === "mongo") {
|
|
103
|
-
await getVerificationModel().deleteOne({ token: hash });
|
|
104
|
-
return;
|
|
105
|
-
}
|
|
106
|
-
await getRedis().del(`verify:${getAppName()}:${hash}`);
|
|
107
|
-
};
|
|
108
|
-
/** Atomically consume a verification token — returns its payload and deletes it in one operation.
|
|
109
|
-
* Returns null if the token is invalid, expired, or already used. */
|
|
110
|
-
export const consumeVerificationToken = async (token) => {
|
|
111
|
-
const hash = sha256(token);
|
|
112
|
-
if (_store === "memory")
|
|
113
|
-
return memoryConsumeVerificationToken(hash);
|
|
114
|
-
if (_store === "sqlite")
|
|
115
|
-
return sqliteConsumeVerificationToken(hash);
|
|
116
|
-
if (_store === "mongo") {
|
|
117
|
-
const doc = await getVerificationModel()
|
|
118
|
-
.findOneAndDelete({ token: hash, expiresAt: { $gt: new Date() } })
|
|
119
|
-
.lean();
|
|
120
|
-
if (!doc)
|
|
121
|
-
return null;
|
|
122
|
-
return { userId: doc.userId, email: doc.email };
|
|
123
|
-
}
|
|
124
|
-
// Redis: atomically return and remove the key (GETDEL or Lua fallback)
|
|
125
|
-
const raw = await redisGetDel(`verify:${getAppName()}:${hash}`);
|
|
126
|
-
if (!raw)
|
|
127
|
-
return null;
|
|
128
|
-
return JSON.parse(raw);
|
|
129
|
-
};
|
package/dist/lib/fingerprint.js
DELETED
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
const BROWSER_HEADERS = [
|
|
2
|
-
"sec-fetch-site",
|
|
3
|
-
"sec-fetch-mode",
|
|
4
|
-
"sec-fetch-dest",
|
|
5
|
-
"sec-ch-ua",
|
|
6
|
-
"sec-ch-ua-mobile",
|
|
7
|
-
"sec-ch-ua-platform",
|
|
8
|
-
"origin",
|
|
9
|
-
"referer",
|
|
10
|
-
"x-requested-with",
|
|
11
|
-
];
|
|
12
|
-
const encoder = new TextEncoder();
|
|
13
|
-
/**
|
|
14
|
-
* Builds a 12-hex-char fingerprint from stable HTTP headers.
|
|
15
|
-
* IP-independent: bots that rotate IPs but use the same HTTP client
|
|
16
|
-
* will produce the same fingerprint and share a rate-limit bucket.
|
|
17
|
-
*/
|
|
18
|
-
export async function buildFingerprint(req) {
|
|
19
|
-
const h = (name) => req.headers.get(name) ?? "";
|
|
20
|
-
// Encode which browser-only headers are present as a bitmask string.
|
|
21
|
-
// Real browsers send most of these; raw HTTP clients send none.
|
|
22
|
-
const bitmap = BROWSER_HEADERS.map((name) => req.headers.has(name) ? "1" : "0").join("");
|
|
23
|
-
const raw = [
|
|
24
|
-
h("user-agent"),
|
|
25
|
-
h("accept"),
|
|
26
|
-
h("accept-language"),
|
|
27
|
-
h("accept-encoding"),
|
|
28
|
-
h("connection"),
|
|
29
|
-
bitmap,
|
|
30
|
-
].join("|");
|
|
31
|
-
const buf = await crypto.subtle.digest("SHA-256", encoder.encode(raw));
|
|
32
|
-
const bytes = new Uint8Array(buf).slice(0, 6);
|
|
33
|
-
return Array.from(bytes)
|
|
34
|
-
.map((b) => b.toString(16).padStart(2, "0"))
|
|
35
|
-
.join("");
|
|
36
|
-
}
|
package/dist/lib/idempotency.js
DELETED
|
@@ -1,182 +0,0 @@
|
|
|
1
|
-
import { getRedis } from "./redis";
|
|
2
|
-
import { appConnection, mongoose } from "./mongo";
|
|
3
|
-
import { getAppName } from "./appConfig";
|
|
4
|
-
import { getSigningConfig, getSigningSecret } from "./appConfig";
|
|
5
|
-
import { hmacSign } from "./signing";
|
|
6
|
-
import { HEADER_IDEMPOTENCY_KEY } from "./constants";
|
|
7
|
-
let _store = "redis";
|
|
8
|
-
export const setIdempotencyStore = (store) => { _store = store; };
|
|
9
|
-
// ---------------------------------------------------------------------------
|
|
10
|
-
// Memory store (tests only — no TTL eviction)
|
|
11
|
-
// ---------------------------------------------------------------------------
|
|
12
|
-
const _memory = new Map();
|
|
13
|
-
export const clearIdempotencyMemoryStore = () => _memory.clear();
|
|
14
|
-
function getIdempotencyModel() {
|
|
15
|
-
if (appConnection.models["Idempotency"])
|
|
16
|
-
return appConnection.models["Idempotency"];
|
|
17
|
-
const { Schema } = mongoose;
|
|
18
|
-
const schema = new Schema({
|
|
19
|
-
key: { type: String, required: true, unique: true },
|
|
20
|
-
status: { type: Number, required: true },
|
|
21
|
-
body: { type: String, required: true },
|
|
22
|
-
createdAt: { type: Date, required: true },
|
|
23
|
-
expiresAt: { type: Date, required: true, index: { expireAfterSeconds: 0 } },
|
|
24
|
-
}, { collection: "idempotency" });
|
|
25
|
-
return appConnection.model("Idempotency", schema);
|
|
26
|
-
}
|
|
27
|
-
// ---------------------------------------------------------------------------
|
|
28
|
-
// SQLite helpers (lazy — only available when bun:sqlite is in use)
|
|
29
|
-
// ---------------------------------------------------------------------------
|
|
30
|
-
function getSqliteDb() {
|
|
31
|
-
const { getDb } = require("../adapters/sqliteAuth");
|
|
32
|
-
return getDb();
|
|
33
|
-
}
|
|
34
|
-
function sqliteEnsureTable() {
|
|
35
|
-
const db = getSqliteDb();
|
|
36
|
-
db.run(`CREATE TABLE IF NOT EXISTS idempotency (
|
|
37
|
-
key TEXT PRIMARY KEY,
|
|
38
|
-
status INTEGER NOT NULL,
|
|
39
|
-
body TEXT NOT NULL,
|
|
40
|
-
createdAt INTEGER NOT NULL,
|
|
41
|
-
expiresAt INTEGER NOT NULL
|
|
42
|
-
)`);
|
|
43
|
-
}
|
|
44
|
-
// ---------------------------------------------------------------------------
|
|
45
|
-
// Key derivation
|
|
46
|
-
// ---------------------------------------------------------------------------
|
|
47
|
-
function deriveKey(rawKey, userId) {
|
|
48
|
-
const prefix = userId ?? "anon";
|
|
49
|
-
const cfg = getSigningConfig();
|
|
50
|
-
if (cfg?.idempotencyKeys) {
|
|
51
|
-
const secret = getSigningSecret();
|
|
52
|
-
if (secret) {
|
|
53
|
-
return `${prefix}:${hmacSign(rawKey, secret)}`;
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
return `${prefix}:${rawKey}`;
|
|
57
|
-
}
|
|
58
|
-
function redisIdempotencyKey(key) {
|
|
59
|
-
return `idempotency:${getAppName()}:${key}`;
|
|
60
|
-
}
|
|
61
|
-
// ---------------------------------------------------------------------------
|
|
62
|
-
// Store operations
|
|
63
|
-
// ---------------------------------------------------------------------------
|
|
64
|
-
async function getRecord(key) {
|
|
65
|
-
if (_store === "memory") {
|
|
66
|
-
return _memory.get(key) ?? null;
|
|
67
|
-
}
|
|
68
|
-
if (_store === "sqlite") {
|
|
69
|
-
sqliteEnsureTable();
|
|
70
|
-
const row = getSqliteDb().query("SELECT status, body, createdAt FROM idempotency WHERE key = ? AND expiresAt > ?").get(key, Date.now());
|
|
71
|
-
return row ? { status: row.status, body: row.body, createdAt: row.createdAt } : null;
|
|
72
|
-
}
|
|
73
|
-
if (_store === "redis") {
|
|
74
|
-
const raw = await getRedis().get(redisIdempotencyKey(key));
|
|
75
|
-
if (!raw)
|
|
76
|
-
return null;
|
|
77
|
-
return JSON.parse(raw);
|
|
78
|
-
}
|
|
79
|
-
// mongo
|
|
80
|
-
const doc = await getIdempotencyModel()
|
|
81
|
-
.findOne({ key, expiresAt: { $gt: new Date() } }, "status body createdAt")
|
|
82
|
-
.lean();
|
|
83
|
-
return doc ? { status: doc.status, body: doc.body, createdAt: doc.createdAt.getTime() } : null;
|
|
84
|
-
}
|
|
85
|
-
/**
|
|
86
|
-
* Attempt to store a record. Returns true if stored, false if a record
|
|
87
|
-
* already exists (write collision — treat as cache hit).
|
|
88
|
-
*/
|
|
89
|
-
async function tryStoreRecord(key, record, ttl) {
|
|
90
|
-
if (_store === "memory") {
|
|
91
|
-
if (_memory.has(key))
|
|
92
|
-
return false;
|
|
93
|
-
_memory.set(key, record);
|
|
94
|
-
return true;
|
|
95
|
-
}
|
|
96
|
-
if (_store === "sqlite") {
|
|
97
|
-
sqliteEnsureTable();
|
|
98
|
-
const db = getSqliteDb();
|
|
99
|
-
const expiresAt = record.createdAt + ttl * 1000;
|
|
100
|
-
db.run("INSERT OR IGNORE INTO idempotency (key, status, body, createdAt, expiresAt) VALUES (?, ?, ?, ?, ?)", [key, record.status, record.body, record.createdAt, expiresAt]);
|
|
101
|
-
// SQLite INSERT OR IGNORE doesn't throw on conflict; check changes count
|
|
102
|
-
const changes = db.query("SELECT changes() as changes").get()?.changes ?? 0;
|
|
103
|
-
return changes > 0;
|
|
104
|
-
}
|
|
105
|
-
if (_store === "redis") {
|
|
106
|
-
// SET NX: set-if-not-exists — second concurrent writer gets a no-op
|
|
107
|
-
const value = JSON.stringify(record);
|
|
108
|
-
const result = await getRedis().set(redisIdempotencyKey(key), value, "EX", ttl, "NX");
|
|
109
|
-
return result === "OK";
|
|
110
|
-
}
|
|
111
|
-
// mongo — unique index on key; second writer catches duplicate key error
|
|
112
|
-
try {
|
|
113
|
-
const now = new Date(record.createdAt);
|
|
114
|
-
await getIdempotencyModel().create({
|
|
115
|
-
key,
|
|
116
|
-
status: record.status,
|
|
117
|
-
body: record.body,
|
|
118
|
-
createdAt: now,
|
|
119
|
-
expiresAt: new Date(now.getTime() + ttl * 1000),
|
|
120
|
-
});
|
|
121
|
-
return true;
|
|
122
|
-
}
|
|
123
|
-
catch (err) {
|
|
124
|
-
// Duplicate key — another concurrent request already stored the result
|
|
125
|
-
if (err?.code === 11000 || err?.code === "11000")
|
|
126
|
-
return false;
|
|
127
|
-
throw err;
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
// ---------------------------------------------------------------------------
|
|
131
|
-
// Middleware factory
|
|
132
|
-
// ---------------------------------------------------------------------------
|
|
133
|
-
/**
|
|
134
|
-
* Idempotency middleware. Reads the `Idempotency-Key` header and returns a
|
|
135
|
-
* cached response if one exists for this user + key combination. Otherwise
|
|
136
|
-
* calls the next handler, stores the response, and returns it.
|
|
137
|
-
*
|
|
138
|
-
* On write collision (two concurrent identical requests), the second request
|
|
139
|
-
* re-reads and returns the first-stored result.
|
|
140
|
-
*
|
|
141
|
-
* When `signing.idempotencyKeys: true`, keys are HMAC'd before storage to
|
|
142
|
-
* prevent enumeration. When off, raw keys are stored (slight enumeration risk).
|
|
143
|
-
*/
|
|
144
|
-
export const idempotent = (opts) => async (c, next) => {
|
|
145
|
-
const rawKey = c.req.header(HEADER_IDEMPOTENCY_KEY);
|
|
146
|
-
if (!rawKey) {
|
|
147
|
-
await next();
|
|
148
|
-
return;
|
|
149
|
-
}
|
|
150
|
-
const userId = c.get("authUserId") ?? null;
|
|
151
|
-
const key = deriveKey(rawKey, userId);
|
|
152
|
-
const ttl = opts?.ttl ?? 86400;
|
|
153
|
-
// Cache hit — return stored response
|
|
154
|
-
const cached = await getRecord(key);
|
|
155
|
-
if (cached) {
|
|
156
|
-
return c.json(JSON.parse(cached.body), cached.status);
|
|
157
|
-
}
|
|
158
|
-
// Cache miss — call handler
|
|
159
|
-
await next();
|
|
160
|
-
// Capture the response body by reading it
|
|
161
|
-
const status = c.res.status;
|
|
162
|
-
let body = "";
|
|
163
|
-
try {
|
|
164
|
-
body = await c.res.clone().text();
|
|
165
|
-
}
|
|
166
|
-
catch {
|
|
167
|
-
// Non-text/non-json response — skip caching
|
|
168
|
-
return;
|
|
169
|
-
}
|
|
170
|
-
const record = { status, body, createdAt: Date.now() };
|
|
171
|
-
const stored = await tryStoreRecord(key, record, ttl);
|
|
172
|
-
if (!stored) {
|
|
173
|
-
// Write collision — return the first-stored result
|
|
174
|
-
const winner = await getRecord(key);
|
|
175
|
-
if (winner) {
|
|
176
|
-
c.res = new Response(winner.body, {
|
|
177
|
-
status: winner.status,
|
|
178
|
-
headers: { "content-type": "application/json" },
|
|
179
|
-
});
|
|
180
|
-
}
|
|
181
|
-
}
|
|
182
|
-
};
|
package/dist/lib/jwks.d.ts
DELETED
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
import { type JWK } from "jose";
|
|
2
|
-
export interface JwksKeyConfig {
|
|
3
|
-
privateKey: string;
|
|
4
|
-
publicKey: string;
|
|
5
|
-
kid?: string;
|
|
6
|
-
}
|
|
7
|
-
type KeyMaterial = CryptoKey;
|
|
8
|
-
export declare function loadJwksKey(config: JwksKeyConfig): Promise<void>;
|
|
9
|
-
export declare function loadPreviousKey(config: {
|
|
10
|
-
publicKey: string;
|
|
11
|
-
kid?: string;
|
|
12
|
-
}): Promise<void>;
|
|
13
|
-
export declare function generateAndLoadKeyPair(): Promise<{
|
|
14
|
-
privateKey: string;
|
|
15
|
-
publicKey: string;
|
|
16
|
-
}>;
|
|
17
|
-
export declare function getSigningPrivateKey(): KeyMaterial;
|
|
18
|
-
export declare function getVerifyPublicKeys(): KeyMaterial[];
|
|
19
|
-
export declare function getJwks(): {
|
|
20
|
-
keys: JWK[];
|
|
21
|
-
};
|
|
22
|
-
export declare function isJwksLoaded(): boolean;
|
|
23
|
-
/** @internal — reset for tests */
|
|
24
|
-
export declare function _resetJwksState(): void;
|
|
25
|
-
export {};
|
package/dist/lib/jwks.js
DELETED
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
import { generateKeyPair, exportJWK, importPKCS8, importSPKI } from "jose";
|
|
2
|
-
let _primaryKey = null;
|
|
3
|
-
let _previousKeys = [];
|
|
4
|
-
export async function loadJwksKey(config) {
|
|
5
|
-
const kid = config.kid ?? "key-1";
|
|
6
|
-
const privateKey = await importPKCS8(config.privateKey, "RS256");
|
|
7
|
-
const publicKey = await importSPKI(config.publicKey, "RS256");
|
|
8
|
-
const jwk = await exportJWK(publicKey);
|
|
9
|
-
_primaryKey = { privateKey, publicKey, jwk: { ...jwk, kid, alg: "RS256", use: "sig" }, kid };
|
|
10
|
-
}
|
|
11
|
-
export async function loadPreviousKey(config) {
|
|
12
|
-
const kid = config.kid ?? `key-prev-${_previousKeys.length + 1}`;
|
|
13
|
-
const publicKey = await importSPKI(config.publicKey, "RS256");
|
|
14
|
-
const jwk = await exportJWK(publicKey);
|
|
15
|
-
_previousKeys.push({ privateKey: null, publicKey, jwk: { ...jwk, kid, alg: "RS256", use: "sig" }, kid });
|
|
16
|
-
}
|
|
17
|
-
export async function generateAndLoadKeyPair() {
|
|
18
|
-
const { privateKey: pk, publicKey: pubk } = await generateKeyPair("RS256", { modulusLength: 2048, extractable: true });
|
|
19
|
-
const { exportSPKI, exportPKCS8 } = await import("jose");
|
|
20
|
-
const privatePem = await exportPKCS8(pk);
|
|
21
|
-
const publicPem = await exportSPKI(pubk);
|
|
22
|
-
await loadJwksKey({ privateKey: privatePem, publicKey: publicPem, kid: "key-1" });
|
|
23
|
-
return { privateKey: privatePem, publicKey: publicPem };
|
|
24
|
-
}
|
|
25
|
-
export function getSigningPrivateKey() {
|
|
26
|
-
if (!_primaryKey)
|
|
27
|
-
throw new Error("RS256 requires OIDC key configuration — call loadJwksKey() first");
|
|
28
|
-
return _primaryKey.privateKey;
|
|
29
|
-
}
|
|
30
|
-
export function getVerifyPublicKeys() {
|
|
31
|
-
const keys = [];
|
|
32
|
-
if (_primaryKey)
|
|
33
|
-
keys.push(_primaryKey.publicKey);
|
|
34
|
-
keys.push(..._previousKeys.map((k) => k.publicKey));
|
|
35
|
-
return keys;
|
|
36
|
-
}
|
|
37
|
-
export function getJwks() {
|
|
38
|
-
const keys = [];
|
|
39
|
-
if (_primaryKey)
|
|
40
|
-
keys.push(_primaryKey.jwk);
|
|
41
|
-
keys.push(..._previousKeys.map((k) => k.jwk));
|
|
42
|
-
return { keys };
|
|
43
|
-
}
|
|
44
|
-
export function isJwksLoaded() {
|
|
45
|
-
return _primaryKey !== null;
|
|
46
|
-
}
|
|
47
|
-
/** @internal — reset for tests */
|
|
48
|
-
export function _resetJwksState() {
|
|
49
|
-
_primaryKey = null;
|
|
50
|
-
_previousKeys = [];
|
|
51
|
-
}
|
package/dist/lib/jwt.d.ts
DELETED
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import type { JWTPayload } from "jose";
|
|
2
|
-
export declare function validateJwtSecrets(): void;
|
|
3
|
-
export type TokenClaims = {
|
|
4
|
-
sub: string;
|
|
5
|
-
sid?: string;
|
|
6
|
-
scope?: string;
|
|
7
|
-
[key: string]: unknown;
|
|
8
|
-
};
|
|
9
|
-
export declare function signToken(claims: TokenClaims, expirySeconds?: number): Promise<string>;
|
|
10
|
-
export declare function signToken(userId: string, sessionId: string, expirySeconds?: number): Promise<string>;
|
|
11
|
-
export declare const verifyToken: (token: string) => Promise<JWTPayload>;
|
|
12
|
-
/** @internal — used by Feature 8 (OIDC) to switch to RS256 once key material is loaded */
|
|
13
|
-
export declare function _setAlgorithm(alg: string): void;
|
|
14
|
-
/** @internal — reset for testing */
|
|
15
|
-
export declare function _resetJwtState(): void;
|