@lastshotlabs/bunshot 0.0.25 → 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/packages/bunshot-auth/src/lib/breachedPassword.d.ts +19 -0
- package/dist/packages/bunshot-auth/src/lib/breachedPassword.js +61 -0
- 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/packages/bunshot-auth/src/lib/logger.d.ts +3 -0
- package/dist/packages/bunshot-auth/src/lib/logger.js +13 -0
- package/dist/packages/bunshot-auth/src/lib/m2m.d.ts +30 -0
- package/dist/packages/bunshot-auth/src/lib/m2m.js +44 -0
- 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/packages/bunshot-auth/src/lib/scim.d.ts +44 -0
- package/dist/packages/bunshot-auth/src/lib/scim.js +56 -0
- 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/packages/bunshot-auth/src/lib/suspension.d.ts +14 -0
- package/dist/packages/bunshot-auth/src/lib/suspension.js +20 -0
- 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 -7
- 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/packages/bunshot-auth/src/middleware/requireScope.d.ts +10 -0
- package/dist/packages/bunshot-auth/src/middleware/requireScope.js +25 -0
- package/dist/packages/bunshot-auth/src/middleware/requireStepUp.d.ts +18 -0
- package/dist/packages/bunshot-auth/src/middleware/requireStepUp.js +30 -0
- 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 +19 -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/packages/bunshot-auth/src/models/M2MClient.d.ts +18 -0
- package/dist/packages/bunshot-auth/src/models/M2MClient.js +18 -0
- 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/packages/bunshot-core/src/captcha.d.ts +16 -0
- 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/packages/bunshot-core/src/errors.d.ts +13 -0
- package/dist/packages/bunshot-core/src/errors.js +22 -0
- 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 +23 -8
- 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/src/framework/lib/captcha.js +40 -0
- 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 +14 -9
- 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/src/framework/middleware/captcha.d.ts +9 -0
- package/dist/src/framework/middleware/captcha.js +37 -0
- package/dist/{middleware → src/framework/middleware}/errorHandler.d.ts +1 -1
- package/dist/src/framework/middleware/errorHandler.js +16 -0
- 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 -19
- 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 -11
- 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/src/framework/routes/jobs.js +315 -0
- package/dist/src/framework/routes/metrics.d.ts +10 -0
- package/dist/src/framework/routes/metrics.js +57 -0
- package/dist/src/framework/routes/uploads.d.ts +14 -0
- 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/src/lib/authConfig.js +179 -0
- package/dist/{lib → src/lib}/context.d.ts +6 -7
- 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 +40 -10
- package/dist/src/testing.d.ts +34 -0
- package/dist/src/testing.js +93 -0
- package/package.json +62 -25
- package/dist/adapters/memoryAuth.d.ts +0 -46
- package/dist/adapters/memoryAuth.js +0 -634
- 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 -307
- package/dist/adapters/sqliteAuth.d.ts +0 -49
- package/dist/adapters/sqliteAuth.js +0 -707
- package/dist/app.d.ts +0 -456
- package/dist/app.js +0 -548
- 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 -98
- package/dist/index.js +0 -77
- package/dist/lib/HttpError.d.ts +0 -9
- package/dist/lib/HttpError.js +0 -14
- package/dist/lib/appConfig.d.ts +0 -162
- package/dist/lib/appConfig.js +0 -83
- package/dist/lib/auditLog.d.ts +0 -52
- package/dist/lib/auditLog.js +0 -201
- package/dist/lib/authAdapter.d.ts +0 -176
- package/dist/lib/authAdapter.js +0 -7
- package/dist/lib/authRateLimit.d.ts +0 -13
- package/dist/lib/authRateLimit.js +0 -81
- package/dist/lib/clientIp.d.ts +0 -14
- 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 -13
- package/dist/lib/emailVerification.js +0 -86
- package/dist/lib/fingerprint.js +0 -36
- package/dist/lib/idempotency.js +0 -182
- package/dist/lib/jwt.d.ts +0 -2
- package/dist/lib/jwt.js +0 -24
- package/dist/lib/logger.d.ts +0 -1
- package/dist/lib/logger.js +0 -7
- package/dist/lib/metrics.d.ts +0 -14
- package/dist/lib/mfaChallenge.d.ts +0 -42
- package/dist/lib/mfaChallenge.js +0 -293
- 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 -90
- 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 -91
- package/dist/lib/roles.d.ts +0 -7
- package/dist/lib/roles.js +0 -49
- package/dist/lib/session.d.ts +0 -39
- package/dist/lib/session.js +0 -535
- package/dist/lib/tenant.d.ts +0 -15
- package/dist/lib/tenant.js +0 -65
- package/dist/lib/upload.js +0 -87
- package/dist/lib/ws.d.ts +0 -22
- package/dist/lib/ws.js +0 -89
- 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/csrf.js +0 -125
- package/dist/middleware/errorHandler.js +0 -13
- package/dist/middleware/identify.d.ts +0 -3
- package/dist/middleware/identify.js +0 -95
- 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/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 -48
- 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 -11
- package/dist/routes/auth.js +0 -605
- 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/jobs.js +0 -272
- package/dist/routes/metrics.d.ts +0 -7
- package/dist/routes/metrics.js +0 -52
- package/dist/routes/mfa.d.ts +0 -5
- package/dist/routes/mfa.js +0 -620
- package/dist/routes/oauth.d.ts +0 -2
- package/dist/routes/oauth.js +0 -514
- package/dist/routes/uploads.d.ts +0 -2
- package/dist/routes/uploads.js +0 -135
- 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 -27
- package/dist/services/auth.js +0 -159
- package/dist/ws/index.d.ts +0 -10
- package/dist/ws/index.js +0 -38
- 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 -779
- package/docs/sections/auth-flow/overview.md +0 -10
- package/docs/sections/auth-security-examples/full.md +0 -365
- 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 -127
- 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/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 -199
- package/docs/sections/versioning/full.md +0 -85
- package/docs/sections/webhook-auth/full.md +0 -100
- package/docs/sections/websocket/full.md +0 -184
- 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-core/src}/constants.d.ts +0 -0
- /package/dist/{lib → packages/bunshot-core/src}/storageAdapter.d.ts +0 -0
- /package/dist/{lib → src/framework/lib}/createDtoMapper.d.ts +0 -0
- /package/dist/{lib → src/framework/lib}/stripUnreferencedSchemas.d.ts +0 -0
- /package/dist/{middleware → src/framework/middleware}/cors.d.ts +0 -0
- /package/dist/{middleware → src/framework/middleware}/cors.js +0 -0
- /package/dist/{middleware → src/framework/middleware}/index.d.ts +0 -0
- /package/dist/{middleware → src/framework/middleware}/logger.js +0 -0
- /package/dist/{lib → src/shared/lib}/constants.js +0 -0
package/dist/lib/upload.js
DELETED
|
@@ -1,87 +0,0 @@
|
|
|
1
|
-
import { HttpError } from "./HttpError";
|
|
2
|
-
import { extname } from "node:path";
|
|
3
|
-
let _adapter = null;
|
|
4
|
-
let _config = {};
|
|
5
|
-
export const setStorageAdapter = (adapter) => { _adapter = adapter; };
|
|
6
|
-
export const getStorageAdapter = () => _adapter;
|
|
7
|
-
export const setUploadConfig = (config) => { _config = config; };
|
|
8
|
-
export const getUploadConfig = () => _config;
|
|
9
|
-
export const generateUploadKey = (file, ctx, opts) => {
|
|
10
|
-
const merged = { ..._config, ...opts };
|
|
11
|
-
if (merged.generateKey)
|
|
12
|
-
return merged.generateKey(file, ctx);
|
|
13
|
-
const ext = extname(file.name);
|
|
14
|
-
const uuid = crypto.randomUUID();
|
|
15
|
-
const prefix = merged.keyPrefix ?? "uploads/";
|
|
16
|
-
const tenantPrefix = merged.tenantScopedKeys && ctx.tenantId ? `${ctx.tenantId}/` : "";
|
|
17
|
-
return `${prefix}${tenantPrefix}${uuid}${ext}`;
|
|
18
|
-
};
|
|
19
|
-
const mimeMatches = (mimeType, pattern) => {
|
|
20
|
-
if (pattern.endsWith("/*")) {
|
|
21
|
-
return mimeType.startsWith(pattern.slice(0, -1));
|
|
22
|
-
}
|
|
23
|
-
return mimeType === pattern;
|
|
24
|
-
};
|
|
25
|
-
export const validateFile = (file, opts) => {
|
|
26
|
-
const maxFileSize = opts.maxFileSize ?? _config.maxFileSize ?? 10 * 1024 * 1024;
|
|
27
|
-
if (file.size > maxFileSize) {
|
|
28
|
-
return `File "${file.name}" exceeds maximum size of ${maxFileSize} bytes`;
|
|
29
|
-
}
|
|
30
|
-
const allowedMimeTypes = opts.allowedMimeTypes ?? _config.allowedMimeTypes;
|
|
31
|
-
if (allowedMimeTypes && allowedMimeTypes.length > 0) {
|
|
32
|
-
const allowed = allowedMimeTypes.some((pattern) => mimeMatches(file.type, pattern));
|
|
33
|
-
if (!allowed) {
|
|
34
|
-
return `File "${file.name}" has disallowed MIME type "${file.type}"`;
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
return null;
|
|
38
|
-
};
|
|
39
|
-
export const processUpload = async (file, opts) => {
|
|
40
|
-
const adapter = _adapter;
|
|
41
|
-
if (!adapter)
|
|
42
|
-
throw new HttpError(500, "No storage adapter configured");
|
|
43
|
-
const validationError = validateFile(file, opts);
|
|
44
|
-
if (validationError)
|
|
45
|
-
throw new HttpError(400, validationError);
|
|
46
|
-
const key = generateUploadKey(file, opts.ctx ?? {}, opts);
|
|
47
|
-
const { url } = await adapter.put(key, file, {
|
|
48
|
-
mimeType: file.type,
|
|
49
|
-
size: file.size,
|
|
50
|
-
bucket: opts.bucket,
|
|
51
|
-
});
|
|
52
|
-
return {
|
|
53
|
-
key,
|
|
54
|
-
originalName: file.name,
|
|
55
|
-
mimeType: file.type,
|
|
56
|
-
size: file.size,
|
|
57
|
-
...(url !== undefined ? { url } : {}),
|
|
58
|
-
};
|
|
59
|
-
};
|
|
60
|
-
export const parseUpload = async (c, opts) => {
|
|
61
|
-
const merged = { ..._config, ...opts };
|
|
62
|
-
const fields = merged.field
|
|
63
|
-
? (Array.isArray(merged.field) ? merged.field : [merged.field])
|
|
64
|
-
: ["file"];
|
|
65
|
-
const maxFiles = merged.maxFiles ?? 10;
|
|
66
|
-
const body = await c.req.parseBody({ all: true });
|
|
67
|
-
const results = [];
|
|
68
|
-
const userId = c.get("authUserId") ?? undefined;
|
|
69
|
-
const tenantId = c.get("tenantId") ?? undefined;
|
|
70
|
-
const bucket = c.get("uploadBucket");
|
|
71
|
-
for (const field of fields) {
|
|
72
|
-
const raw = body[field];
|
|
73
|
-
if (!raw)
|
|
74
|
-
continue;
|
|
75
|
-
const files = Array.isArray(raw) ? raw : [raw];
|
|
76
|
-
for (const f of files) {
|
|
77
|
-
if (!(f instanceof File))
|
|
78
|
-
continue;
|
|
79
|
-
if (results.length >= maxFiles) {
|
|
80
|
-
throw new HttpError(400, `Too many files. Maximum is ${maxFiles}`);
|
|
81
|
-
}
|
|
82
|
-
const result = await processUpload(f, { ...merged, ctx: { userId, tenantId }, bucket: bucket ?? undefined });
|
|
83
|
-
results.push(result);
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
return results;
|
|
87
|
-
};
|
package/dist/lib/ws.d.ts
DELETED
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
import type { Server, ServerWebSocket } from "bun";
|
|
2
|
-
type WithRooms = {
|
|
3
|
-
rooms: Set<string>;
|
|
4
|
-
};
|
|
5
|
-
type WithSocketId = {
|
|
6
|
-
id: string;
|
|
7
|
-
} & WithRooms;
|
|
8
|
-
export declare const setWsServer: (server: Server<any>) => void;
|
|
9
|
-
export declare const setPresenceEnabled: (enabled: boolean) => void;
|
|
10
|
-
export declare const publish: (topic: string, data: unknown) => void;
|
|
11
|
-
/** All rooms that currently have at least one subscriber */
|
|
12
|
-
export declare const getRooms: () => string[];
|
|
13
|
-
/** Socket IDs subscribed to a given room */
|
|
14
|
-
export declare const getRoomSubscribers: (room: string) => string[];
|
|
15
|
-
type RoomGuard<T extends WithRooms> = (ws: ServerWebSocket<T>, room: string) => boolean | Promise<boolean>;
|
|
16
|
-
export declare const handleRoomActions: <T extends WithSocketId>(ws: ServerWebSocket<T>, message: string | Buffer, onSubscribe?: RoomGuard<T>) => Promise<boolean>;
|
|
17
|
-
export declare const subscribe: <T extends WithSocketId>(ws: ServerWebSocket<T>, room: string) => void;
|
|
18
|
-
export declare const unsubscribe: <T extends WithSocketId>(ws: ServerWebSocket<T>, room: string) => void;
|
|
19
|
-
export declare const getSubscriptions: <T extends WithRooms>(ws: ServerWebSocket<T>) => string[];
|
|
20
|
-
/** Called on socket close to prune the registry. Internal use only. */
|
|
21
|
-
export declare const cleanupSocket: (socketId: string, rooms: Set<string>) => void;
|
|
22
|
-
export {};
|
package/dist/lib/ws.js
DELETED
|
@@ -1,89 +0,0 @@
|
|
|
1
|
-
import { addPresence, removePresence, cleanupPresence } from "./wsPresence";
|
|
2
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
3
|
-
let _server = null;
|
|
4
|
-
let _presenceEnabled = false;
|
|
5
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
6
|
-
export const setWsServer = (server) => { _server = server; };
|
|
7
|
-
export const setPresenceEnabled = (enabled) => { _presenceEnabled = enabled; };
|
|
8
|
-
export const publish = (topic, data) => {
|
|
9
|
-
_server?.publish(topic, JSON.stringify(data));
|
|
10
|
-
};
|
|
11
|
-
/** room → Set of socket IDs */
|
|
12
|
-
const _roomRegistry = new Map();
|
|
13
|
-
/** All rooms that currently have at least one subscriber */
|
|
14
|
-
export const getRooms = () => [..._roomRegistry.keys()];
|
|
15
|
-
/** Socket IDs subscribed to a given room */
|
|
16
|
-
export const getRoomSubscribers = (room) => [...(_roomRegistry.get(room) ?? [])];
|
|
17
|
-
const MAX_ROOM_ACTION_SIZE = 4096; // 4 KB — room actions are small JSON payloads
|
|
18
|
-
export const handleRoomActions = async (ws, message, onSubscribe) => {
|
|
19
|
-
try {
|
|
20
|
-
const raw = typeof message === "string" ? message : Buffer.from(message).toString();
|
|
21
|
-
if (raw.length > MAX_ROOM_ACTION_SIZE)
|
|
22
|
-
return false; // not a room action
|
|
23
|
-
const data = JSON.parse(raw);
|
|
24
|
-
if (data.action === "subscribe" && typeof data.room === "string") {
|
|
25
|
-
if (onSubscribe && !(await onSubscribe(ws, data.room))) {
|
|
26
|
-
ws.send(JSON.stringify({ event: "subscribe_denied", room: data.room }));
|
|
27
|
-
}
|
|
28
|
-
else {
|
|
29
|
-
subscribe(ws, data.room);
|
|
30
|
-
ws.send(JSON.stringify({ event: "subscribed", room: data.room }));
|
|
31
|
-
}
|
|
32
|
-
return true;
|
|
33
|
-
}
|
|
34
|
-
if (data.action === "unsubscribe" && typeof data.room === "string") {
|
|
35
|
-
unsubscribe(ws, data.room);
|
|
36
|
-
ws.send(JSON.stringify({ event: "unsubscribed", room: data.room }));
|
|
37
|
-
return true;
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
catch { /* not JSON */ }
|
|
41
|
-
return false;
|
|
42
|
-
};
|
|
43
|
-
export const subscribe = (ws, room) => {
|
|
44
|
-
ws.subscribe(room);
|
|
45
|
-
ws.data.rooms.add(room);
|
|
46
|
-
if (!_roomRegistry.has(room))
|
|
47
|
-
_roomRegistry.set(room, new Set());
|
|
48
|
-
_roomRegistry.get(room).add(ws.data.id);
|
|
49
|
-
if (_presenceEnabled) {
|
|
50
|
-
const result = addPresence(ws.data.id, room);
|
|
51
|
-
if (result?.isNewUser) {
|
|
52
|
-
publish(room, { event: "presence_join", room, userId: result.userId });
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
};
|
|
56
|
-
export const unsubscribe = (ws, room) => {
|
|
57
|
-
ws.unsubscribe(room);
|
|
58
|
-
ws.data.rooms.delete(room);
|
|
59
|
-
const ids = _roomRegistry.get(room);
|
|
60
|
-
if (ids) {
|
|
61
|
-
ids.delete(ws.data.id);
|
|
62
|
-
if (ids.size === 0)
|
|
63
|
-
_roomRegistry.delete(room);
|
|
64
|
-
}
|
|
65
|
-
if (_presenceEnabled) {
|
|
66
|
-
const result = removePresence(ws.data.id, room);
|
|
67
|
-
if (result?.isLastSocket) {
|
|
68
|
-
publish(room, { event: "presence_leave", room, userId: result.userId });
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
};
|
|
72
|
-
export const getSubscriptions = (ws) => [...ws.data.rooms];
|
|
73
|
-
/** Called on socket close to prune the registry. Internal use only. */
|
|
74
|
-
export const cleanupSocket = (socketId, rooms) => {
|
|
75
|
-
if (_presenceEnabled) {
|
|
76
|
-
const departed = cleanupPresence(socketId, rooms);
|
|
77
|
-
for (const { room, userId } of departed) {
|
|
78
|
-
publish(room, { event: "presence_leave", room, userId });
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
for (const room of rooms) {
|
|
82
|
-
const ids = _roomRegistry.get(room);
|
|
83
|
-
if (ids) {
|
|
84
|
-
ids.delete(socketId);
|
|
85
|
-
if (ids.size === 0)
|
|
86
|
-
_roomRegistry.delete(room);
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
};
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import type { ServerWebSocket } from "bun";
|
|
2
|
-
export interface HeartbeatConfig {
|
|
3
|
-
intervalMs?: number;
|
|
4
|
-
timeoutMs?: number;
|
|
5
|
-
}
|
|
6
|
-
export declare const registerSocket: (ws: ServerWebSocket<any>, id: string) => void;
|
|
7
|
-
export declare const deregisterSocket: (id: string) => void;
|
|
8
|
-
export declare const handlePong: (id: string) => void;
|
|
9
|
-
export declare const startHeartbeat: (config?: HeartbeatConfig | boolean) => void;
|
|
10
|
-
export declare const stopHeartbeat: () => void;
|
|
11
|
-
/** Reset all heartbeat state. Useful for test isolation. */
|
|
12
|
-
export declare const clearHeartbeatState: () => void;
|
package/dist/lib/wsHeartbeat.js
DELETED
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
// ---------------------------------------------------------------------------
|
|
2
|
-
// State
|
|
3
|
-
// ---------------------------------------------------------------------------
|
|
4
|
-
/** All live sockets — socketId → ServerWebSocket */
|
|
5
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
6
|
-
const _activeSockets = new Map();
|
|
7
|
-
/** socketId → last pong timestamp (epoch ms) */
|
|
8
|
-
const _lastPong = new Map();
|
|
9
|
-
let _pingInterval = null;
|
|
10
|
-
const DEFAULT_INTERVAL_MS = 30_000;
|
|
11
|
-
const DEFAULT_TIMEOUT_MS = 10_000;
|
|
12
|
-
// ---------------------------------------------------------------------------
|
|
13
|
-
// Public API
|
|
14
|
-
// ---------------------------------------------------------------------------
|
|
15
|
-
export const registerSocket = (ws, id) => {
|
|
16
|
-
_activeSockets.set(id, ws);
|
|
17
|
-
_lastPong.set(id, Date.now());
|
|
18
|
-
};
|
|
19
|
-
export const deregisterSocket = (id) => {
|
|
20
|
-
_activeSockets.delete(id);
|
|
21
|
-
_lastPong.delete(id);
|
|
22
|
-
};
|
|
23
|
-
export const handlePong = (id) => {
|
|
24
|
-
_lastPong.set(id, Date.now());
|
|
25
|
-
};
|
|
26
|
-
export const startHeartbeat = (config) => {
|
|
27
|
-
if (_pingInterval)
|
|
28
|
-
return; // already running
|
|
29
|
-
const opts = typeof config === "object" ? config : {};
|
|
30
|
-
const intervalMs = opts.intervalMs ?? DEFAULT_INTERVAL_MS;
|
|
31
|
-
const timeoutMs = opts.timeoutMs ?? DEFAULT_TIMEOUT_MS;
|
|
32
|
-
_pingInterval = setInterval(() => {
|
|
33
|
-
const now = Date.now();
|
|
34
|
-
for (const [id, ws] of _activeSockets) {
|
|
35
|
-
const lastPong = _lastPong.get(id) ?? 0;
|
|
36
|
-
if (now - lastPong > timeoutMs) {
|
|
37
|
-
ws.close(1001, "Heartbeat timeout");
|
|
38
|
-
// deregisterSocket will be called by the close handler
|
|
39
|
-
}
|
|
40
|
-
else {
|
|
41
|
-
ws.ping();
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
}, intervalMs);
|
|
45
|
-
};
|
|
46
|
-
export const stopHeartbeat = () => {
|
|
47
|
-
if (_pingInterval) {
|
|
48
|
-
clearInterval(_pingInterval);
|
|
49
|
-
_pingInterval = null;
|
|
50
|
-
}
|
|
51
|
-
};
|
|
52
|
-
/** Reset all heartbeat state. Useful for test isolation. */
|
|
53
|
-
export const clearHeartbeatState = () => {
|
|
54
|
-
stopHeartbeat();
|
|
55
|
-
_activeSockets.clear();
|
|
56
|
-
_lastPong.clear();
|
|
57
|
-
};
|
package/dist/lib/wsMessages.d.ts
DELETED
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
export interface StoredMessage {
|
|
2
|
-
id: string;
|
|
3
|
-
room: string;
|
|
4
|
-
senderId: string | null;
|
|
5
|
-
payload: unknown;
|
|
6
|
-
createdAt: number;
|
|
7
|
-
}
|
|
8
|
-
export type WsMessageStore = "redis" | "mongo" | "sqlite" | "memory";
|
|
9
|
-
export interface WsMessageDefaults {
|
|
10
|
-
maxCount?: number;
|
|
11
|
-
ttlSeconds?: number;
|
|
12
|
-
}
|
|
13
|
-
export interface RoomPersistenceConfig {
|
|
14
|
-
persist: boolean;
|
|
15
|
-
maxCount?: number;
|
|
16
|
-
ttlSeconds?: number;
|
|
17
|
-
}
|
|
18
|
-
export declare const setWsMessageStore: (store: WsMessageStore) => void;
|
|
19
|
-
export declare const setWsMessageDefaults: (defaults: WsMessageDefaults) => void;
|
|
20
|
-
/** Opt a room into message persistence. */
|
|
21
|
-
export declare const configureRoom: (room: string, options: RoomPersistenceConfig) => void;
|
|
22
|
-
/**
|
|
23
|
-
* Persist a message to a room. Returns null if room is not configured for persistence.
|
|
24
|
-
* On store errors, logs a warning and returns null (non-blocking).
|
|
25
|
-
*/
|
|
26
|
-
export declare const persistMessage: (room: string, data: {
|
|
27
|
-
senderId?: string | null;
|
|
28
|
-
payload: unknown;
|
|
29
|
-
}) => Promise<StoredMessage | null>;
|
|
30
|
-
/**
|
|
31
|
-
* Get message history for a room.
|
|
32
|
-
* Cursor-based pagination using message `id` as cursor.
|
|
33
|
-
*/
|
|
34
|
-
export declare const getMessageHistory: (room: string, opts?: {
|
|
35
|
-
limit?: number;
|
|
36
|
-
before?: string;
|
|
37
|
-
after?: string;
|
|
38
|
-
}) => Promise<StoredMessage[]>;
|
|
39
|
-
/** Reset memory store. Useful for test isolation. */
|
|
40
|
-
export declare const clearWsMessageMemoryStore: () => void;
|
package/dist/lib/wsMessages.js
DELETED
|
@@ -1,330 +0,0 @@
|
|
|
1
|
-
// ---------------------------------------------------------------------------
|
|
2
|
-
// Types
|
|
3
|
-
// ---------------------------------------------------------------------------
|
|
4
|
-
// ---------------------------------------------------------------------------
|
|
5
|
-
// State
|
|
6
|
-
// ---------------------------------------------------------------------------
|
|
7
|
-
const DEFAULT_MAX_COUNT = 100;
|
|
8
|
-
const DEFAULT_TTL_SECONDS = 86_400; // 24 hours
|
|
9
|
-
let _store = "memory";
|
|
10
|
-
let _defaults = { maxCount: DEFAULT_MAX_COUNT, ttlSeconds: DEFAULT_TTL_SECONDS };
|
|
11
|
-
const _roomConfigs = new Map();
|
|
12
|
-
// Memory store
|
|
13
|
-
const _memoryMessages = new Map();
|
|
14
|
-
// SQLite trim counters — tracks inserts since last trim per room.
|
|
15
|
-
// Resets on server restart; rooms may temporarily exceed maxCount by up to trimInterval rows.
|
|
16
|
-
// This is a soft cap by design to avoid a DELETE on every INSERT under high throughput.
|
|
17
|
-
const _sqliteTrimCounters = new Map();
|
|
18
|
-
// ---------------------------------------------------------------------------
|
|
19
|
-
// Configuration
|
|
20
|
-
// ---------------------------------------------------------------------------
|
|
21
|
-
export const setWsMessageStore = (store) => { _store = store; };
|
|
22
|
-
export const setWsMessageDefaults = (defaults) => {
|
|
23
|
-
_defaults = {
|
|
24
|
-
maxCount: defaults.maxCount ?? DEFAULT_MAX_COUNT,
|
|
25
|
-
ttlSeconds: defaults.ttlSeconds ?? DEFAULT_TTL_SECONDS,
|
|
26
|
-
};
|
|
27
|
-
};
|
|
28
|
-
/** Opt a room into message persistence. */
|
|
29
|
-
export const configureRoom = (room, options) => {
|
|
30
|
-
if (!options.persist) {
|
|
31
|
-
_roomConfigs.delete(room);
|
|
32
|
-
return;
|
|
33
|
-
}
|
|
34
|
-
_roomConfigs.set(room, {
|
|
35
|
-
maxCount: options.maxCount ?? _defaults.maxCount,
|
|
36
|
-
ttlSeconds: options.ttlSeconds ?? _defaults.ttlSeconds,
|
|
37
|
-
});
|
|
38
|
-
};
|
|
39
|
-
// ---------------------------------------------------------------------------
|
|
40
|
-
// Public API
|
|
41
|
-
// ---------------------------------------------------------------------------
|
|
42
|
-
/**
|
|
43
|
-
* Persist a message to a room. Returns null if room is not configured for persistence.
|
|
44
|
-
* On store errors, logs a warning and returns null (non-blocking).
|
|
45
|
-
*/
|
|
46
|
-
export const persistMessage = async (room, data) => {
|
|
47
|
-
const config = _roomConfigs.get(room);
|
|
48
|
-
if (!config)
|
|
49
|
-
return null;
|
|
50
|
-
const message = {
|
|
51
|
-
id: crypto.randomUUID(),
|
|
52
|
-
room,
|
|
53
|
-
senderId: data.senderId ?? null,
|
|
54
|
-
payload: data.payload,
|
|
55
|
-
createdAt: Date.now(),
|
|
56
|
-
};
|
|
57
|
-
try {
|
|
58
|
-
switch (_store) {
|
|
59
|
-
case "memory":
|
|
60
|
-
return memoryPersist(message, config);
|
|
61
|
-
case "redis":
|
|
62
|
-
return await redisPersist(message, config);
|
|
63
|
-
case "mongo":
|
|
64
|
-
return await mongoPersist(message, config);
|
|
65
|
-
case "sqlite":
|
|
66
|
-
return sqlitePersist(message, config);
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
catch (err) {
|
|
70
|
-
console.warn(`[wsMessages] failed to persist message to ${room}:`, err);
|
|
71
|
-
return null;
|
|
72
|
-
}
|
|
73
|
-
};
|
|
74
|
-
/**
|
|
75
|
-
* Get message history for a room.
|
|
76
|
-
* Cursor-based pagination using message `id` as cursor.
|
|
77
|
-
*/
|
|
78
|
-
export const getMessageHistory = async (room, opts) => {
|
|
79
|
-
const limit = opts?.limit ?? 50;
|
|
80
|
-
switch (_store) {
|
|
81
|
-
case "memory":
|
|
82
|
-
return memoryGetHistory(room, limit, opts?.before, opts?.after);
|
|
83
|
-
case "redis":
|
|
84
|
-
return await redisGetHistory(room, limit, opts?.before, opts?.after);
|
|
85
|
-
case "mongo":
|
|
86
|
-
return await mongoGetHistory(room, limit, opts?.before, opts?.after);
|
|
87
|
-
case "sqlite":
|
|
88
|
-
return sqliteGetHistory(room, limit, opts?.before, opts?.after);
|
|
89
|
-
}
|
|
90
|
-
};
|
|
91
|
-
/** Reset memory store. Useful for test isolation. */
|
|
92
|
-
export const clearWsMessageMemoryStore = () => {
|
|
93
|
-
_memoryMessages.clear();
|
|
94
|
-
_roomConfigs.clear();
|
|
95
|
-
_sqliteTrimCounters.clear();
|
|
96
|
-
};
|
|
97
|
-
// ---------------------------------------------------------------------------
|
|
98
|
-
// Memory backend
|
|
99
|
-
// ---------------------------------------------------------------------------
|
|
100
|
-
function memoryPersist(msg, config) {
|
|
101
|
-
if (!_memoryMessages.has(msg.room))
|
|
102
|
-
_memoryMessages.set(msg.room, []);
|
|
103
|
-
const msgs = _memoryMessages.get(msg.room);
|
|
104
|
-
msgs.push(msg);
|
|
105
|
-
// Trim to maxCount
|
|
106
|
-
if (msgs.length > config.maxCount) {
|
|
107
|
-
msgs.splice(0, msgs.length - config.maxCount);
|
|
108
|
-
}
|
|
109
|
-
return msg;
|
|
110
|
-
}
|
|
111
|
-
function memoryGetHistory(room, limit, before, after) {
|
|
112
|
-
const msgs = _memoryMessages.get(room) ?? [];
|
|
113
|
-
const now = Date.now();
|
|
114
|
-
const config = _roomConfigs.get(room);
|
|
115
|
-
const ttlMs = (config?.ttlSeconds ?? _defaults.ttlSeconds) * 1000;
|
|
116
|
-
// Filter expired
|
|
117
|
-
let filtered = msgs.filter((m) => now - m.createdAt < ttlMs);
|
|
118
|
-
if (before) {
|
|
119
|
-
const cursorIdx = filtered.findIndex((m) => m.id === before);
|
|
120
|
-
if (cursorIdx > 0)
|
|
121
|
-
filtered = filtered.slice(0, cursorIdx);
|
|
122
|
-
}
|
|
123
|
-
else if (after) {
|
|
124
|
-
const cursorIdx = filtered.findIndex((m) => m.id === after);
|
|
125
|
-
if (cursorIdx >= 0)
|
|
126
|
-
filtered = filtered.slice(cursorIdx + 1);
|
|
127
|
-
}
|
|
128
|
-
// Return last N messages (most recent)
|
|
129
|
-
return filtered.slice(-limit);
|
|
130
|
-
}
|
|
131
|
-
// ---------------------------------------------------------------------------
|
|
132
|
-
// Redis backend
|
|
133
|
-
// ---------------------------------------------------------------------------
|
|
134
|
-
async function redisPersist(msg, config) {
|
|
135
|
-
const { getRedis } = await import("./redis");
|
|
136
|
-
const redis = getRedis();
|
|
137
|
-
const key = `wsmsg:${msg.room}`;
|
|
138
|
-
const serialized = JSON.stringify(msg);
|
|
139
|
-
await redis.lpush(key, serialized);
|
|
140
|
-
await redis.ltrim(key, 0, config.maxCount - 1);
|
|
141
|
-
await redis.expire(key, config.ttlSeconds);
|
|
142
|
-
return msg;
|
|
143
|
-
}
|
|
144
|
-
async function redisGetHistory(room, limit, before, after) {
|
|
145
|
-
const { getRedis } = await import("./redis");
|
|
146
|
-
const redis = getRedis();
|
|
147
|
-
const key = `wsmsg:${room}`;
|
|
148
|
-
// Redis list is newest-first (LPUSH)
|
|
149
|
-
const raw = await redis.lrange(key, 0, -1);
|
|
150
|
-
let msgs = raw.map((s) => JSON.parse(s)).reverse(); // oldest-first
|
|
151
|
-
if (before) {
|
|
152
|
-
const idx = msgs.findIndex((m) => m.id === before);
|
|
153
|
-
if (idx > 0)
|
|
154
|
-
msgs = msgs.slice(0, idx);
|
|
155
|
-
}
|
|
156
|
-
else if (after) {
|
|
157
|
-
const idx = msgs.findIndex((m) => m.id === after);
|
|
158
|
-
if (idx >= 0)
|
|
159
|
-
msgs = msgs.slice(idx + 1);
|
|
160
|
-
}
|
|
161
|
-
return msgs.slice(-limit);
|
|
162
|
-
}
|
|
163
|
-
// ---------------------------------------------------------------------------
|
|
164
|
-
// MongoDB backend
|
|
165
|
-
// ---------------------------------------------------------------------------
|
|
166
|
-
let _mongoModel = null;
|
|
167
|
-
async function getWsMessageModel() {
|
|
168
|
-
if (_mongoModel)
|
|
169
|
-
return _mongoModel;
|
|
170
|
-
const { authConnection } = await import("./mongo");
|
|
171
|
-
const { default: mongoose } = await import("mongoose");
|
|
172
|
-
const schema = new mongoose.Schema({
|
|
173
|
-
_id: { type: String, default: () => crypto.randomUUID() },
|
|
174
|
-
room: { type: String, required: true, index: true },
|
|
175
|
-
senderId: { type: String, default: null },
|
|
176
|
-
payload: { type: mongoose.Schema.Types.Mixed },
|
|
177
|
-
createdAt: { type: Number, required: true, index: true },
|
|
178
|
-
}, { collection: "ws_messages" });
|
|
179
|
-
schema.index({ room: 1, createdAt: 1, _id: 1 });
|
|
180
|
-
// TTL index — Mongo's TTL monitor runs ~every 60s, so messages may briefly
|
|
181
|
-
// outlive their TTL. Acceptable for chat history.
|
|
182
|
-
schema.index({ createdAt: 1 }, { expireAfterSeconds: DEFAULT_TTL_SECONDS });
|
|
183
|
-
_mongoModel = authConnection.model("WsMessage", schema);
|
|
184
|
-
return _mongoModel;
|
|
185
|
-
}
|
|
186
|
-
async function mongoPersist(msg, config) {
|
|
187
|
-
const Model = await getWsMessageModel();
|
|
188
|
-
await Model.create({
|
|
189
|
-
_id: msg.id,
|
|
190
|
-
room: msg.room,
|
|
191
|
-
senderId: msg.senderId,
|
|
192
|
-
payload: msg.payload,
|
|
193
|
-
createdAt: msg.createdAt,
|
|
194
|
-
});
|
|
195
|
-
// Trim to maxCount
|
|
196
|
-
const count = await Model.countDocuments({ room: msg.room });
|
|
197
|
-
if (count > config.maxCount) {
|
|
198
|
-
const oldest = await Model.find({ room: msg.room })
|
|
199
|
-
.sort({ createdAt: 1, _id: 1 })
|
|
200
|
-
.limit(count - config.maxCount)
|
|
201
|
-
.select("_id");
|
|
202
|
-
if (oldest.length > 0) {
|
|
203
|
-
await Model.deleteMany({ _id: { $in: oldest.map((d) => d._id) } });
|
|
204
|
-
}
|
|
205
|
-
}
|
|
206
|
-
return msg;
|
|
207
|
-
}
|
|
208
|
-
async function mongoGetHistory(room, limit, before, after) {
|
|
209
|
-
const Model = await getWsMessageModel();
|
|
210
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
211
|
-
const filter = { room };
|
|
212
|
-
if (before) {
|
|
213
|
-
const cursor = await Model.findById(before).lean();
|
|
214
|
-
if (cursor) {
|
|
215
|
-
filter.$or = [
|
|
216
|
-
{ createdAt: { $lt: cursor.createdAt } },
|
|
217
|
-
{ createdAt: cursor.createdAt, _id: { $lt: before } },
|
|
218
|
-
];
|
|
219
|
-
}
|
|
220
|
-
}
|
|
221
|
-
else if (after) {
|
|
222
|
-
const cursor = await Model.findById(after).lean();
|
|
223
|
-
if (cursor) {
|
|
224
|
-
filter.$or = [
|
|
225
|
-
{ createdAt: { $gt: cursor.createdAt } },
|
|
226
|
-
{ createdAt: cursor.createdAt, _id: { $gt: after } },
|
|
227
|
-
];
|
|
228
|
-
}
|
|
229
|
-
}
|
|
230
|
-
const docs = await Model.find(filter)
|
|
231
|
-
.sort({ createdAt: -1, _id: -1 })
|
|
232
|
-
.limit(limit)
|
|
233
|
-
.lean();
|
|
234
|
-
return docs.reverse().map((d) => ({
|
|
235
|
-
id: d._id,
|
|
236
|
-
room: d.room,
|
|
237
|
-
senderId: d.senderId,
|
|
238
|
-
payload: d.payload,
|
|
239
|
-
createdAt: d.createdAt,
|
|
240
|
-
}));
|
|
241
|
-
}
|
|
242
|
-
// ---------------------------------------------------------------------------
|
|
243
|
-
// SQLite backend
|
|
244
|
-
// ---------------------------------------------------------------------------
|
|
245
|
-
function getSqliteDb() {
|
|
246
|
-
// Re-use the sqlite DB set via setSqliteDb
|
|
247
|
-
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
248
|
-
const { getSqliteDatabase } = require("../adapters/sqliteAuth");
|
|
249
|
-
return getSqliteDatabase();
|
|
250
|
-
}
|
|
251
|
-
let _sqliteInitialized = false;
|
|
252
|
-
function ensureSqliteTable() {
|
|
253
|
-
if (_sqliteInitialized)
|
|
254
|
-
return;
|
|
255
|
-
const db = getSqliteDb();
|
|
256
|
-
db.run(`
|
|
257
|
-
CREATE TABLE IF NOT EXISTS ws_messages (
|
|
258
|
-
id TEXT PRIMARY KEY,
|
|
259
|
-
room TEXT NOT NULL,
|
|
260
|
-
sender_id TEXT,
|
|
261
|
-
payload TEXT,
|
|
262
|
-
created_at INTEGER NOT NULL
|
|
263
|
-
)
|
|
264
|
-
`);
|
|
265
|
-
db.run(`CREATE INDEX IF NOT EXISTS idx_ws_messages_room_created ON ws_messages (room, created_at, id)`);
|
|
266
|
-
_sqliteInitialized = true;
|
|
267
|
-
}
|
|
268
|
-
function sqlitePersist(msg, config) {
|
|
269
|
-
ensureSqliteTable();
|
|
270
|
-
const db = getSqliteDb();
|
|
271
|
-
db.run(`INSERT INTO ws_messages (id, room, sender_id, payload, created_at) VALUES (?, ?, ?, ?, ?)`, [msg.id, msg.room, msg.senderId, JSON.stringify(msg.payload), msg.createdAt]);
|
|
272
|
-
// Modulo-based trimming to avoid DELETE on every INSERT.
|
|
273
|
-
const counter = (_sqliteTrimCounters.get(msg.room) ?? 0) + 1;
|
|
274
|
-
const trimInterval = Math.max(10, Math.floor(config.maxCount * 0.1));
|
|
275
|
-
_sqliteTrimCounters.set(msg.room, counter);
|
|
276
|
-
if (counter >= trimInterval) {
|
|
277
|
-
_sqliteTrimCounters.set(msg.room, 0);
|
|
278
|
-
// Delete oldest beyond maxCount
|
|
279
|
-
db.run(`DELETE FROM ws_messages WHERE room = ? AND id NOT IN (
|
|
280
|
-
SELECT id FROM ws_messages WHERE room = ? ORDER BY created_at DESC, id DESC LIMIT ?
|
|
281
|
-
)`, [msg.room, msg.room, config.maxCount]);
|
|
282
|
-
// TTL cleanup
|
|
283
|
-
const ttlMs = config.ttlSeconds * 1000;
|
|
284
|
-
db.run(`DELETE FROM ws_messages WHERE room = ? AND created_at < ?`, [msg.room, Date.now() - ttlMs]);
|
|
285
|
-
}
|
|
286
|
-
return msg;
|
|
287
|
-
}
|
|
288
|
-
function sqliteGetHistory(room, limit, before, after) {
|
|
289
|
-
ensureSqliteTable();
|
|
290
|
-
const db = getSqliteDb();
|
|
291
|
-
let sql;
|
|
292
|
-
let params;
|
|
293
|
-
if (before) {
|
|
294
|
-
sql = `
|
|
295
|
-
SELECT * FROM ws_messages
|
|
296
|
-
WHERE room = ? AND (created_at, id) < (
|
|
297
|
-
(SELECT created_at FROM ws_messages WHERE id = ?),
|
|
298
|
-
?
|
|
299
|
-
)
|
|
300
|
-
ORDER BY created_at DESC, id DESC LIMIT ?
|
|
301
|
-
`;
|
|
302
|
-
params = [room, before, before, limit];
|
|
303
|
-
}
|
|
304
|
-
else if (after) {
|
|
305
|
-
sql = `
|
|
306
|
-
SELECT * FROM ws_messages
|
|
307
|
-
WHERE room = ? AND (created_at, id) > (
|
|
308
|
-
(SELECT created_at FROM ws_messages WHERE id = ?),
|
|
309
|
-
?
|
|
310
|
-
)
|
|
311
|
-
ORDER BY created_at ASC, id ASC LIMIT ?
|
|
312
|
-
`;
|
|
313
|
-
params = [room, after, after, limit];
|
|
314
|
-
}
|
|
315
|
-
else {
|
|
316
|
-
sql = `SELECT * FROM ws_messages WHERE room = ? ORDER BY created_at DESC, id DESC LIMIT ?`;
|
|
317
|
-
params = [room, limit];
|
|
318
|
-
}
|
|
319
|
-
const rows = db.query(sql).all(...params);
|
|
320
|
-
// Normalize to oldest-first
|
|
321
|
-
if (!after)
|
|
322
|
-
rows.reverse();
|
|
323
|
-
return rows.map((r) => ({
|
|
324
|
-
id: r.id,
|
|
325
|
-
room: r.room,
|
|
326
|
-
senderId: r.sender_id,
|
|
327
|
-
payload: JSON.parse(r.payload),
|
|
328
|
-
createdAt: r.created_at,
|
|
329
|
-
}));
|
|
330
|
-
}
|
package/dist/lib/wsPresence.d.ts
DELETED
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
/** Track an authenticated socket. Skips if userId is null/undefined. */
|
|
2
|
-
export declare const trackSocket: (socketId: string, userId: string | null) => void;
|
|
3
|
-
/** Untrack a socket on disconnect. */
|
|
4
|
-
export declare const untrackSocket: (socketId: string) => void;
|
|
5
|
-
/** Called when a socket subscribes to a room. Returns join info or null if unauthenticated. */
|
|
6
|
-
export declare const addPresence: (socketId: string, room: string) => {
|
|
7
|
-
userId: string;
|
|
8
|
-
isNewUser: boolean;
|
|
9
|
-
} | null;
|
|
10
|
-
/** Called when a socket unsubscribes from a room. Returns leave info or null if unauthenticated. */
|
|
11
|
-
export declare const removePresence: (socketId: string, room: string) => {
|
|
12
|
-
userId: string;
|
|
13
|
-
isLastSocket: boolean;
|
|
14
|
-
} | null;
|
|
15
|
-
/** Called on disconnect — cleans up all rooms for a socket. Returns rooms where user fully departed. */
|
|
16
|
-
export declare const cleanupPresence: (socketId: string, rooms: Set<string>) => Array<{
|
|
17
|
-
room: string;
|
|
18
|
-
userId: string;
|
|
19
|
-
}>;
|
|
20
|
-
/** Deduplicated userIds present in a room. */
|
|
21
|
-
export declare const getRoomPresence: (room: string) => string[];
|
|
22
|
-
/** Rooms where a user is present. */
|
|
23
|
-
export declare const getUserPresence: (userId: string) => string[];
|
|
24
|
-
/** Reset all presence state. Useful for test isolation. */
|
|
25
|
-
export declare const clearPresenceStore: () => void;
|