@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
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
// Redis connection management — no module-level mutable state.
|
|
2
|
+
//
|
|
3
|
+
// Phase 1 singleton elimination: connectRedis() returns the client directly
|
|
4
|
+
// instead of storing it in a module global. disconnectRedis() accepts the
|
|
5
|
+
// client as a parameter. Use getRedisFromApp(app) for context-aware access.
|
|
6
|
+
import { log } from '../framework/lib/logger';
|
|
7
|
+
import { getContext } from '../../packages/bunshot-core/src/index.js';
|
|
8
|
+
function requireIoredis() {
|
|
9
|
+
try {
|
|
10
|
+
// Bun supports require() in ESM; this defers the import to call time
|
|
11
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
12
|
+
const mod = require('ioredis');
|
|
13
|
+
return mod.default ?? mod;
|
|
14
|
+
}
|
|
15
|
+
catch {
|
|
16
|
+
throw new Error('ioredis is not installed. Run: bun add ioredis');
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
export const getRedisConnectionOptions = (creds) => {
|
|
20
|
+
const host_port = creds.host;
|
|
21
|
+
if (!host_port)
|
|
22
|
+
throw new Error('Missing Redis host — pass credentials via ISecretRepository');
|
|
23
|
+
const [host, port] = host_port.split(':');
|
|
24
|
+
if (!host || !port)
|
|
25
|
+
throw new Error(`Invalid Redis host format — expected "host:port", got "${host_port}"`);
|
|
26
|
+
const username = creds.user;
|
|
27
|
+
const password = creds.password;
|
|
28
|
+
return {
|
|
29
|
+
host,
|
|
30
|
+
port: Number(port),
|
|
31
|
+
...(username && { username }),
|
|
32
|
+
...(password && { password }),
|
|
33
|
+
};
|
|
34
|
+
};
|
|
35
|
+
/**
|
|
36
|
+
* Connect to Redis and return the client.
|
|
37
|
+
* The caller is responsible for storing the client (e.g., on BunshotContext).
|
|
38
|
+
*
|
|
39
|
+
* @param creds Credentials resolved by ISecretRepository. No process.env fallback.
|
|
40
|
+
*/
|
|
41
|
+
export const connectRedis = (creds) => {
|
|
42
|
+
const Redis = requireIoredis();
|
|
43
|
+
const opts = getRedisConnectionOptions(creds);
|
|
44
|
+
const client = new Redis(opts);
|
|
45
|
+
client.on('error', err => log(`[redis] error: ${err.message}`));
|
|
46
|
+
return new Promise((resolve, reject) => {
|
|
47
|
+
client.once('ready', () => {
|
|
48
|
+
log(`[redis] connected to ${opts.host}:${opts.port} as ${opts.username || 'default user'}`);
|
|
49
|
+
resolve(client);
|
|
50
|
+
});
|
|
51
|
+
client.once('error', reject);
|
|
52
|
+
});
|
|
53
|
+
};
|
|
54
|
+
/**
|
|
55
|
+
* Gracefully close the Redis connection.
|
|
56
|
+
* Accepts the client as parameter — no module-level state.
|
|
57
|
+
*/
|
|
58
|
+
export const disconnectRedis = async (client) => {
|
|
59
|
+
if (!client)
|
|
60
|
+
return;
|
|
61
|
+
await client.quit();
|
|
62
|
+
log('[redis] disconnected');
|
|
63
|
+
};
|
|
64
|
+
/**
|
|
65
|
+
* Context-aware Redis getter. Returns the instance-scoped Redis from
|
|
66
|
+
* BunshotContext, or null when Redis is not configured on the context.
|
|
67
|
+
* Throws if no BunshotContext is attached to the app.
|
|
68
|
+
*/
|
|
69
|
+
export const getRedisFromApp = (app) => {
|
|
70
|
+
const ctx = getContext(app);
|
|
71
|
+
return ctx.redis ?? null;
|
|
72
|
+
};
|
|
@@ -27,10 +27,10 @@ export declare function signCursor(payload: string, secret: string | string[]):
|
|
|
27
27
|
export declare function verifyCursor(cursor: string, secret: string | string[]): string | null;
|
|
28
28
|
/**
|
|
29
29
|
* Create a stateless HMAC-signed URL. The signature covers the HTTP method,
|
|
30
|
-
* storage key,
|
|
30
|
+
* storage key, expiry timestamp, and any extra query params so that:
|
|
31
31
|
* - Expired URLs are rejected (replay prevention)
|
|
32
32
|
* - URLs are method-bound (a GET URL can't be replayed as a PUT)
|
|
33
|
-
* - Tampering with the key or
|
|
33
|
+
* - Tampering with the key, expiry, or any extra param invalidates the signature
|
|
34
34
|
*
|
|
35
35
|
* @param base Base URL string (e.g. "https://api.example.com/uploads/presign")
|
|
36
36
|
* @param key Storage object key
|
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
import { createHmac } from 'crypto';
|
|
2
|
+
import { timingSafeEqual } from '../../packages/bunshot-core/src/index.js';
|
|
3
|
+
// ---------------------------------------------------------------------------
|
|
4
|
+
// Core HMAC primitives
|
|
5
|
+
// ---------------------------------------------------------------------------
|
|
6
|
+
/**
|
|
7
|
+
* Sign `data` with the active key (first element of `secret`).
|
|
8
|
+
* Normalizes string | string[] so that an array is never passed directly to
|
|
9
|
+
* createHmac() — which would silently call .toString() and produce
|
|
10
|
+
* "[object Array]" as the key.
|
|
11
|
+
*/
|
|
12
|
+
export function hmacSign(data, secret) {
|
|
13
|
+
const key = Array.isArray(secret) ? secret[0] : secret;
|
|
14
|
+
if (!key) {
|
|
15
|
+
throw new Error('hmacSign: secret key must be a non-empty string');
|
|
16
|
+
}
|
|
17
|
+
return createHmac('sha256', key).update(data).digest('hex');
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Verify `sig` against `data` using one of the provided keys.
|
|
21
|
+
* Keys are tried newest-first (index 0 is the active signing key).
|
|
22
|
+
*
|
|
23
|
+
* Key ordering convention: put the current (newest) key first; rotated keys
|
|
24
|
+
* after. The common case (valid current-key signature) succeeds on the first
|
|
25
|
+
* comparison; old rotated keys only matter for in-flight tokens.
|
|
26
|
+
*
|
|
27
|
+
* MUST use timingSafeEqual — never === — to prevent timing side-channel leaks.
|
|
28
|
+
* This is the most common HMAC implementation mistake.
|
|
29
|
+
*/
|
|
30
|
+
export function hmacVerify(data, sig, secret) {
|
|
31
|
+
const keys = Array.isArray(secret) ? secret : [secret];
|
|
32
|
+
if (keys.length === 0)
|
|
33
|
+
return false;
|
|
34
|
+
for (const key of keys) {
|
|
35
|
+
if (!key)
|
|
36
|
+
continue;
|
|
37
|
+
const expected = createHmac('sha256', key).update(data).digest('hex');
|
|
38
|
+
try {
|
|
39
|
+
if (timingSafeEqual(expected, sig))
|
|
40
|
+
return true;
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
// timingSafeEqual (src/lib/crypto.ts) handles length mismatches itself:
|
|
44
|
+
// it returns false rather than throwing, so this catch block is never
|
|
45
|
+
// reached under normal conditions. It is kept as a defensive no-op in
|
|
46
|
+
// case the underlying implementation changes in the future.
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
return false;
|
|
50
|
+
}
|
|
51
|
+
// ---------------------------------------------------------------------------
|
|
52
|
+
// Cookie signing
|
|
53
|
+
//
|
|
54
|
+
// Value is base64url-encoded before appending ".sig" to avoid delimiter
|
|
55
|
+
// collision — raw values may contain "." which would break naive
|
|
56
|
+
// split-on-last-dot parsing.
|
|
57
|
+
//
|
|
58
|
+
// Edge case: base64url("") === "" so the signed form for an empty value is
|
|
59
|
+
// ".sig". Split uses lastIndexOf("."), not indexOf("."), and dotIdx === 0
|
|
60
|
+
// is treated as a valid (empty) value, not a parse error.
|
|
61
|
+
// ---------------------------------------------------------------------------
|
|
62
|
+
function toBase64url(s) {
|
|
63
|
+
return Buffer.from(s).toString('base64url');
|
|
64
|
+
}
|
|
65
|
+
function fromBase64url(s) {
|
|
66
|
+
return Buffer.from(s, 'base64url').toString('utf8');
|
|
67
|
+
}
|
|
68
|
+
/** Returns `"base64url(value).hmac"`. */
|
|
69
|
+
export function signCookieValue(value, secret) {
|
|
70
|
+
const encoded = toBase64url(value);
|
|
71
|
+
const sig = hmacSign(encoded, secret);
|
|
72
|
+
return `${encoded}.${sig}`;
|
|
73
|
+
}
|
|
74
|
+
/** Returns the original value or `null` if the signature is invalid. */
|
|
75
|
+
export function verifyCookieValue(signed, secret) {
|
|
76
|
+
const dotIdx = signed.lastIndexOf('.');
|
|
77
|
+
// dotIdx === 0 is valid: empty encoded value (signed form ".sig")
|
|
78
|
+
if (dotIdx < 0)
|
|
79
|
+
return null;
|
|
80
|
+
const encoded = signed.slice(0, dotIdx);
|
|
81
|
+
const sig = signed.slice(dotIdx + 1);
|
|
82
|
+
if (!hmacVerify(encoded, sig, secret))
|
|
83
|
+
return null;
|
|
84
|
+
try {
|
|
85
|
+
return fromBase64url(encoded);
|
|
86
|
+
}
|
|
87
|
+
catch {
|
|
88
|
+
return null;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
// ---------------------------------------------------------------------------
|
|
92
|
+
// Cursor signing (same structure as cookie signing)
|
|
93
|
+
// ---------------------------------------------------------------------------
|
|
94
|
+
/** Returns `"base64url(payload).hmac"`. */
|
|
95
|
+
export function signCursor(payload, secret) {
|
|
96
|
+
const encoded = toBase64url(payload);
|
|
97
|
+
const sig = hmacSign(encoded, secret);
|
|
98
|
+
return `${encoded}.${sig}`;
|
|
99
|
+
}
|
|
100
|
+
/** Returns the original payload or `null` if the signature is invalid. */
|
|
101
|
+
export function verifyCursor(cursor, secret) {
|
|
102
|
+
const dotIdx = cursor.lastIndexOf('.');
|
|
103
|
+
if (dotIdx < 0)
|
|
104
|
+
return null;
|
|
105
|
+
const encoded = cursor.slice(0, dotIdx);
|
|
106
|
+
const sig = cursor.slice(dotIdx + 1);
|
|
107
|
+
if (!hmacVerify(encoded, sig, secret))
|
|
108
|
+
return null;
|
|
109
|
+
try {
|
|
110
|
+
return fromBase64url(encoded);
|
|
111
|
+
}
|
|
112
|
+
catch {
|
|
113
|
+
return null;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
// ---------------------------------------------------------------------------
|
|
117
|
+
// Presigned URLs
|
|
118
|
+
//
|
|
119
|
+
// Signing data = method + "\n" + key + "\n" + exp + "\n" + sortedParams
|
|
120
|
+
// Newline delimiter is safe: keys like "uploads/2024/photo.jpg" contain dots
|
|
121
|
+
// but cannot contain newlines; method and exp never contain newlines.
|
|
122
|
+
// Using "." would create ambiguity with keys containing dots.
|
|
123
|
+
//
|
|
124
|
+
// Extra params are included in the HMAC so that an attacker cannot modify,
|
|
125
|
+
// add, or remove query parameters without invalidating the signature.
|
|
126
|
+
// sortedParams is always present (empty string when no extra params) so the
|
|
127
|
+
// "\n" delimiter is consistent — prevents length-extension confusion.
|
|
128
|
+
// ---------------------------------------------------------------------------
|
|
129
|
+
/**
|
|
130
|
+
* Serialize extra params for inclusion in the HMAC signing string.
|
|
131
|
+
* Keys are sorted, then each key and value are percent-encoded (encodeURIComponent)
|
|
132
|
+
* and joined as "key=value&key2=value2". Returns "" when params is empty/undefined.
|
|
133
|
+
*/
|
|
134
|
+
function serializeExtraParams(params) {
|
|
135
|
+
if (!params || Object.keys(params).length === 0)
|
|
136
|
+
return '';
|
|
137
|
+
return Object.keys(params)
|
|
138
|
+
.sort()
|
|
139
|
+
.map(k => `${encodeURIComponent(k)}=${encodeURIComponent(params[k])}`)
|
|
140
|
+
.join('&');
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Create a stateless HMAC-signed URL. The signature covers the HTTP method,
|
|
144
|
+
* storage key, expiry timestamp, and any extra query params so that:
|
|
145
|
+
* - Expired URLs are rejected (replay prevention)
|
|
146
|
+
* - URLs are method-bound (a GET URL can't be replayed as a PUT)
|
|
147
|
+
* - Tampering with the key, expiry, or any extra param invalidates the signature
|
|
148
|
+
*
|
|
149
|
+
* @param base Base URL string (e.g. "https://api.example.com/uploads/presign")
|
|
150
|
+
* @param key Storage object key
|
|
151
|
+
* @param opts Method, expiry in seconds from now, optional extra query params
|
|
152
|
+
* @param secret HMAC secret (supports key rotation via string[])
|
|
153
|
+
*/
|
|
154
|
+
export function createPresignedUrl(base, key, opts, secret) {
|
|
155
|
+
const exp = Math.floor(Date.now() / 1000) + opts.expiry;
|
|
156
|
+
const method = opts.method.toUpperCase();
|
|
157
|
+
const sortedParams = serializeExtraParams(opts.extra);
|
|
158
|
+
const data = `${method}\n${key}\n${exp}\n${sortedParams}`;
|
|
159
|
+
const sig = hmacSign(data, secret);
|
|
160
|
+
const url = new URL(base);
|
|
161
|
+
url.searchParams.set('key', key);
|
|
162
|
+
url.searchParams.set('exp', String(exp));
|
|
163
|
+
url.searchParams.set('method', method);
|
|
164
|
+
url.searchParams.set('sig', sig);
|
|
165
|
+
if (opts.extra) {
|
|
166
|
+
for (const [k, v] of Object.entries(opts.extra)) {
|
|
167
|
+
url.searchParams.set(k, v);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
return url.toString();
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Verify an HMAC-signed URL. Returns the key and any extra params, or null
|
|
174
|
+
* if the URL is expired, tampered, or method-mismatched.
|
|
175
|
+
*/
|
|
176
|
+
export function verifyPresignedUrl(url, method, secret) {
|
|
177
|
+
let parsedUrl;
|
|
178
|
+
try {
|
|
179
|
+
parsedUrl = new URL(url);
|
|
180
|
+
}
|
|
181
|
+
catch {
|
|
182
|
+
return null;
|
|
183
|
+
}
|
|
184
|
+
const key = parsedUrl.searchParams.get('key');
|
|
185
|
+
const exp = parsedUrl.searchParams.get('exp');
|
|
186
|
+
const sig = parsedUrl.searchParams.get('sig');
|
|
187
|
+
const urlMethod = parsedUrl.searchParams.get('method');
|
|
188
|
+
if (!key || !exp || !sig || !urlMethod)
|
|
189
|
+
return null;
|
|
190
|
+
// Method binding check
|
|
191
|
+
if (urlMethod !== method.toUpperCase())
|
|
192
|
+
return null;
|
|
193
|
+
// Expiry check
|
|
194
|
+
const expNum = parseInt(exp, 10);
|
|
195
|
+
if (!isFinite(expNum) || expNum < Math.floor(Date.now() / 1000))
|
|
196
|
+
return null;
|
|
197
|
+
// Collect extra params (all except reserved ones)
|
|
198
|
+
const reserved = new Set(['key', 'exp', 'sig', 'method']);
|
|
199
|
+
const extra = {};
|
|
200
|
+
for (const [k, v] of parsedUrl.searchParams.entries()) {
|
|
201
|
+
if (!reserved.has(k))
|
|
202
|
+
extra[k] = v;
|
|
203
|
+
}
|
|
204
|
+
// Signature check — includes extra params so tampering is detected
|
|
205
|
+
const sortedParams = serializeExtraParams(Object.keys(extra).length > 0 ? extra : undefined);
|
|
206
|
+
const data = `${urlMethod}\n${key}\n${exp}\n${sortedParams}`;
|
|
207
|
+
if (!hmacVerify(data, sig, secret))
|
|
208
|
+
return null;
|
|
209
|
+
return Object.keys(extra).length > 0 ? { key, extra } : { key };
|
|
210
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { DataEncryptionKey } from '../../packages/bunshot-core/src/index.js';
|
|
2
|
+
export type { DataEncryptionKey };
|
|
3
|
+
export interface SigningConfig {
|
|
4
|
+
/**
|
|
5
|
+
* HMAC secret. Defaults to JWT_SECRET env var if omitted.
|
|
6
|
+
* Pass string[] to support key rotation - first element signs, all elements verify.
|
|
7
|
+
*/
|
|
8
|
+
secret?: string | string[];
|
|
9
|
+
/** Sign/verify cookie values set via exported helpers. Default: false. */
|
|
10
|
+
cookies?: boolean;
|
|
11
|
+
/** Sign pagination cursor tokens to prevent client tampering. Default: false. */
|
|
12
|
+
cursors?: boolean;
|
|
13
|
+
/** HMAC-based stateless presigned URLs (no DB lookup). Default: false. */
|
|
14
|
+
presignedUrls?: boolean | {
|
|
15
|
+
defaultExpiry?: number;
|
|
16
|
+
};
|
|
17
|
+
/** Require clients to HMAC-sign requests (method+path+timestamp+body). Default: false. */
|
|
18
|
+
requestSigning?: boolean | {
|
|
19
|
+
tolerance?: number;
|
|
20
|
+
header?: string;
|
|
21
|
+
timestampHeader?: string;
|
|
22
|
+
};
|
|
23
|
+
/** Hash idempotency keys before storage. Default: false. */
|
|
24
|
+
idempotencyKeys?: boolean;
|
|
25
|
+
/** Bind sessions to client IP+UA fingerprint. Default: false. */
|
|
26
|
+
sessionBinding?: boolean | {
|
|
27
|
+
fields?: Array<'ip' | 'ua' | 'accept-language'>;
|
|
28
|
+
onMismatch?: 'unauthenticate' | 'reject' | 'log-only';
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Parse data encryption keys from a raw string value resolved by the ISecretRepository.
|
|
33
|
+
*
|
|
34
|
+
* Format: comma-separated "keyId:base64key" pairs, first is active.
|
|
35
|
+
* Example: "v1:base64key1,v0:base64key0"
|
|
36
|
+
* Returns [] when empty or not provided.
|
|
37
|
+
*
|
|
38
|
+
* @param rawValue Value resolved by ISecretRepository. No process.env fallback.
|
|
39
|
+
*/
|
|
40
|
+
export declare function getDataEncryptionKeys(rawValue?: string): DataEncryptionKey[];
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
// ---------------------------------------------------------------------------
|
|
2
|
+
// Data encryption keys (AES-256-GCM for field-level encryption at rest)
|
|
3
|
+
// ---------------------------------------------------------------------------
|
|
4
|
+
/**
|
|
5
|
+
* Parse data encryption keys from a raw string value resolved by the ISecretRepository.
|
|
6
|
+
*
|
|
7
|
+
* Format: comma-separated "keyId:base64key" pairs, first is active.
|
|
8
|
+
* Example: "v1:base64key1,v0:base64key0"
|
|
9
|
+
* Returns [] when empty or not provided.
|
|
10
|
+
*
|
|
11
|
+
* @param rawValue Value resolved by ISecretRepository. No process.env fallback.
|
|
12
|
+
*/
|
|
13
|
+
export function getDataEncryptionKeys(rawValue) {
|
|
14
|
+
const raw = rawValue ?? '';
|
|
15
|
+
if (!raw.trim())
|
|
16
|
+
return [];
|
|
17
|
+
return raw.split(',').map(entry => {
|
|
18
|
+
const colonIdx = entry.indexOf(':');
|
|
19
|
+
if (colonIdx === -1)
|
|
20
|
+
throw new Error(`getDataEncryptionKeys: invalid entry "${entry}" - expected "keyId:base64key"`);
|
|
21
|
+
const keyId = entry.slice(0, colonIdx).trim();
|
|
22
|
+
const keyBase64 = entry.slice(colonIdx + 1).trim();
|
|
23
|
+
const key = Buffer.from(keyBase64, 'base64');
|
|
24
|
+
if (key.length !== 32)
|
|
25
|
+
throw new Error(`getDataEncryptionKeys: key "${keyId}" must be 32 bytes (got ${key.length})`);
|
|
26
|
+
return { keyId, key };
|
|
27
|
+
});
|
|
28
|
+
}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import { type HeartbeatConfig } from './framework/lib/wsHeartbeat';
|
|
2
|
+
import type { WsMessageDefaults, WsMessageStore } from './framework/lib/wsMessages';
|
|
3
|
+
import type { WsTransportAdapter } from './framework/lib/wsTransport';
|
|
4
|
+
import { type SocketData } from './framework/ws/index';
|
|
5
|
+
import type { BunFile, Server, ServerWebSocket } from 'bun';
|
|
6
|
+
import type { SseEndpointConfig } from '../packages/bunshot-core/src/index.js';
|
|
7
|
+
import type { BunshotContext } from '../packages/bunshot-core/src/index.js';
|
|
8
|
+
import { type CreateAppConfig } from './app';
|
|
9
|
+
export type { SocketData };
|
|
10
|
+
/**
|
|
11
|
+
* Retrieve the BunshotContext associated with a server.
|
|
12
|
+
* Available after createServer() completes. Used by test helpers.
|
|
13
|
+
*/
|
|
14
|
+
export declare function getServerContext(server: object): BunshotContext | null;
|
|
15
|
+
/**
|
|
16
|
+
* TLS options passed through to Bun.serve().
|
|
17
|
+
* Fields are a subset of Bun's TLSOptions interface.
|
|
18
|
+
* Keep aligned with bun-types on Bun upgrades.
|
|
19
|
+
*/
|
|
20
|
+
export interface BunTLSConfig {
|
|
21
|
+
key?: string | BunFile;
|
|
22
|
+
cert?: string | BunFile;
|
|
23
|
+
ca?: string | BunFile;
|
|
24
|
+
passphrase?: string;
|
|
25
|
+
/** SNI server name */
|
|
26
|
+
serverName?: string;
|
|
27
|
+
dhParamsFile?: string;
|
|
28
|
+
lowMemoryMode?: boolean;
|
|
29
|
+
/** OpenSSL SSL_OP_* bitmask; use carefully */
|
|
30
|
+
secureOptions?: number;
|
|
31
|
+
/** Reject clients with invalid certificates (mTLS) */
|
|
32
|
+
rejectUnauthorized?: boolean;
|
|
33
|
+
/** Request a client certificate (mTLS) */
|
|
34
|
+
requestCert?: boolean;
|
|
35
|
+
}
|
|
36
|
+
export interface WsEndpointConfig<T extends object = object> {
|
|
37
|
+
/**
|
|
38
|
+
* Auth and upgrade logic for this endpoint.
|
|
39
|
+
* Return undefined after calling server.upgrade() to accept.
|
|
40
|
+
* Return a Response to reject (e.g. 401, 403).
|
|
41
|
+
* Omit to use the default upgrade handler (attaches userId from session/JWT if present).
|
|
42
|
+
*/
|
|
43
|
+
upgrade?: (req: Request, server: Server<SocketData<T>>) => Promise<Response | undefined>;
|
|
44
|
+
/**
|
|
45
|
+
* Application-layer WebSocket hooks.
|
|
46
|
+
*
|
|
47
|
+
* Framework effects (heartbeat registration, presence tracking, room cleanup)
|
|
48
|
+
* always run first. These hooks fire after. Any hook not provided is a no-op.
|
|
49
|
+
*
|
|
50
|
+
* `pong` is intentionally excluded. Pong frames are owned exclusively by the
|
|
51
|
+
* heartbeat system.
|
|
52
|
+
*
|
|
53
|
+
* Async contract:
|
|
54
|
+
* - `open`, `message`, `close` — awaited. Throws are caught, logged, execution continues.
|
|
55
|
+
* - `drain` — NOT awaited (fire-and-forget).
|
|
56
|
+
* - `upgrade` — awaited. Throws propagate as HTTP 500 responses.
|
|
57
|
+
*/
|
|
58
|
+
on?: {
|
|
59
|
+
open?: (ws: ServerWebSocket<SocketData<T>>) => void | Promise<void>;
|
|
60
|
+
message?: (ws: ServerWebSocket<SocketData<T>>, message: string | Buffer) => void | Promise<void>;
|
|
61
|
+
close?: (ws: ServerWebSocket<SocketData<T>>, code: number, reason: string) => void | Promise<void>;
|
|
62
|
+
drain?: (ws: ServerWebSocket<SocketData<T>>) => void | Promise<void>;
|
|
63
|
+
};
|
|
64
|
+
/** Guard called before a socket joins a room. Return false to deny. */
|
|
65
|
+
onRoomSubscribe?: (ws: ServerWebSocket<SocketData<T>>, room: string) => boolean | Promise<boolean>;
|
|
66
|
+
/** Max message bytes for this endpoint. Default: 65536 (64 KB). */
|
|
67
|
+
maxMessageSize?: number;
|
|
68
|
+
/**
|
|
69
|
+
* Heartbeat keepalive. true = defaults (30s interval, 10s timeout).
|
|
70
|
+
* Global tick runs at the minimum intervalMs across all active endpoints.
|
|
71
|
+
*/
|
|
72
|
+
heartbeat?: boolean | HeartbeatConfig;
|
|
73
|
+
/**
|
|
74
|
+
* Presence tracking. true = broadcast presence_join / presence_leave to rooms.
|
|
75
|
+
* Events are scoped to this endpoint.
|
|
76
|
+
*/
|
|
77
|
+
presence?: boolean | {
|
|
78
|
+
broadcastEvents?: boolean;
|
|
79
|
+
};
|
|
80
|
+
/**
|
|
81
|
+
* Message persistence. Rooms must be opted in per-endpoint via configureRoom().
|
|
82
|
+
*/
|
|
83
|
+
persistence?: {
|
|
84
|
+
store?: WsMessageStore;
|
|
85
|
+
defaults?: WsMessageDefaults;
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
export interface WsConfig<T extends object = object> {
|
|
89
|
+
/**
|
|
90
|
+
* WebSocket endpoints. Each key is the upgrade URL path.
|
|
91
|
+
*
|
|
92
|
+
* @example
|
|
93
|
+
* {
|
|
94
|
+
* "/chat": { heartbeat: true, presence: true },
|
|
95
|
+
* "/notifications": { upgrade: publicUpgrade },
|
|
96
|
+
* "/admin": { upgrade: adminRoleCheck, maxMessageSize: 8192 },
|
|
97
|
+
* }
|
|
98
|
+
*/
|
|
99
|
+
endpoints: Record<string, WsEndpointConfig<T>>;
|
|
100
|
+
/** Cross-instance pub/sub transport. Shared across all endpoints. */
|
|
101
|
+
transport?: WsTransportAdapter;
|
|
102
|
+
idleTimeout?: number;
|
|
103
|
+
backpressureLimit?: number;
|
|
104
|
+
closeOnBackpressureLimit?: boolean;
|
|
105
|
+
perMessageDeflate?: boolean;
|
|
106
|
+
publishToSelf?: boolean;
|
|
107
|
+
}
|
|
108
|
+
export type { SseEndpointConfig };
|
|
109
|
+
export interface SseConfig<T extends object = object> {
|
|
110
|
+
/**
|
|
111
|
+
* SSE endpoints. Every key MUST:
|
|
112
|
+
* - start with `/__sse/`
|
|
113
|
+
* - be a literal path (no `:param` segments, no `*` wildcards)
|
|
114
|
+
*
|
|
115
|
+
* @example { "/__sse/feed": { events: ['community:thread.created'] } }
|
|
116
|
+
*/
|
|
117
|
+
endpoints: Record<string, SseEndpointConfig<T>>;
|
|
118
|
+
}
|
|
119
|
+
export interface CreateServerConfig<T extends object = object> extends CreateAppConfig {
|
|
120
|
+
port?: number;
|
|
121
|
+
/**
|
|
122
|
+
* Bind address. Default "0.0.0.0".
|
|
123
|
+
* Omitted when `unix` is set.
|
|
124
|
+
*/
|
|
125
|
+
hostname?: string;
|
|
126
|
+
/**
|
|
127
|
+
* Unix domain socket path. Mutually exclusive with port, hostname, and tls.
|
|
128
|
+
*/
|
|
129
|
+
unix?: string;
|
|
130
|
+
/** TLS configuration. Passed through to Bun.serve(). */
|
|
131
|
+
tls?: BunTLSConfig;
|
|
132
|
+
/** Absolute path to the service's workers directory — auto-imports all .ts files */
|
|
133
|
+
workersDir?: string;
|
|
134
|
+
/** Set false to disable auto-loading workers. Defaults to true */
|
|
135
|
+
enableWorkers?: boolean;
|
|
136
|
+
/** WebSocket configuration */
|
|
137
|
+
ws?: WsConfig<T>;
|
|
138
|
+
/** SSE configuration */
|
|
139
|
+
sse?: SseConfig<T>;
|
|
140
|
+
/**
|
|
141
|
+
* Maximum request body size in bytes. Defaults to the upload config limit when present
|
|
142
|
+
* (maxFileSize * maxFiles), otherwise Bun's default (128 MB).
|
|
143
|
+
*/
|
|
144
|
+
maxRequestBodySize?: number;
|
|
145
|
+
}
|
|
146
|
+
export declare const createServer: <T extends object = object>(config: CreateServerConfig<T>) => Promise<Server<SocketData<T>>>;
|