@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,28 +1,35 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
let defaultRole = null;
|
|
1
|
+
// Auth-specific runtime configuration singletons.
|
|
2
|
+
// Framework-only config (appName, appRoles, corsConfig, etc.) stays in appConfig.ts.
|
|
4
3
|
let _primaryField = "email";
|
|
5
|
-
let _emailVerificationConfig = null;
|
|
6
|
-
let _passwordResetConfig = null;
|
|
7
|
-
let _passwordPolicy = {};
|
|
8
|
-
export const setAppName = (name) => { appName = name; };
|
|
9
|
-
export const getAppName = () => appName;
|
|
10
|
-
export const setAppRoles = (roles) => { appRoles = roles; };
|
|
11
|
-
export const getAppRoles = () => appRoles;
|
|
12
|
-
export const setDefaultRole = (role) => { defaultRole = role; };
|
|
13
|
-
export const getDefaultRole = () => defaultRole;
|
|
14
4
|
export const setPrimaryField = (field) => { _primaryField = field; };
|
|
15
5
|
export const getPrimaryField = () => _primaryField;
|
|
6
|
+
let _concealRegistrationConfig = null;
|
|
7
|
+
export const setConcealRegistrationConfig = (config) => { _concealRegistrationConfig = config; };
|
|
8
|
+
export const getConcealRegistrationConfig = () => _concealRegistrationConfig;
|
|
9
|
+
let _emailVerificationConfig = null;
|
|
16
10
|
export const setEmailVerificationConfig = (config) => { _emailVerificationConfig = config; };
|
|
17
11
|
export const getEmailVerificationConfig = () => _emailVerificationConfig;
|
|
18
12
|
const DEFAULT_TOKEN_EXPIRY = 60 * 60 * 24; // 24 hours
|
|
19
13
|
export const getTokenExpiry = () => _emailVerificationConfig?.tokenExpiry ?? DEFAULT_TOKEN_EXPIRY;
|
|
14
|
+
let _passwordResetConfig = null;
|
|
20
15
|
export const setPasswordResetConfig = (config) => { _passwordResetConfig = config; };
|
|
21
16
|
export const getPasswordResetConfig = () => _passwordResetConfig;
|
|
22
|
-
export const setPasswordPolicy = (config) => { _passwordPolicy = config; };
|
|
23
|
-
export const getPasswordPolicy = () => _passwordPolicy;
|
|
24
17
|
const DEFAULT_RESET_TOKEN_EXPIRY = 60 * 60; // 1 hour
|
|
25
18
|
export const getResetTokenExpiry = () => _passwordResetConfig?.tokenExpiry ?? DEFAULT_RESET_TOKEN_EXPIRY;
|
|
19
|
+
let _magicLinkConfig = null;
|
|
20
|
+
export const setMagicLinkConfig = (config) => { _magicLinkConfig = config; };
|
|
21
|
+
export const getMagicLinkConfig = () => _magicLinkConfig;
|
|
22
|
+
export const getMagicLinkTtl = () => _magicLinkConfig?.ttlSeconds ?? 900;
|
|
23
|
+
let _passwordPolicy = {};
|
|
24
|
+
export const setPasswordPolicy = (config) => { _passwordPolicy = config; };
|
|
25
|
+
export const getPasswordPolicy = () => _passwordPolicy;
|
|
26
|
+
export const getPasswordPolicyPreventReuse = () => _passwordPolicy.preventReuse ?? 0;
|
|
27
|
+
let _authCookieConfig = {};
|
|
28
|
+
let _csrfCookieConfig = {};
|
|
29
|
+
export function setAuthCookieConfig(c) { _authCookieConfig = c; }
|
|
30
|
+
export function getAuthCookieConfig() { return _authCookieConfig; }
|
|
31
|
+
export function setCsrfCookieConfig(c) { _csrfCookieConfig = c; }
|
|
32
|
+
export function getCsrfCookieConfig() { return _csrfCookieConfig; }
|
|
26
33
|
// ---------------------------------------------------------------------------
|
|
27
34
|
// Session policy
|
|
28
35
|
// ---------------------------------------------------------------------------
|
|
@@ -30,6 +37,7 @@ let _maxSessions = 6;
|
|
|
30
37
|
let _persistSessionMetadata = true;
|
|
31
38
|
let _includeInactiveSessions = false;
|
|
32
39
|
let _trackLastActive = false;
|
|
40
|
+
let _sessionPolicyConfig = {};
|
|
33
41
|
export const setMaxSessions = (n) => { _maxSessions = Number.isFinite(n) && n >= 1 ? Math.floor(n) : 1; };
|
|
34
42
|
export const getMaxSessions = () => _maxSessions;
|
|
35
43
|
export const setPersistSessionMetadata = (v) => { _persistSessionMetadata = v; };
|
|
@@ -38,6 +46,8 @@ export const setIncludeInactiveSessions = (v) => { _includeInactiveSessions = v;
|
|
|
38
46
|
export const getIncludeInactiveSessions = () => _includeInactiveSessions;
|
|
39
47
|
export const setTrackLastActive = (v) => { _trackLastActive = v; };
|
|
40
48
|
export const getTrackLastActive = () => _trackLastActive;
|
|
49
|
+
export function setSessionPolicyConfig(p) { _sessionPolicyConfig = p; }
|
|
50
|
+
export function getSessionPolicyConfig() { return _sessionPolicyConfig; }
|
|
41
51
|
let _refreshTokenConfig = null;
|
|
42
52
|
export const setRefreshTokenConfig = (config) => { _refreshTokenConfig = config; };
|
|
43
53
|
export const getRefreshTokenConfig = () => _refreshTokenConfig;
|
|
@@ -50,6 +60,11 @@ export const getRotationGraceSeconds = () => _refreshTokenConfig?.rotationGraceS
|
|
|
50
60
|
let _mfaConfig = null;
|
|
51
61
|
export const setMfaConfig = (config) => { _mfaConfig = config; };
|
|
52
62
|
export const getMfaConfig = () => _mfaConfig;
|
|
63
|
+
// getMfaIssuer is defined after the getAppName import below
|
|
64
|
+
// ---------------------------------------------------------------------------
|
|
65
|
+
// Forward reference: getAppName lives in appConfig.ts
|
|
66
|
+
// ---------------------------------------------------------------------------
|
|
67
|
+
import { getAppName } from "./appConfig";
|
|
53
68
|
export const getMfaIssuer = () => _mfaConfig?.issuer ?? getAppName();
|
|
54
69
|
export const getMfaAlgorithm = () => _mfaConfig?.algorithm ?? "SHA1";
|
|
55
70
|
export const getMfaDigits = () => _mfaConfig?.digits ?? 6;
|
|
@@ -69,11 +84,16 @@ let _csrfEnabled = false;
|
|
|
69
84
|
export const setCsrfEnabled = (v) => { _csrfEnabled = v; };
|
|
70
85
|
export const getCsrfEnabled = () => _csrfEnabled;
|
|
71
86
|
let _signingConfig = null;
|
|
72
|
-
|
|
87
|
+
let _signingConfigured = false;
|
|
88
|
+
export const setSigningConfig = (config) => {
|
|
89
|
+
_signingConfig = config;
|
|
90
|
+
_signingConfigured = true;
|
|
91
|
+
};
|
|
73
92
|
export const getSigningConfig = () => _signingConfig;
|
|
93
|
+
export const isSigningConfigured = () => _signingConfigured;
|
|
74
94
|
/**
|
|
75
|
-
* Returns the active signing secret: signing.secret
|
|
76
|
-
* Returns null when neither is configured
|
|
95
|
+
* Returns the active signing secret: signing.secret -> JWT_SECRET_PROD/DEV env var.
|
|
96
|
+
* Returns null when neither is configured - callers must handle this gracefully.
|
|
77
97
|
*/
|
|
78
98
|
export const getSigningSecret = () => {
|
|
79
99
|
if (_signingConfig?.secret)
|
|
@@ -91,6 +111,11 @@ export const getJwtAudience = () => _jwtConfig?.audience;
|
|
|
91
111
|
let _breachedPasswordConfig = null;
|
|
92
112
|
export const setBreachedPasswordConfig = (config) => { _breachedPasswordConfig = config; };
|
|
93
113
|
export const getBreachedPasswordConfig = () => _breachedPasswordConfig;
|
|
114
|
+
let _oauthReauthConfig = null;
|
|
115
|
+
export const setOAuthReauthConfig = (config) => { _oauthReauthConfig = config; };
|
|
116
|
+
export const getOAuthReauthConfig = () => _oauthReauthConfig;
|
|
117
|
+
export const getOAuthReauthEnabled = () => _oauthReauthConfig?.enabled ?? false;
|
|
118
|
+
export const getOAuthReauthPromptType = () => _oauthReauthConfig?.promptType ?? "login";
|
|
94
119
|
let _stepUpConfig = null;
|
|
95
120
|
export const setStepUpConfig = (config) => { _stepUpConfig = config; };
|
|
96
121
|
export const getStepUpConfig = () => _stepUpConfig;
|
|
@@ -119,3 +144,36 @@ export const getOidcConfig = () => _oidcConfig;
|
|
|
119
144
|
let _scimConfig = null;
|
|
120
145
|
export const setScimConfig = (config) => { _scimConfig = config; };
|
|
121
146
|
export const getScimConfig = () => _scimConfig;
|
|
147
|
+
let _emailTemplatesConfig = null;
|
|
148
|
+
export const setEmailTemplatesConfig = (config) => { _emailTemplatesConfig = config; };
|
|
149
|
+
export const getEmailTemplatesConfig = () => _emailTemplatesConfig;
|
|
150
|
+
let _hooks = {};
|
|
151
|
+
export function setHooksConfig(h) { _hooks = h; }
|
|
152
|
+
export function getHooksConfig() { return _hooks; }
|
|
153
|
+
/**
|
|
154
|
+
* Parse data encryption keys from the BUNSHOT_DATA_ENCRYPTION_KEY env var.
|
|
155
|
+
* Env var format: comma-separated "keyId:base64key" pairs, first is active.
|
|
156
|
+
* Example: "v1:base64key1,v0:base64key0"
|
|
157
|
+
* Respects DEV/PROD split: BUNSHOT_DATA_ENCRYPTION_KEY_DEV / BUNSHOT_DATA_ENCRYPTION_KEY_PROD.
|
|
158
|
+
* Falls back to BUNSHOT_DATA_ENCRYPTION_KEY (no suffix).
|
|
159
|
+
* Returns [] when not set.
|
|
160
|
+
*/
|
|
161
|
+
export function getDataEncryptionKeys() {
|
|
162
|
+
const isProd = process.env.NODE_ENV === "production";
|
|
163
|
+
const raw = (isProd ? process.env.BUNSHOT_DATA_ENCRYPTION_KEY_PROD : process.env.BUNSHOT_DATA_ENCRYPTION_KEY_DEV)
|
|
164
|
+
?? process.env.BUNSHOT_DATA_ENCRYPTION_KEY
|
|
165
|
+
?? "";
|
|
166
|
+
if (!raw.trim())
|
|
167
|
+
return [];
|
|
168
|
+
return raw.split(",").map((entry) => {
|
|
169
|
+
const colonIdx = entry.indexOf(":");
|
|
170
|
+
if (colonIdx === -1)
|
|
171
|
+
throw new Error(`getDataEncryptionKeys: invalid entry "${entry}" - expected "keyId:base64key"`);
|
|
172
|
+
const keyId = entry.slice(0, colonIdx).trim();
|
|
173
|
+
const keyBase64 = entry.slice(colonIdx + 1).trim();
|
|
174
|
+
const key = Buffer.from(keyBase64, "base64");
|
|
175
|
+
if (key.length !== 32)
|
|
176
|
+
throw new Error(`getDataEncryptionKeys: key "${keyId}" must be 32 bytes (got ${key.length})`);
|
|
177
|
+
return { keyId, key };
|
|
178
|
+
});
|
|
179
|
+
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { OpenAPIHono, type Hook } from
|
|
2
|
-
import type { ZodIssue } from
|
|
3
|
-
import type {
|
|
4
|
-
import type {
|
|
1
|
+
import { OpenAPIHono, type Hook } from '@hono/zod-openapi';
|
|
2
|
+
import type { ZodIssue } from 'zod';
|
|
3
|
+
import type { UploadResult } from '../framework/lib/storageAdapter';
|
|
4
|
+
import type { AuthVariables } from '../../packages/bunshot-auth/src/lib/authContext';
|
|
5
5
|
export interface ValidationErrorDetail {
|
|
6
6
|
path: string;
|
|
7
7
|
message: string;
|
|
@@ -15,21 +15,15 @@ export type ValidationErrorFormatter = (issues: ZodIssue[], requestId: string) =
|
|
|
15
15
|
export declare const defaultValidationErrorFormatter: ValidationErrorFormatter;
|
|
16
16
|
export type AppVariables = {
|
|
17
17
|
requestId: string;
|
|
18
|
-
authUserId: string | null;
|
|
19
|
-
roles: string[] | null;
|
|
20
|
-
sessionId: string | null;
|
|
21
18
|
tenantId: string | null;
|
|
22
19
|
tenantConfig: Record<string, unknown> | null;
|
|
23
20
|
validationErrorFormatter: ValidationErrorFormatter;
|
|
24
21
|
uploadResults: UploadResult[] | null;
|
|
25
22
|
uploadBucket: string | undefined;
|
|
26
|
-
/** Set by identify when a scope-bearing M2M token (no sid) is verified. */
|
|
27
|
-
authClientId: string | null;
|
|
28
|
-
/** Raw verified JWT payload stashed by identify for downstream middleware. Null when unauthenticated. */
|
|
29
|
-
tokenPayload: JWTPayload | null;
|
|
30
23
|
};
|
|
31
24
|
export type AppEnv = {
|
|
32
|
-
Variables: AppVariables;
|
|
25
|
+
Variables: AppVariables & AuthVariables;
|
|
33
26
|
};
|
|
34
27
|
export declare const defaultHook: Hook<any, AppEnv, any, any>;
|
|
35
28
|
export declare const createRouter: () => OpenAPIHono<AppEnv, {}, "/">;
|
|
29
|
+
export type { AuthVariables } from '../../packages/bunshot-auth/src/lib/authContext';
|
|
@@ -1,16 +1,16 @@
|
|
|
1
|
-
import { OpenAPIHono } from
|
|
1
|
+
import { OpenAPIHono } from '@hono/zod-openapi';
|
|
2
2
|
export const defaultValidationErrorFormatter = (issues, requestId) => {
|
|
3
|
-
const error = issues.map((i) => i.message).join(
|
|
3
|
+
const error = issues.map((i) => i.message).join(', ');
|
|
4
4
|
const details = issues.map((i) => ({
|
|
5
|
-
path: i.path.join(
|
|
5
|
+
path: i.path.join('.'),
|
|
6
6
|
message: i.message,
|
|
7
7
|
}));
|
|
8
8
|
return { error, details, requestId };
|
|
9
9
|
};
|
|
10
10
|
export const defaultHook = (result, c) => {
|
|
11
11
|
if (!result.success) {
|
|
12
|
-
const requestId = c.get(
|
|
13
|
-
const formatter = c.get(
|
|
12
|
+
const requestId = c.get('requestId') ?? 'unknown';
|
|
13
|
+
const formatter = c.get('validationErrorFormatter') ?? defaultValidationErrorFormatter;
|
|
14
14
|
try {
|
|
15
15
|
return c.json(formatter(result.error.issues, requestId), 400);
|
|
16
16
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { log, authTrace } from "../framework/lib/logger";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { log, authTrace } from "../framework/lib/logger";
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import type { Connection, Mongoose } from 'mongoose';
|
|
2
|
+
type MongooseModule = Mongoose;
|
|
3
|
+
export interface MongoCredentials {
|
|
4
|
+
user: string;
|
|
5
|
+
password: string;
|
|
6
|
+
host: string;
|
|
7
|
+
db: string;
|
|
8
|
+
}
|
|
9
|
+
export interface MongoConnections {
|
|
10
|
+
authConn: Connection;
|
|
11
|
+
appConn: Connection;
|
|
12
|
+
mongoose: MongooseModule;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Connect the auth connection to its dedicated MongoDB server.
|
|
16
|
+
*
|
|
17
|
+
* @param creds Credentials resolved by ISecretRepository. No process.env fallback.
|
|
18
|
+
*/
|
|
19
|
+
export declare const connectAuthMongo: (creds: MongoCredentials) => Promise<{
|
|
20
|
+
authConn: Connection;
|
|
21
|
+
mongoose: MongooseModule;
|
|
22
|
+
}>;
|
|
23
|
+
/**
|
|
24
|
+
* Connect the app connection to its MongoDB server.
|
|
25
|
+
*
|
|
26
|
+
* @param creds Credentials resolved by ISecretRepository. No process.env fallback.
|
|
27
|
+
*/
|
|
28
|
+
export declare const connectAppMongo: (creds: MongoCredentials) => Promise<{
|
|
29
|
+
appConn: Connection;
|
|
30
|
+
mongoose: MongooseModule;
|
|
31
|
+
}>;
|
|
32
|
+
/**
|
|
33
|
+
* Connect both auth and app connections to the same MongoDB server.
|
|
34
|
+
* Shorthand for single-DB setups.
|
|
35
|
+
*
|
|
36
|
+
* @param creds Credentials resolved by ISecretRepository. No process.env fallback.
|
|
37
|
+
*/
|
|
38
|
+
export declare const connectMongo: (creds: MongoCredentials) => Promise<MongoConnections>;
|
|
39
|
+
/**
|
|
40
|
+
* Context-aware Mongo getter. Returns the instance-scoped connections from
|
|
41
|
+
* BunshotContext. Throws if no BunshotContext is attached to the app.
|
|
42
|
+
* Returns null when Mongo is not configured on the context.
|
|
43
|
+
*/
|
|
44
|
+
export declare const getMongoFromApp: (app: object) => {
|
|
45
|
+
auth: Connection | null;
|
|
46
|
+
app: Connection | null;
|
|
47
|
+
} | null;
|
|
48
|
+
/**
|
|
49
|
+
* Close both auth and app Mongo connections.
|
|
50
|
+
* Accepts connections as parameters — no module-level state.
|
|
51
|
+
*/
|
|
52
|
+
export declare const disconnectMongo: (authConn: Connection | null, appConn: Connection | null) => Promise<void>;
|
|
53
|
+
/**
|
|
54
|
+
* Get the mongoose module (lazy-loaded). Useful for consumers that need
|
|
55
|
+
* the mongoose module without a connection (e.g., Schema class access).
|
|
56
|
+
*/
|
|
57
|
+
export declare const getMongooseModule: () => MongooseModule;
|
|
58
|
+
export {};
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
// MongoDB connection management — no module-level mutable state.
|
|
2
|
+
//
|
|
3
|
+
// Phase 1 singleton elimination: connect functions return their connections
|
|
4
|
+
// directly instead of storing them in module globals. Module-level proxy
|
|
5
|
+
// objects (authConnection, appConnection, mongoose) are removed.
|
|
6
|
+
// Use getMongoFromApp(app) for context-aware access.
|
|
7
|
+
import { log } from '../framework/lib/logger';
|
|
8
|
+
import { getContext } from '../../packages/bunshot-core/src/index.js';
|
|
9
|
+
/** Lazy mongoose module loader — caching a require() result, not runtime state. */
|
|
10
|
+
function requireMongoose() {
|
|
11
|
+
try {
|
|
12
|
+
// Bun supports require() in ESM; this defers the import to call time
|
|
13
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
14
|
+
const mod = require('mongoose');
|
|
15
|
+
return (mod.default ?? mod);
|
|
16
|
+
}
|
|
17
|
+
catch {
|
|
18
|
+
throw new Error('mongoose is not installed. Run: bun add mongoose');
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
function buildUri(user, password, host, db) {
|
|
22
|
+
const [hostPart, queryPart] = host.split('?');
|
|
23
|
+
return `mongodb+srv://${encodeURIComponent(user)}:${encodeURIComponent(password)}@${hostPart.replace(/\/$/, '')}/${db}${queryPart ? `?${queryPart}` : ''}`;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Connect the auth connection to its dedicated MongoDB server.
|
|
27
|
+
*
|
|
28
|
+
* @param creds Credentials resolved by ISecretRepository. No process.env fallback.
|
|
29
|
+
*/
|
|
30
|
+
export const connectAuthMongo = async (creds) => {
|
|
31
|
+
const mg = requireMongoose();
|
|
32
|
+
const authConn = mg.createConnection();
|
|
33
|
+
const uri = buildUri(creds.user, creds.password, creds.host, creds.db);
|
|
34
|
+
await authConn.openUri(uri);
|
|
35
|
+
log(`[mongo] auth connected to ${creds.host} as ${creds.user}`);
|
|
36
|
+
return { authConn, mongoose: mg };
|
|
37
|
+
};
|
|
38
|
+
/**
|
|
39
|
+
* Connect the app connection to its MongoDB server.
|
|
40
|
+
*
|
|
41
|
+
* @param creds Credentials resolved by ISecretRepository. No process.env fallback.
|
|
42
|
+
*/
|
|
43
|
+
export const connectAppMongo = async (creds) => {
|
|
44
|
+
const mg = requireMongoose();
|
|
45
|
+
const appConn = mg.createConnection();
|
|
46
|
+
const uri = buildUri(creds.user, creds.password, creds.host, creds.db);
|
|
47
|
+
await appConn.openUri(uri);
|
|
48
|
+
log(`[mongo] app connected to ${creds.host} as ${creds.user}`);
|
|
49
|
+
return { appConn, mongoose: mg };
|
|
50
|
+
};
|
|
51
|
+
/**
|
|
52
|
+
* Connect both auth and app connections to the same MongoDB server.
|
|
53
|
+
* Shorthand for single-DB setups.
|
|
54
|
+
*
|
|
55
|
+
* @param creds Credentials resolved by ISecretRepository. No process.env fallback.
|
|
56
|
+
*/
|
|
57
|
+
export const connectMongo = async (creds) => {
|
|
58
|
+
const mg = requireMongoose();
|
|
59
|
+
const authConn = mg.createConnection();
|
|
60
|
+
const appConn = mg.createConnection();
|
|
61
|
+
const uri = buildUri(creds.user, creds.password, creds.host, creds.db);
|
|
62
|
+
await Promise.all([authConn.openUri(uri), appConn.openUri(uri)]);
|
|
63
|
+
log(`[mongo] connected to ${creds.host} as ${creds.user}`);
|
|
64
|
+
return { authConn, appConn, mongoose: mg };
|
|
65
|
+
};
|
|
66
|
+
/**
|
|
67
|
+
* Context-aware Mongo getter. Returns the instance-scoped connections from
|
|
68
|
+
* BunshotContext. Throws if no BunshotContext is attached to the app.
|
|
69
|
+
* Returns null when Mongo is not configured on the context.
|
|
70
|
+
*/
|
|
71
|
+
export const getMongoFromApp = (app) => {
|
|
72
|
+
const ctx = getContext(app);
|
|
73
|
+
if (ctx.mongo) {
|
|
74
|
+
return {
|
|
75
|
+
auth: ctx.mongo.auth ?? null,
|
|
76
|
+
app: ctx.mongo.app ?? null,
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
return null;
|
|
80
|
+
};
|
|
81
|
+
/**
|
|
82
|
+
* Close both auth and app Mongo connections.
|
|
83
|
+
* Accepts connections as parameters — no module-level state.
|
|
84
|
+
*/
|
|
85
|
+
export const disconnectMongo = async (authConn, appConn) => {
|
|
86
|
+
await Promise.all([
|
|
87
|
+
authConn && authConn.readyState !== 0 ? authConn.close() : Promise.resolve(),
|
|
88
|
+
appConn && appConn.readyState !== 0 ? appConn.close() : Promise.resolve(),
|
|
89
|
+
]);
|
|
90
|
+
log('[mongo] disconnected');
|
|
91
|
+
};
|
|
92
|
+
/**
|
|
93
|
+
* Get the mongoose module (lazy-loaded). Useful for consumers that need
|
|
94
|
+
* the mongoose module without a connection (e.g., Schema class access).
|
|
95
|
+
*/
|
|
96
|
+
export const getMongooseModule = () => requireMongoose();
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import type { Job, Processor, QueueOptions, Queue as QueueType, WorkerOptions, Worker as WorkerType } from 'bullmq';
|
|
2
|
+
import { type RedisCredentials } from './redis';
|
|
3
|
+
export interface CronSchedule {
|
|
4
|
+
/** Cron expression. Mutually exclusive with `every`. */
|
|
5
|
+
cron?: string;
|
|
6
|
+
/** Interval in milliseconds. Mutually exclusive with `cron`. */
|
|
7
|
+
every?: number;
|
|
8
|
+
/** Timezone for cron expressions. */
|
|
9
|
+
timezone?: string;
|
|
10
|
+
}
|
|
11
|
+
export interface DLQOptions<T = unknown> {
|
|
12
|
+
/** Max jobs to keep in the DLQ. Default: 1000. */
|
|
13
|
+
maxSize?: number;
|
|
14
|
+
/** Called when a job is moved to the DLQ. */
|
|
15
|
+
onDeadLetter?: (job: Job<T>, error: Error) => Promise<void>;
|
|
16
|
+
/** Auto-retry delay in ms. No auto-retry by default. */
|
|
17
|
+
retryAfter?: number;
|
|
18
|
+
/** Preserve original job options on retry. Default: true. */
|
|
19
|
+
preserveJobOptions?: boolean;
|
|
20
|
+
}
|
|
21
|
+
export interface QueueFactory {
|
|
22
|
+
createQueue<T = unknown, R = unknown>(name: string, options?: Omit<QueueOptions, 'connection'>): QueueType<T, R>;
|
|
23
|
+
createWorker<T = unknown, R = unknown>(name: string, processor: Processor<T, R>, options?: Omit<WorkerOptions, 'connection'>): WorkerType<T, R>;
|
|
24
|
+
createCronWorker<T = void, R = unknown>(name: string, processor: Processor<T, R>, schedule: CronSchedule, options?: Omit<WorkerOptions, 'connection'>): {
|
|
25
|
+
worker: WorkerType<T, R>;
|
|
26
|
+
queue: QueueType<T, R>;
|
|
27
|
+
registeredName: string;
|
|
28
|
+
};
|
|
29
|
+
cleanupStaleSchedulers(activeNames: string[], registeredNames: ReadonlySet<string>): Promise<void>;
|
|
30
|
+
createDLQHandler<T = unknown>(sourceWorker: WorkerType<T>, sourceQueueName: string, options?: DLQOptions<T>): {
|
|
31
|
+
dlqQueue: QueueType<T>;
|
|
32
|
+
retryJob: (jobId: string) => Promise<void>;
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
export declare function createQueueFactory(credentials: RedisCredentials): QueueFactory;
|
|
36
|
+
export declare function createQueue<T = unknown, R = unknown>(name: string, options?: Omit<QueueOptions, 'connection'>, credentials?: RedisCredentials): QueueType<T, R>;
|
|
37
|
+
export declare function createWorker<T = unknown, R = unknown>(name: string, processor: Processor<T, R>, options?: Omit<WorkerOptions, 'connection'>, credentials?: RedisCredentials): WorkerType<T, R>;
|
|
38
|
+
export declare function createCronWorker<T = void, R = unknown>(name: string, processor: Processor<T, R>, schedule: CronSchedule, options?: Omit<WorkerOptions, 'connection'>, credentials?: RedisCredentials): {
|
|
39
|
+
worker: WorkerType<T, R>;
|
|
40
|
+
queue: QueueType<T, R>;
|
|
41
|
+
registeredName: string;
|
|
42
|
+
};
|
|
43
|
+
export declare function cleanupStaleSchedulers(activeNames: string[], registeredNames: ReadonlySet<string>, credentials?: RedisCredentials): Promise<void>;
|
|
44
|
+
export declare function createDLQHandler<T = unknown>(sourceWorker: WorkerType<T>, sourceQueueName: string, options?: DLQOptions<T>, credentials?: RedisCredentials): {
|
|
45
|
+
dlqQueue: QueueType<T>;
|
|
46
|
+
retryJob: (jobId: string) => Promise<void>;
|
|
47
|
+
};
|
|
48
|
+
/**
|
|
49
|
+
* Contract for worker files loaded by createServer()'s worker discovery.
|
|
50
|
+
*
|
|
51
|
+
* A worker file's default export should be a BunshotWorker. The framework
|
|
52
|
+
* calls it at startup with a properly-credentialed QueueFactory and collects
|
|
53
|
+
* the returned names for scheduler lifecycle management.
|
|
54
|
+
*
|
|
55
|
+
* @example
|
|
56
|
+
* ```ts
|
|
57
|
+
* // workers/digest.ts
|
|
58
|
+
* import type { BunshotWorker } from 'bunshot/queue'
|
|
59
|
+
*
|
|
60
|
+
* const worker: BunshotWorker = async (factory) => {
|
|
61
|
+
* const { registeredName } = factory.createCronWorker(
|
|
62
|
+
* 'digest-emails',
|
|
63
|
+
* digestProcessor,
|
|
64
|
+
* { cron: '0 9 * * *' },
|
|
65
|
+
* )
|
|
66
|
+
* return [registeredName]
|
|
67
|
+
* }
|
|
68
|
+
* export default worker
|
|
69
|
+
* ```
|
|
70
|
+
*/
|
|
71
|
+
export type BunshotWorker = (factory: QueueFactory) => string[] | Promise<string[]>;
|
|
72
|
+
export type { Job, RedisCredentials as QueueRedisCredentials };
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
import { getRedisConnectionOptions } from './redis';
|
|
2
|
+
function requireBullMQ() {
|
|
3
|
+
try {
|
|
4
|
+
// Bun supports require() in ESM; this defers the import to call time.
|
|
5
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
6
|
+
return require('bullmq');
|
|
7
|
+
}
|
|
8
|
+
catch {
|
|
9
|
+
throw new Error('bullmq is not installed. Run: bun add bullmq');
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
function requireQueueRedisCredentials(credentials) {
|
|
13
|
+
if (!credentials?.host) {
|
|
14
|
+
throw new Error('Queue helpers require explicit Redis credentials. Resolve Redis secrets at startup and pass them to createQueueFactory(...) or as the final queue helper argument.');
|
|
15
|
+
}
|
|
16
|
+
return credentials;
|
|
17
|
+
}
|
|
18
|
+
function getQueueRedisConnectionOptions(credentials) {
|
|
19
|
+
return getRedisConnectionOptions(credentials);
|
|
20
|
+
}
|
|
21
|
+
function buildQueueHelpers(getConnectionOptions) {
|
|
22
|
+
return {
|
|
23
|
+
createQueue(name, options) {
|
|
24
|
+
const { Queue } = requireBullMQ();
|
|
25
|
+
return new Queue(name, { connection: getConnectionOptions(), ...options });
|
|
26
|
+
},
|
|
27
|
+
createWorker(name, processor, options) {
|
|
28
|
+
const { Worker } = requireBullMQ();
|
|
29
|
+
return new Worker(name, processor, {
|
|
30
|
+
connection: getConnectionOptions(),
|
|
31
|
+
...options,
|
|
32
|
+
});
|
|
33
|
+
},
|
|
34
|
+
createCronWorker(name, processor, schedule, options) {
|
|
35
|
+
const { Queue, Worker } = requireBullMQ();
|
|
36
|
+
const connection = getConnectionOptions();
|
|
37
|
+
const queue = new Queue(name, { connection });
|
|
38
|
+
const worker = new Worker(name, processor, { connection, ...options });
|
|
39
|
+
// Use upsertJobScheduler — idempotent across restarts.
|
|
40
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- BullMQ's ExtractNameType<T>
|
|
41
|
+
// constrains the scheduler ID to match job data's `name` field, but we use a plain
|
|
42
|
+
// string ID. The runtime API accepts any string; the generic constraint is overly
|
|
43
|
+
// narrow for scheduler IDs.
|
|
44
|
+
const q = queue;
|
|
45
|
+
if (schedule.cron) {
|
|
46
|
+
q.upsertJobScheduler(name, { pattern: schedule.cron, tz: schedule.timezone }, { name });
|
|
47
|
+
}
|
|
48
|
+
else if (schedule.every) {
|
|
49
|
+
q.upsertJobScheduler(name, { every: schedule.every }, { name });
|
|
50
|
+
}
|
|
51
|
+
return { worker, queue, registeredName: name };
|
|
52
|
+
},
|
|
53
|
+
async cleanupStaleSchedulers(activeNames, registeredNames) {
|
|
54
|
+
const { Queue } = requireBullMQ();
|
|
55
|
+
const connection = getConnectionOptions();
|
|
56
|
+
const activeSet = new Set(activeNames);
|
|
57
|
+
for (const name of registeredNames) {
|
|
58
|
+
if (activeSet.has(name))
|
|
59
|
+
continue;
|
|
60
|
+
const queue = new Queue(name, { connection });
|
|
61
|
+
try {
|
|
62
|
+
await queue.removeJobScheduler(name);
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
/* scheduler may not exist */
|
|
66
|
+
}
|
|
67
|
+
await queue.close();
|
|
68
|
+
}
|
|
69
|
+
},
|
|
70
|
+
createDLQHandler(sourceWorker, sourceQueueName, options) {
|
|
71
|
+
const { Queue } = requireBullMQ();
|
|
72
|
+
const connection = getConnectionOptions();
|
|
73
|
+
const dlqName = `${sourceQueueName}-dlq`;
|
|
74
|
+
const dlqQueue = new Queue(dlqName, { connection });
|
|
75
|
+
const maxSize = options?.maxSize ?? 1000;
|
|
76
|
+
const preserveJobOptions = options?.preserveJobOptions ?? true;
|
|
77
|
+
sourceWorker.on('failed', async (job, error) => {
|
|
78
|
+
if (!job)
|
|
79
|
+
return;
|
|
80
|
+
if (job.attemptsMade < (job.opts?.attempts ?? 1))
|
|
81
|
+
return;
|
|
82
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- BullMQ's ExtractNameType<T>
|
|
83
|
+
// constrains job names to literal types from the data shape, but DLQ jobs use
|
|
84
|
+
// dynamic `dlq:` prefixed names.
|
|
85
|
+
await dlqQueue.add(`dlq:${job.name}`, job.data, {
|
|
86
|
+
...(preserveJobOptions
|
|
87
|
+
? {
|
|
88
|
+
delay: job.opts?.delay,
|
|
89
|
+
priority: job.opts?.priority,
|
|
90
|
+
attempts: job.opts?.attempts,
|
|
91
|
+
backoff: job.opts?.backoff,
|
|
92
|
+
}
|
|
93
|
+
: {}),
|
|
94
|
+
jobId: `dlq:${job.id}`,
|
|
95
|
+
});
|
|
96
|
+
if (options?.onDeadLetter) {
|
|
97
|
+
try {
|
|
98
|
+
await options.onDeadLetter(job, error);
|
|
99
|
+
}
|
|
100
|
+
catch (e) {
|
|
101
|
+
console.error(`[dlq:${sourceQueueName}] onDeadLetter callback error:`, e);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
const waitingCount = await dlqQueue.getWaitingCount();
|
|
105
|
+
if (waitingCount > maxSize) {
|
|
106
|
+
const excess = waitingCount - maxSize;
|
|
107
|
+
const jobs = await dlqQueue.getWaiting(0, excess - 1);
|
|
108
|
+
for (const j of jobs) {
|
|
109
|
+
await j.remove();
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
});
|
|
113
|
+
const sourceQueue = new Queue(sourceQueueName, { connection });
|
|
114
|
+
const retryJob = async (jobId) => {
|
|
115
|
+
const job = await dlqQueue.getJob(jobId);
|
|
116
|
+
if (!job)
|
|
117
|
+
throw new Error(`Job ${jobId} not found in DLQ`);
|
|
118
|
+
const retryOptions = preserveJobOptions
|
|
119
|
+
? {
|
|
120
|
+
delay: job.opts?.delay,
|
|
121
|
+
priority: job.opts?.priority,
|
|
122
|
+
attempts: job.opts?.attempts,
|
|
123
|
+
backoff: job.opts?.backoff,
|
|
124
|
+
}
|
|
125
|
+
: {};
|
|
126
|
+
await sourceQueue.add(job.name, job.data, retryOptions);
|
|
127
|
+
await job.remove();
|
|
128
|
+
};
|
|
129
|
+
return { dlqQueue, retryJob };
|
|
130
|
+
},
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
export function createQueueFactory(credentials) {
|
|
134
|
+
const resolvedCredentials = requireQueueRedisCredentials(credentials);
|
|
135
|
+
const getConnectionOptions = () => getQueueRedisConnectionOptions(resolvedCredentials);
|
|
136
|
+
return buildQueueHelpers(getConnectionOptions);
|
|
137
|
+
}
|
|
138
|
+
export function createQueue(name, options, credentials) {
|
|
139
|
+
return createQueueFactory(requireQueueRedisCredentials(credentials)).createQueue(name, options);
|
|
140
|
+
}
|
|
141
|
+
export function createWorker(name, processor, options, credentials) {
|
|
142
|
+
return createQueueFactory(requireQueueRedisCredentials(credentials)).createWorker(name, processor, options);
|
|
143
|
+
}
|
|
144
|
+
export function createCronWorker(name, processor, schedule, options, credentials) {
|
|
145
|
+
return createQueueFactory(requireQueueRedisCredentials(credentials)).createCronWorker(name, processor, schedule, options);
|
|
146
|
+
}
|
|
147
|
+
export function cleanupStaleSchedulers(activeNames, registeredNames, credentials) {
|
|
148
|
+
return createQueueFactory(requireQueueRedisCredentials(credentials)).cleanupStaleSchedulers(activeNames, registeredNames);
|
|
149
|
+
}
|
|
150
|
+
export function createDLQHandler(sourceWorker, sourceQueueName, options, credentials) {
|
|
151
|
+
return createQueueFactory(requireQueueRedisCredentials(credentials)).createDLQHandler(sourceWorker, sourceQueueName, options);
|
|
152
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { default as RedisClass, RedisOptions } from 'ioredis';
|
|
2
|
+
export interface RedisCredentials {
|
|
3
|
+
/** Redis host:port (e.g., "localhost:6379") */
|
|
4
|
+
host: string;
|
|
5
|
+
/** Redis username */
|
|
6
|
+
user?: string;
|
|
7
|
+
/** Redis password */
|
|
8
|
+
password?: string;
|
|
9
|
+
}
|
|
10
|
+
export declare const getRedisConnectionOptions: (creds: RedisCredentials) => RedisOptions;
|
|
11
|
+
/**
|
|
12
|
+
* Connect to Redis and return the client.
|
|
13
|
+
* The caller is responsible for storing the client (e.g., on BunshotContext).
|
|
14
|
+
*
|
|
15
|
+
* @param creds Credentials resolved by ISecretRepository. No process.env fallback.
|
|
16
|
+
*/
|
|
17
|
+
export declare const connectRedis: (creds: RedisCredentials) => Promise<RedisClass>;
|
|
18
|
+
/**
|
|
19
|
+
* Gracefully close the Redis connection.
|
|
20
|
+
* Accepts the client as parameter — no module-level state.
|
|
21
|
+
*/
|
|
22
|
+
export declare const disconnectRedis: (client: RedisClass | null) => Promise<void>;
|
|
23
|
+
/**
|
|
24
|
+
* Context-aware Redis getter. Returns the instance-scoped Redis from
|
|
25
|
+
* BunshotContext, or null when Redis is not configured on the context.
|
|
26
|
+
* Throws if no BunshotContext is attached to the app.
|
|
27
|
+
*/
|
|
28
|
+
export declare const getRedisFromApp: (app: object) => RedisClass | null;
|