@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,107 @@
|
|
|
1
|
+
import { wsEndpointKey } from './wsNamespace';
|
|
2
|
+
function requireIoredis() {
|
|
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
|
+
const mod = require('ioredis');
|
|
7
|
+
return mod.default ?? mod;
|
|
8
|
+
}
|
|
9
|
+
catch {
|
|
10
|
+
throw new Error('ioredis is required for RedisTransport. Install it: bun add ioredis');
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Redis pub/sub transport for horizontal WebSocket scaling.
|
|
15
|
+
*
|
|
16
|
+
* Uses two ioredis clients — one for publishing and one for subscribing —
|
|
17
|
+
* as required by the Redis pub/sub protocol (a client in subscribe mode
|
|
18
|
+
* cannot issue regular commands).
|
|
19
|
+
*
|
|
20
|
+
* Uses `psubscribe` on `<prefix>*` so that joining new rooms never
|
|
21
|
+
* requires an additional SUBSCRIBE call.
|
|
22
|
+
*
|
|
23
|
+
* Self-echo prevention: every published message is wrapped with the
|
|
24
|
+
* `origin` passed in from `ws.ts` (the server instance UUID). Messages
|
|
25
|
+
* whose origin matches the local instance are dropped by the caller —
|
|
26
|
+
* the origin is forwarded intact to the `onMessage` callback.
|
|
27
|
+
*
|
|
28
|
+
* @example
|
|
29
|
+
* ```ts
|
|
30
|
+
* import { createRedisTransport } from '@lastshotlabs/bunshot'
|
|
31
|
+
*
|
|
32
|
+
* // Pass transport via ws.transport in createServer config:
|
|
33
|
+
* createServer({
|
|
34
|
+
* ws: {
|
|
35
|
+
* transport: createRedisTransport({ connection: { host: 'localhost', port: 6379 } }),
|
|
36
|
+
* endpoints: { '/ws': {} },
|
|
37
|
+
* },
|
|
38
|
+
* })
|
|
39
|
+
* ```
|
|
40
|
+
*/
|
|
41
|
+
export function createRedisTransport(opts) {
|
|
42
|
+
const channelPrefix = opts.channelPrefix ?? 'ws:room:';
|
|
43
|
+
let pubClient = null;
|
|
44
|
+
let subClient = null;
|
|
45
|
+
function buildClients() {
|
|
46
|
+
const Redis = requireIoredis();
|
|
47
|
+
const conn = opts.connection;
|
|
48
|
+
const pub = new Redis(conn);
|
|
49
|
+
const sub = new Redis(conn);
|
|
50
|
+
return { pub, sub };
|
|
51
|
+
}
|
|
52
|
+
function channelForKey(key) {
|
|
53
|
+
return `${channelPrefix}${key}`;
|
|
54
|
+
}
|
|
55
|
+
function keyFromChannel(channel) {
|
|
56
|
+
return channel.slice(channelPrefix.length);
|
|
57
|
+
}
|
|
58
|
+
return {
|
|
59
|
+
async publish(endpoint, room, message, origin) {
|
|
60
|
+
if (!pubClient)
|
|
61
|
+
throw new Error('[RedisTransport] Not connected — call connect() first');
|
|
62
|
+
const payload = JSON.stringify({ msg: message, origin });
|
|
63
|
+
await pubClient.publish(channelForKey(wsEndpointKey(endpoint, room)), payload);
|
|
64
|
+
},
|
|
65
|
+
async connect(onMessage) {
|
|
66
|
+
const { pub, sub } = buildClients();
|
|
67
|
+
pubClient = pub;
|
|
68
|
+
subClient = sub;
|
|
69
|
+
// psubscribe covers all rooms under the prefix — avoids per-room subscribe churn
|
|
70
|
+
await subClient.psubscribe(`${channelPrefix}*`);
|
|
71
|
+
subClient.on('pmessage', (_pattern, channel, rawPayload) => {
|
|
72
|
+
let parsed;
|
|
73
|
+
try {
|
|
74
|
+
parsed = JSON.parse(rawPayload);
|
|
75
|
+
}
|
|
76
|
+
catch {
|
|
77
|
+
// Malformed payload — skip silently
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
// Channel key is a wsEndpointKey composite — decode endpoint and room
|
|
81
|
+
const compositeKey = keyFromChannel(channel);
|
|
82
|
+
const colonIdx = compositeKey.indexOf(':');
|
|
83
|
+
if (colonIdx === -1)
|
|
84
|
+
return;
|
|
85
|
+
const endpoint = decodeURIComponent(compositeKey.slice(0, colonIdx));
|
|
86
|
+
const room = decodeURIComponent(compositeKey.slice(colonIdx + 1));
|
|
87
|
+
onMessage(endpoint, room, parsed.msg, parsed.origin);
|
|
88
|
+
});
|
|
89
|
+
},
|
|
90
|
+
async disconnect() {
|
|
91
|
+
if (subClient) {
|
|
92
|
+
// Force-close the subscriber connection. In ioredis, a client in
|
|
93
|
+
// subscribe mode will hang on quit() because it waits for pending
|
|
94
|
+
// subscribe-mode commands. disconnect() closes the socket immediately
|
|
95
|
+
// without waiting, which is safe at shutdown time.
|
|
96
|
+
subClient.disconnect();
|
|
97
|
+
subClient = null;
|
|
98
|
+
}
|
|
99
|
+
if (pubClient) {
|
|
100
|
+
// Use disconnect() for consistency — quit() can hang if ioredis is
|
|
101
|
+
// in the middle of a reconnect cycle and has queued commands.
|
|
102
|
+
pubClient.disconnect();
|
|
103
|
+
pubClient = null;
|
|
104
|
+
}
|
|
105
|
+
},
|
|
106
|
+
};
|
|
107
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Returns true if the Hono route pattern could match the given literal SSE path.
|
|
3
|
+
* Normalizes trailing slashes. Handles: exact match, :param segments,
|
|
4
|
+
* terminal wildcard *, catch-all /*, and prefix wildcard /path/*.
|
|
5
|
+
*/
|
|
6
|
+
export declare function routePatternCanMatchLiteral(pattern: string, literal: string): boolean;
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Returns true if the Hono route pattern could match the given literal SSE path.
|
|
3
|
+
* Normalizes trailing slashes. Handles: exact match, :param segments,
|
|
4
|
+
* terminal wildcard *, catch-all /*, and prefix wildcard /path/*.
|
|
5
|
+
*/
|
|
6
|
+
export function routePatternCanMatchLiteral(pattern, literal) {
|
|
7
|
+
const norm = (s) => s.replace(/\/+$/, '') || '/';
|
|
8
|
+
pattern = norm(pattern);
|
|
9
|
+
literal = norm(literal);
|
|
10
|
+
if (pattern === '/*' || pattern === '*')
|
|
11
|
+
return true;
|
|
12
|
+
const patSegs = pattern.split('/');
|
|
13
|
+
const litSegs = literal.split('/');
|
|
14
|
+
for (let i = 0; i < patSegs.length; i++) {
|
|
15
|
+
const p = patSegs[i];
|
|
16
|
+
if (p === '*')
|
|
17
|
+
return true; // terminal wildcard — rest matches
|
|
18
|
+
if (i >= litSegs.length)
|
|
19
|
+
return false;
|
|
20
|
+
if (p.startsWith(':'))
|
|
21
|
+
continue; // param segment — matches any
|
|
22
|
+
if (p !== litSegs[i])
|
|
23
|
+
return false; // literal mismatch
|
|
24
|
+
}
|
|
25
|
+
return patSegs.length === litSegs.length;
|
|
26
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export type { StorageAdapter, UploadResult } from '../../../packages/bunshot-core/src/index.js';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -10,11 +10,11 @@
|
|
|
10
10
|
*/
|
|
11
11
|
export function stripUnreferencedSchemas(spec) {
|
|
12
12
|
const schemas = spec?.components?.schemas;
|
|
13
|
-
if (!schemas || typeof schemas !==
|
|
13
|
+
if (!schemas || typeof schemas !== 'object')
|
|
14
14
|
return spec;
|
|
15
15
|
// Collect all $ref strings from an arbitrary JSON node
|
|
16
16
|
function collectRefs(node, refs) {
|
|
17
|
-
if (!node || typeof node !==
|
|
17
|
+
if (!node || typeof node !== 'object')
|
|
18
18
|
return;
|
|
19
19
|
if (Array.isArray(node)) {
|
|
20
20
|
for (const item of node)
|
|
@@ -22,7 +22,7 @@ export function stripUnreferencedSchemas(spec) {
|
|
|
22
22
|
return;
|
|
23
23
|
}
|
|
24
24
|
for (const [key, val] of Object.entries(node)) {
|
|
25
|
-
if (key ===
|
|
25
|
+
if (key === '$ref' && typeof val === 'string') {
|
|
26
26
|
refs.add(val);
|
|
27
27
|
}
|
|
28
28
|
else {
|
|
@@ -32,7 +32,7 @@ export function stripUnreferencedSchemas(spec) {
|
|
|
32
32
|
}
|
|
33
33
|
// Extract schema name from a $ref like "#/components/schemas/Foo"
|
|
34
34
|
function schemaNameFromRef(ref) {
|
|
35
|
-
const prefix =
|
|
35
|
+
const prefix = '#/components/schemas/';
|
|
36
36
|
return ref.startsWith(prefix) ? ref.slice(prefix.length) : null;
|
|
37
37
|
}
|
|
38
38
|
// Collect initial refs from paths (not from components to avoid circular bootstrapping)
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { Connection } from 'mongoose';
|
|
2
|
+
export interface TenantInfo {
|
|
3
|
+
tenantId: string;
|
|
4
|
+
displayName?: string;
|
|
5
|
+
config?: Record<string, unknown>;
|
|
6
|
+
createdAt: Date;
|
|
7
|
+
deletedAt?: Date | null;
|
|
8
|
+
}
|
|
9
|
+
export interface CreateTenantOptions {
|
|
10
|
+
displayName?: string;
|
|
11
|
+
config?: Record<string, unknown>;
|
|
12
|
+
}
|
|
13
|
+
export interface TenantService {
|
|
14
|
+
createTenant(tenantId: string, options?: CreateTenantOptions): Promise<void>;
|
|
15
|
+
deleteTenant(tenantId: string): Promise<void>;
|
|
16
|
+
getTenant(tenantId: string): Promise<TenantInfo | null>;
|
|
17
|
+
listTenants(): Promise<TenantInfo[]>;
|
|
18
|
+
}
|
|
19
|
+
export declare function createTenantService(conn: Connection, getTenantCache?: () => {
|
|
20
|
+
delete(tenantId: string): void;
|
|
21
|
+
} | null): TenantService;
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { getMongooseModule } from '../../lib/mongo';
|
|
2
|
+
function getTenantModel(conn) {
|
|
3
|
+
if (conn.models['Tenant']) {
|
|
4
|
+
return conn.models['Tenant'];
|
|
5
|
+
}
|
|
6
|
+
const mg = getMongooseModule();
|
|
7
|
+
const { Schema } = mg;
|
|
8
|
+
const schema = new Schema({
|
|
9
|
+
tenantId: { type: String, required: true, unique: true },
|
|
10
|
+
displayName: { type: String },
|
|
11
|
+
config: { type: Schema.Types.Mixed },
|
|
12
|
+
deletedAt: { type: Date, default: null },
|
|
13
|
+
}, { timestamps: true });
|
|
14
|
+
return conn.model('Tenant', schema);
|
|
15
|
+
}
|
|
16
|
+
export function createTenantService(conn, getTenantCache) {
|
|
17
|
+
return {
|
|
18
|
+
async createTenant(tenantId, options) {
|
|
19
|
+
const Tenant = getTenantModel(conn);
|
|
20
|
+
const existing = await Tenant.findOne({ tenantId }).lean();
|
|
21
|
+
if (existing && !existing.deletedAt) {
|
|
22
|
+
throw new Error(`Tenant "${tenantId}" already exists`);
|
|
23
|
+
}
|
|
24
|
+
if (existing && existing.deletedAt) {
|
|
25
|
+
// Reactivate soft-deleted tenant
|
|
26
|
+
await Tenant.findOneAndUpdate({ tenantId }, { $set: { deletedAt: null, displayName: options?.displayName, config: options?.config } });
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
await Tenant.create({
|
|
30
|
+
tenantId,
|
|
31
|
+
displayName: options?.displayName,
|
|
32
|
+
config: options?.config,
|
|
33
|
+
});
|
|
34
|
+
},
|
|
35
|
+
async deleteTenant(tenantId) {
|
|
36
|
+
const Tenant = getTenantModel(conn);
|
|
37
|
+
const existing = await Tenant.findOne({ tenantId }).lean();
|
|
38
|
+
// Already deleted (or never existed) — nothing to do
|
|
39
|
+
if (!existing || existing.deletedAt)
|
|
40
|
+
return;
|
|
41
|
+
// Soft-delete
|
|
42
|
+
await Tenant.findOneAndUpdate({ tenantId }, { $set: { deletedAt: new Date() } });
|
|
43
|
+
const cache = getTenantCache?.();
|
|
44
|
+
if (cache)
|
|
45
|
+
cache.delete(tenantId);
|
|
46
|
+
},
|
|
47
|
+
async getTenant(tenantId) {
|
|
48
|
+
const Tenant = getTenantModel(conn);
|
|
49
|
+
const doc = await Tenant.findOne({ tenantId, deletedAt: null }).lean();
|
|
50
|
+
if (!doc)
|
|
51
|
+
return null;
|
|
52
|
+
return {
|
|
53
|
+
tenantId: doc.tenantId,
|
|
54
|
+
displayName: doc.displayName,
|
|
55
|
+
config: doc.config,
|
|
56
|
+
createdAt: doc.createdAt,
|
|
57
|
+
};
|
|
58
|
+
},
|
|
59
|
+
async listTenants() {
|
|
60
|
+
const Tenant = getTenantModel(conn);
|
|
61
|
+
const docs = await Tenant.find({ deletedAt: null }).lean();
|
|
62
|
+
return docs.map(doc => ({
|
|
63
|
+
tenantId: doc.tenantId,
|
|
64
|
+
displayName: doc.displayName,
|
|
65
|
+
config: doc.config,
|
|
66
|
+
createdAt: doc.createdAt,
|
|
67
|
+
}));
|
|
68
|
+
},
|
|
69
|
+
};
|
|
70
|
+
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
import type {
|
|
3
|
-
import type {
|
|
1
|
+
import type { StorageAdapter, UploadResult } from '../lib/storageAdapter';
|
|
2
|
+
import type { Context } from 'hono';
|
|
3
|
+
import type { AppEnv } from '../../../packages/bunshot-core/src/index.js';
|
|
4
4
|
export interface UploadOpts {
|
|
5
5
|
field?: string | string[];
|
|
6
6
|
maxFileSize?: number;
|
|
@@ -13,27 +13,28 @@ export interface UploadOpts {
|
|
|
13
13
|
}) => string;
|
|
14
14
|
tenantScopedKeys?: boolean;
|
|
15
15
|
}
|
|
16
|
-
|
|
17
|
-
export declare const getStorageAdapter: () => StorageAdapter | null;
|
|
18
|
-
export declare const
|
|
19
|
-
export declare const getUploadConfig: () => UploadOpts;
|
|
16
|
+
type UploadCarrier = object;
|
|
17
|
+
export declare const getStorageAdapter: (input: UploadCarrier) => StorageAdapter | null;
|
|
18
|
+
export declare const getUploadConfig: (input: UploadCarrier) => UploadOpts;
|
|
20
19
|
export declare const generateUploadKey: (file: File, ctx: {
|
|
21
20
|
userId?: string;
|
|
22
21
|
tenantId?: string;
|
|
23
|
-
}, opts?: UploadOpts) => string;
|
|
22
|
+
}, opts?: UploadOpts, input?: UploadCarrier) => string;
|
|
24
23
|
export declare const generateUploadKeyFromFilename: (filename: string | undefined, ctx: {
|
|
25
24
|
userId?: string;
|
|
26
25
|
tenantId?: string;
|
|
27
|
-
}, opts?: UploadOpts) => string;
|
|
26
|
+
}, opts?: UploadOpts, input?: UploadCarrier) => string;
|
|
28
27
|
export declare const validateFile: (file: File, opts: {
|
|
29
28
|
maxFileSize?: number;
|
|
30
29
|
allowedMimeTypes?: string[];
|
|
31
|
-
}) => string | null;
|
|
30
|
+
}, input?: UploadCarrier) => string | null;
|
|
32
31
|
export declare const processUpload: (file: File, opts: UploadOpts & {
|
|
33
32
|
ctx?: {
|
|
34
33
|
userId?: string;
|
|
35
34
|
tenantId?: string;
|
|
36
35
|
};
|
|
37
36
|
bucket?: string;
|
|
37
|
+
carrier?: object;
|
|
38
38
|
}) => Promise<UploadResult>;
|
|
39
39
|
export declare const parseUpload: (c: Context<AppEnv>, opts?: UploadOpts) => Promise<UploadResult[]>;
|
|
40
|
+
export {};
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import { extname } from 'node:path';
|
|
2
|
+
import { HttpError, resolveContext } from '../../../packages/bunshot-core/src/index.js';
|
|
3
|
+
function getUploadState(input) {
|
|
4
|
+
const ctx = resolveContext(input);
|
|
5
|
+
const state = ctx.upload;
|
|
6
|
+
if (!state)
|
|
7
|
+
return { adapter: null, config: {} };
|
|
8
|
+
return {
|
|
9
|
+
adapter: state.adapter ?? null,
|
|
10
|
+
config: { ...state.config },
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
export const getStorageAdapter = (input) => getUploadState(input).adapter;
|
|
14
|
+
export const getUploadConfig = (input) => getUploadState(input).config;
|
|
15
|
+
function mergeUploadConfig(input, opts) {
|
|
16
|
+
const base = input ? getUploadConfig(input) : {};
|
|
17
|
+
return { ...base, ...opts };
|
|
18
|
+
}
|
|
19
|
+
export const generateUploadKey = (file, ctx, opts, input) => {
|
|
20
|
+
const merged = mergeUploadConfig(input, opts);
|
|
21
|
+
if (merged.generateKey)
|
|
22
|
+
return merged.generateKey(file, ctx);
|
|
23
|
+
const rawExt = extname(file.name);
|
|
24
|
+
const ext = /^\.[a-zA-Z0-9]{1,10}$/.test(rawExt) ? rawExt : '';
|
|
25
|
+
const uuid = crypto.randomUUID();
|
|
26
|
+
const prefix = merged.keyPrefix ?? 'uploads/';
|
|
27
|
+
const tenantPrefix = merged.tenantScopedKeys && ctx.tenantId ? `${ctx.tenantId}/` : '';
|
|
28
|
+
return `${prefix}${tenantPrefix}${uuid}${ext}`;
|
|
29
|
+
};
|
|
30
|
+
export const generateUploadKeyFromFilename = (filename, ctx, opts, input) => {
|
|
31
|
+
const merged = mergeUploadConfig(input, opts);
|
|
32
|
+
if (merged.generateKey) {
|
|
33
|
+
const stub = new File([], filename ?? 'upload');
|
|
34
|
+
return merged.generateKey(stub, ctx);
|
|
35
|
+
}
|
|
36
|
+
const rawExt = filename ? extname(filename) : '';
|
|
37
|
+
const ext = /^\.[a-zA-Z0-9]{1,10}$/.test(rawExt) ? rawExt : '';
|
|
38
|
+
const uuid = crypto.randomUUID();
|
|
39
|
+
const prefix = merged.keyPrefix ?? 'uploads/';
|
|
40
|
+
const tenantPrefix = merged.tenantScopedKeys && ctx.tenantId ? `${ctx.tenantId}/` : '';
|
|
41
|
+
return `${prefix}${tenantPrefix}${uuid}${ext}`;
|
|
42
|
+
};
|
|
43
|
+
const mimeMatches = (mimeType, pattern) => {
|
|
44
|
+
if (pattern.endsWith('/*')) {
|
|
45
|
+
return mimeType.startsWith(pattern.slice(0, -1));
|
|
46
|
+
}
|
|
47
|
+
return mimeType === pattern;
|
|
48
|
+
};
|
|
49
|
+
export const validateFile = (file, opts, input) => {
|
|
50
|
+
const merged = mergeUploadConfig(input, opts);
|
|
51
|
+
const maxFileSize = merged.maxFileSize ?? 10 * 1024 * 1024;
|
|
52
|
+
if (file.size > maxFileSize) {
|
|
53
|
+
return `File "${file.name}" exceeds maximum size of ${maxFileSize} bytes`;
|
|
54
|
+
}
|
|
55
|
+
const allowedMimeTypes = merged.allowedMimeTypes;
|
|
56
|
+
if (allowedMimeTypes && allowedMimeTypes.length > 0) {
|
|
57
|
+
const allowed = allowedMimeTypes.some(pattern => mimeMatches(file.type, pattern));
|
|
58
|
+
if (!allowed) {
|
|
59
|
+
return `File "${file.name}" has disallowed MIME type "${file.type}"`;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
return null;
|
|
63
|
+
};
|
|
64
|
+
export const processUpload = async (file, opts) => {
|
|
65
|
+
const carrier = opts.carrier;
|
|
66
|
+
const adapter = carrier ? getStorageAdapter(carrier) : null;
|
|
67
|
+
if (!adapter)
|
|
68
|
+
throw new HttpError(500, 'No storage adapter configured');
|
|
69
|
+
const validationError = validateFile(file, opts, carrier);
|
|
70
|
+
if (validationError)
|
|
71
|
+
throw new HttpError(400, validationError);
|
|
72
|
+
const key = generateUploadKey(file, opts.ctx ?? {}, opts, carrier);
|
|
73
|
+
const { url } = await adapter.put(key, file, {
|
|
74
|
+
mimeType: file.type,
|
|
75
|
+
size: file.size,
|
|
76
|
+
bucket: opts.bucket,
|
|
77
|
+
});
|
|
78
|
+
if (carrier) {
|
|
79
|
+
const { registerUpload } = await import('../lib/uploadRegistry');
|
|
80
|
+
await registerUpload({
|
|
81
|
+
key,
|
|
82
|
+
ownerUserId: opts.ctx?.userId,
|
|
83
|
+
tenantId: opts.ctx?.tenantId,
|
|
84
|
+
mimeType: file.type,
|
|
85
|
+
bucket: opts.bucket,
|
|
86
|
+
createdAt: Date.now(),
|
|
87
|
+
}, carrier);
|
|
88
|
+
}
|
|
89
|
+
return {
|
|
90
|
+
key,
|
|
91
|
+
originalName: file.name,
|
|
92
|
+
mimeType: file.type,
|
|
93
|
+
size: file.size,
|
|
94
|
+
...(url !== undefined ? { url } : {}),
|
|
95
|
+
};
|
|
96
|
+
};
|
|
97
|
+
export const parseUpload = async (c, opts) => {
|
|
98
|
+
const bunshotCtx = c.get('bunshotCtx');
|
|
99
|
+
const merged = mergeUploadConfig(bunshotCtx, opts);
|
|
100
|
+
const fields = merged.field
|
|
101
|
+
? Array.isArray(merged.field)
|
|
102
|
+
? merged.field
|
|
103
|
+
: [merged.field]
|
|
104
|
+
: ['file'];
|
|
105
|
+
const maxFiles = merged.maxFiles ?? 10;
|
|
106
|
+
const body = await c.req.parseBody({ all: true });
|
|
107
|
+
const results = [];
|
|
108
|
+
const userId = c.get('authUserId') ?? undefined;
|
|
109
|
+
const tenantId = c.get('tenantId') ?? undefined;
|
|
110
|
+
const bucket = c.get('uploadBucket');
|
|
111
|
+
for (const field of fields) {
|
|
112
|
+
const raw = body[field];
|
|
113
|
+
if (!raw)
|
|
114
|
+
continue;
|
|
115
|
+
const files = Array.isArray(raw) ? raw : [raw];
|
|
116
|
+
for (const f of files) {
|
|
117
|
+
if (!(f instanceof File))
|
|
118
|
+
continue;
|
|
119
|
+
if (results.length >= maxFiles) {
|
|
120
|
+
throw new HttpError(400, `Too many files. Maximum is ${maxFiles}`);
|
|
121
|
+
}
|
|
122
|
+
const result = await processUpload(f, {
|
|
123
|
+
...merged,
|
|
124
|
+
ctx: { userId, tenantId },
|
|
125
|
+
bucket: bucket ?? undefined,
|
|
126
|
+
carrier: bunshotCtx,
|
|
127
|
+
});
|
|
128
|
+
results.push(result);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
return results;
|
|
132
|
+
};
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { UploadRecord } from '../../../packages/bunshot-core/src/index.js';
|
|
2
|
+
export type { UploadRecord };
|
|
3
|
+
/**
|
|
4
|
+
* Store a new upload record. Keyed by the storage key.
|
|
5
|
+
*
|
|
6
|
+
* @param record - The upload record to store
|
|
7
|
+
* @param app - The Hono app instance (required — used to resolve the context)
|
|
8
|
+
*/
|
|
9
|
+
export declare const registerUpload: (record: UploadRecord, app: object) => Promise<void>;
|
|
10
|
+
/**
|
|
11
|
+
* Retrieve an upload record by key. Returns null if not found.
|
|
12
|
+
*
|
|
13
|
+
* @param key - The storage key
|
|
14
|
+
* @param app - The Hono app instance (required — used to resolve the context)
|
|
15
|
+
*/
|
|
16
|
+
export declare const getUploadRecord: (key: string, app: object) => Promise<UploadRecord | null>;
|
|
17
|
+
/**
|
|
18
|
+
* Delete an upload record by key. Returns true if it existed.
|
|
19
|
+
*
|
|
20
|
+
* @param key - The storage key
|
|
21
|
+
* @param app - The Hono app instance (required — used to resolve the context)
|
|
22
|
+
*/
|
|
23
|
+
export declare const deleteUploadRecord: (key: string, app: object) => Promise<boolean>;
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
// ---------------------------------------------------------------------------
|
|
2
|
+
// Upload Registry — thin wrappers that consume repositories from context
|
|
3
|
+
// ---------------------------------------------------------------------------
|
|
4
|
+
import { resolveContext } from '../../../packages/bunshot-core/src/index.js';
|
|
5
|
+
/**
|
|
6
|
+
* Store a new upload record. Keyed by the storage key.
|
|
7
|
+
*
|
|
8
|
+
* @param record - The upload record to store
|
|
9
|
+
* @param app - The Hono app instance (required — used to resolve the context)
|
|
10
|
+
*/
|
|
11
|
+
export const registerUpload = async (record, app) => {
|
|
12
|
+
const ctx = resolveContext(app);
|
|
13
|
+
await ctx.persistence.uploadRegistry.register(record);
|
|
14
|
+
};
|
|
15
|
+
/**
|
|
16
|
+
* Retrieve an upload record by key. Returns null if not found.
|
|
17
|
+
*
|
|
18
|
+
* @param key - The storage key
|
|
19
|
+
* @param app - The Hono app instance (required — used to resolve the context)
|
|
20
|
+
*/
|
|
21
|
+
export const getUploadRecord = async (key, app) => {
|
|
22
|
+
const ctx = resolveContext(app);
|
|
23
|
+
return ctx.persistence.uploadRegistry.get(key);
|
|
24
|
+
};
|
|
25
|
+
/**
|
|
26
|
+
* Delete an upload record by key. Returns true if it existed.
|
|
27
|
+
*
|
|
28
|
+
* @param key - The storage key
|
|
29
|
+
* @param app - The Hono app instance (required — used to resolve the context)
|
|
30
|
+
*/
|
|
31
|
+
export const deleteUploadRecord = async (key, app) => {
|
|
32
|
+
const ctx = resolveContext(app);
|
|
33
|
+
return ctx.persistence.uploadRegistry.delete(key);
|
|
34
|
+
};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { z } from
|
|
1
|
+
import { z } from 'zod';
|
|
2
2
|
export declare const validate: <T extends z.ZodType>(schema: T, req: Request) => Promise<z.output<T>>;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { z } from
|
|
2
|
-
import { ValidationError } from
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { ValidationError } from '../../../packages/bunshot-core/src/index.js';
|
|
3
3
|
export const validate = async (schema, req) => {
|
|
4
4
|
try {
|
|
5
5
|
const body = await req.json();
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { ServerWebSocket } from 'bun';
|
|
2
|
+
import type { WsState } from '../../../packages/bunshot-core/src/index.js';
|
|
3
|
+
type WithRooms = {
|
|
4
|
+
rooms: Set<string>;
|
|
5
|
+
};
|
|
6
|
+
type WithSocketId = {
|
|
7
|
+
id: string;
|
|
8
|
+
endpoint: string;
|
|
9
|
+
} & WithRooms;
|
|
10
|
+
type RoomGuard<T extends WithRooms> = (ws: ServerWebSocket<T>, room: string) => boolean | Promise<boolean>;
|
|
11
|
+
export declare const publish: (state: WsState, endpoint: string, room: string, data: unknown) => void;
|
|
12
|
+
export declare const getRooms: (state: WsState, endpoint: string) => string[];
|
|
13
|
+
export declare const getRoomSubscribers: (state: WsState, endpoint: string, room: string) => string[];
|
|
14
|
+
export declare const handleRoomActions: <T extends WithSocketId>(state: WsState, ws: ServerWebSocket<T>, message: string | Buffer, onSubscribe?: RoomGuard<T>) => Promise<boolean>;
|
|
15
|
+
export declare const subscribe: <T extends WithSocketId>(state: WsState, ws: ServerWebSocket<T>, room: string) => void;
|
|
16
|
+
export declare const unsubscribe: <T extends WithSocketId>(state: WsState, ws: ServerWebSocket<T>, room: string) => void;
|
|
17
|
+
export declare const getSubscriptions: <T extends WithRooms>(ws: ServerWebSocket<T>) => string[];
|
|
18
|
+
export declare const cleanupSocket: <T extends WithSocketId>(state: WsState, ws: ServerWebSocket<T>) => void;
|
|
19
|
+
export {};
|