@lastshotlabs/bunshot 0.0.27 → 0.0.28
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.oclif.manifest.json +39 -0
- package/README.md +8282 -2147
- package/dist/cli/commands/init.js +690 -0
- package/dist/cli/index.js +6 -0
- package/dist/cli.js +4 -4
- package/dist/packages/bunshot-admin/src/index.d.ts +15 -0
- package/dist/packages/bunshot-admin/src/index.js +11 -0
- package/dist/packages/bunshot-admin/src/lib/resourceTypes.d.ts +8 -0
- package/dist/packages/bunshot-admin/src/lib/resourceTypes.js +33 -0
- package/dist/packages/bunshot-admin/src/lib/typedRoute.d.ts +14 -0
- package/dist/packages/bunshot-admin/src/lib/typedRoute.js +17 -0
- package/dist/packages/bunshot-admin/src/plugin.d.ts +4 -0
- package/dist/packages/bunshot-admin/src/plugin.js +46 -0
- package/dist/packages/bunshot-admin/src/providers/auth0Access.d.ts +6 -0
- package/dist/packages/bunshot-admin/src/providers/auth0Access.js +32 -0
- package/dist/packages/bunshot-admin/src/routes/admin.d.ts +10 -0
- package/dist/packages/bunshot-admin/src/routes/admin.js +923 -0
- package/dist/packages/bunshot-admin/src/routes/mail.d.ts +6 -0
- package/dist/packages/bunshot-admin/src/routes/mail.js +114 -0
- package/dist/packages/bunshot-admin/src/routes/permissions.d.ts +8 -0
- package/dist/packages/bunshot-admin/src/routes/permissions.js +315 -0
- package/dist/packages/bunshot-admin/src/types/config.d.ts +16 -0
- package/dist/packages/bunshot-admin/src/types/config.js +37 -0
- package/dist/packages/bunshot-admin/src/types/env.d.ts +14 -0
- package/dist/packages/bunshot-admin/src/types/provider.d.ts +1 -0
- package/dist/packages/bunshot-admin/src/types/provider.js +4 -0
- package/dist/packages/bunshot-auth/src/adapters/memoryAuth.d.ts +66 -0
- package/dist/packages/bunshot-auth/src/adapters/memoryAuth.js +1063 -0
- package/dist/packages/bunshot-auth/src/adapters/mongoAuth.d.ts +2 -0
- package/dist/packages/bunshot-auth/src/adapters/mongoAuth.js +536 -0
- package/dist/packages/bunshot-auth/src/adapters/sqliteAuth.d.ts +88 -0
- package/dist/packages/bunshot-auth/src/adapters/sqliteAuth.js +1366 -0
- package/dist/packages/bunshot-auth/src/admin/bunshotAccess.d.ts +2 -0
- package/dist/packages/bunshot-auth/src/admin/bunshotAccess.js +23 -0
- package/dist/packages/bunshot-auth/src/admin/bunshotUsers.d.ts +5 -0
- package/dist/packages/bunshot-auth/src/admin/bunshotUsers.js +131 -0
- package/dist/packages/bunshot-auth/src/bootstrap.d.ts +38 -0
- package/dist/packages/bunshot-auth/src/bootstrap.js +384 -0
- package/dist/packages/bunshot-auth/src/config/appConfig.d.ts +3 -0
- package/dist/packages/bunshot-auth/src/config/appConfig.js +4 -0
- package/dist/packages/bunshot-auth/src/config/authConfig.d.ts +478 -0
- package/dist/packages/bunshot-auth/src/config/authConfig.js +46 -0
- package/dist/packages/bunshot-auth/src/config/configLock.d.ts +2 -0
- package/dist/packages/bunshot-auth/src/config/configLock.js +10 -0
- package/dist/packages/bunshot-auth/src/index.d.ts +25 -0
- package/dist/packages/bunshot-auth/src/index.js +23 -0
- package/dist/packages/bunshot-auth/src/infra/mongo.d.ts +15 -0
- package/dist/packages/bunshot-auth/src/infra/mongo.js +44 -0
- package/dist/packages/bunshot-auth/src/infra/queue.d.ts +14 -0
- package/dist/packages/bunshot-auth/src/infra/queue.js +27 -0
- package/dist/packages/bunshot-auth/src/infra/redis.d.ts +5 -0
- package/dist/packages/bunshot-auth/src/infra/redis.js +15 -0
- package/dist/packages/bunshot-auth/src/infra/signing.d.ts +7 -0
- package/dist/packages/bunshot-auth/src/infra/signing.js +8 -0
- package/dist/packages/bunshot-auth/src/lib/accountLockout.d.ts +34 -0
- package/dist/packages/bunshot-auth/src/lib/accountLockout.js +244 -0
- package/dist/packages/bunshot-auth/src/lib/adapterTiers.d.ts +1 -0
- package/dist/packages/bunshot-auth/src/lib/adapterTiers.js +1 -0
- package/dist/packages/bunshot-auth/src/lib/authAdapter.d.ts +1 -0
- package/dist/packages/bunshot-auth/src/lib/authAdapter.js +1 -0
- package/dist/packages/bunshot-auth/src/lib/authContext.d.ts +15 -0
- package/dist/packages/bunshot-auth/src/lib/authContext.js +1 -0
- package/dist/packages/bunshot-auth/src/lib/authEventBus.d.ts +4 -0
- package/dist/packages/bunshot-auth/src/lib/authEventBus.js +15 -0
- package/dist/packages/bunshot-auth/src/lib/authRateLimit.d.ts +28 -0
- package/dist/packages/bunshot-auth/src/lib/authRateLimit.js +205 -0
- package/dist/{lib → packages/bunshot-auth/src/lib}/breachedPassword.d.ts +8 -2
- package/dist/{lib → packages/bunshot-auth/src/lib}/breachedPassword.js +22 -9
- package/dist/packages/bunshot-auth/src/lib/cache.d.ts +12 -0
- package/dist/packages/bunshot-auth/src/lib/cache.js +120 -0
- package/dist/packages/bunshot-auth/src/lib/clientIp.d.ts +4 -0
- package/dist/{lib → packages/bunshot-auth/src/lib}/clientIp.js +14 -7
- package/dist/packages/bunshot-auth/src/lib/cookieOptions.d.ts +27 -0
- package/dist/packages/bunshot-auth/src/lib/cookieOptions.js +33 -0
- package/dist/packages/bunshot-auth/src/lib/credentialStuffing.d.ts +40 -0
- package/dist/packages/bunshot-auth/src/lib/credentialStuffing.js +221 -0
- package/dist/packages/bunshot-auth/src/lib/deletionCancelToken.d.ts +19 -0
- package/dist/packages/bunshot-auth/src/lib/deletionCancelToken.js +148 -0
- package/dist/packages/bunshot-auth/src/lib/emailTemplates.d.ts +23 -0
- package/dist/packages/bunshot-auth/src/lib/emailTemplates.js +265 -0
- package/dist/packages/bunshot-auth/src/lib/emailVerification.d.ts +30 -0
- package/dist/packages/bunshot-auth/src/lib/emailVerification.js +200 -0
- package/dist/packages/bunshot-auth/src/lib/env.d.ts +1 -0
- package/dist/packages/bunshot-auth/src/lib/env.js +3 -0
- package/dist/packages/bunshot-auth/src/lib/fingerprint.js +36 -0
- package/dist/{lib → packages/bunshot-auth/src/lib}/groups.d.ts +15 -16
- package/dist/{lib → packages/bunshot-auth/src/lib}/groups.js +22 -34
- package/dist/packages/bunshot-auth/src/lib/jwks.d.ts +28 -0
- package/dist/packages/bunshot-auth/src/lib/jwks.js +79 -0
- package/dist/packages/bunshot-auth/src/lib/jwt.d.ts +12 -0
- package/dist/packages/bunshot-auth/src/lib/jwt.js +86 -0
- package/dist/{lib → packages/bunshot-auth/src/lib}/logger.js +3 -3
- package/dist/{lib → packages/bunshot-auth/src/lib}/m2m.d.ts +5 -4
- package/dist/{lib → packages/bunshot-auth/src/lib}/m2m.js +6 -10
- package/dist/packages/bunshot-auth/src/lib/magicLink.d.ts +13 -0
- package/dist/packages/bunshot-auth/src/lib/magicLink.js +145 -0
- package/dist/packages/bunshot-auth/src/lib/mfaChallenge.d.ts +60 -0
- package/dist/packages/bunshot-auth/src/lib/mfaChallenge.js +419 -0
- package/dist/packages/bunshot-auth/src/lib/oauth.d.ts +82 -0
- package/dist/packages/bunshot-auth/src/lib/oauth.js +177 -0
- package/dist/packages/bunshot-auth/src/lib/oauthCode.d.ts +19 -0
- package/dist/packages/bunshot-auth/src/lib/oauthCode.js +182 -0
- package/dist/packages/bunshot-auth/src/lib/oauthReauth.d.ts +19 -0
- package/dist/packages/bunshot-auth/src/lib/oauthReauth.js +255 -0
- package/dist/packages/bunshot-auth/src/lib/organization.d.ts +66 -0
- package/dist/packages/bunshot-auth/src/lib/organization.js +225 -0
- package/dist/packages/bunshot-auth/src/lib/passwordHistory.d.ts +12 -0
- package/dist/packages/bunshot-auth/src/lib/passwordHistory.js +31 -0
- package/dist/packages/bunshot-auth/src/lib/resetPassword.d.ts +20 -0
- package/dist/packages/bunshot-auth/src/lib/resetPassword.js +148 -0
- package/dist/packages/bunshot-auth/src/lib/roles.d.ts +9 -0
- package/dist/packages/bunshot-auth/src/lib/roles.js +93 -0
- package/dist/packages/bunshot-auth/src/lib/saml.d.ts +29 -0
- package/dist/packages/bunshot-auth/src/lib/saml.js +73 -0
- package/dist/packages/bunshot-auth/src/lib/samlRequestId.d.ts +13 -0
- package/dist/packages/bunshot-auth/src/lib/samlRequestId.js +129 -0
- package/dist/{lib → packages/bunshot-auth/src/lib}/scim.d.ts +7 -7
- package/dist/{lib → packages/bunshot-auth/src/lib}/scim.js +15 -13
- package/dist/packages/bunshot-auth/src/lib/securityEventWiring.d.ts +22 -0
- package/dist/packages/bunshot-auth/src/lib/securityEventWiring.js +65 -0
- package/dist/packages/bunshot-auth/src/lib/session.d.ts +45 -0
- package/dist/packages/bunshot-auth/src/lib/session.js +1211 -0
- package/dist/packages/bunshot-auth/src/lib/storeInfra.d.ts +26 -0
- package/dist/packages/bunshot-auth/src/lib/storeInfra.js +18 -0
- package/dist/{lib → packages/bunshot-auth/src/lib}/suspension.d.ts +3 -2
- package/dist/{lib → packages/bunshot-auth/src/lib}/suspension.js +2 -5
- package/dist/packages/bunshot-auth/src/lib/validateAdapter.d.ts +16 -0
- package/dist/packages/bunshot-auth/src/lib/validateAdapter.js +161 -0
- package/dist/packages/bunshot-auth/src/middleware/bearerAuth.d.ts +13 -0
- package/dist/packages/bunshot-auth/src/middleware/bearerAuth.js +58 -0
- package/dist/{middleware → packages/bunshot-auth/src/middleware}/csrf.d.ts +5 -4
- package/dist/packages/bunshot-auth/src/middleware/csrf.js +138 -0
- package/dist/packages/bunshot-auth/src/middleware/identify.d.ts +4 -0
- package/dist/packages/bunshot-auth/src/middleware/identify.js +124 -0
- package/dist/{middleware → packages/bunshot-auth/src/middleware}/requireMfaSetup.d.ts +2 -2
- package/dist/{middleware → packages/bunshot-auth/src/middleware}/requireMfaSetup.js +10 -8
- package/dist/{middleware → packages/bunshot-auth/src/middleware}/requireRole.d.ts +2 -2
- package/dist/{middleware → packages/bunshot-auth/src/middleware}/requireRole.js +20 -16
- package/dist/{middleware → packages/bunshot-auth/src/middleware}/requireScope.d.ts +2 -2
- package/dist/{middleware → packages/bunshot-auth/src/middleware}/requireScope.js +6 -6
- package/dist/{middleware → packages/bunshot-auth/src/middleware}/requireStepUp.d.ts +2 -2
- package/dist/{middleware → packages/bunshot-auth/src/middleware}/requireStepUp.js +8 -7
- package/dist/{middleware → packages/bunshot-auth/src/middleware}/requireVerifiedEmail.d.ts +2 -2
- package/dist/{middleware → packages/bunshot-auth/src/middleware}/requireVerifiedEmail.js +7 -6
- package/dist/packages/bunshot-auth/src/middleware/scimAuth.d.ts +8 -0
- package/dist/packages/bunshot-auth/src/middleware/scimAuth.js +29 -0
- package/dist/packages/bunshot-auth/src/middleware/userAuth.d.ts +3 -0
- package/dist/packages/bunshot-auth/src/middleware/userAuth.js +6 -0
- package/dist/{models → packages/bunshot-auth/src/models}/AuthUser.d.ts +12 -8
- package/dist/packages/bunshot-auth/src/models/AuthUser.js +53 -0
- package/dist/packages/bunshot-auth/src/models/Group.d.ts +19 -0
- package/dist/packages/bunshot-auth/src/models/Group.js +22 -0
- package/dist/{models → packages/bunshot-auth/src/models}/GroupMembership.d.ts +6 -8
- package/dist/packages/bunshot-auth/src/models/GroupMembership.js +19 -0
- package/dist/{models → packages/bunshot-auth/src/models}/M2MClient.d.ts +1 -1
- package/dist/{models → packages/bunshot-auth/src/models}/M2MClient.js +5 -5
- package/dist/packages/bunshot-auth/src/models/TenantRole.d.ts +13 -0
- package/dist/packages/bunshot-auth/src/models/TenantRole.js +17 -0
- package/dist/packages/bunshot-auth/src/plugin.d.ts +4 -0
- package/dist/packages/bunshot-auth/src/plugin.js +274 -0
- package/dist/packages/bunshot-auth/src/routes/auth.d.ts +15 -0
- package/dist/packages/bunshot-auth/src/routes/auth.js +1624 -0
- package/dist/packages/bunshot-auth/src/routes/groups.d.ts +4 -0
- package/dist/packages/bunshot-auth/src/routes/groups.js +481 -0
- package/dist/packages/bunshot-auth/src/routes/m2m.d.ts +2 -0
- package/dist/packages/bunshot-auth/src/routes/m2m.js +145 -0
- package/dist/packages/bunshot-auth/src/routes/mfa.d.ts +6 -0
- package/dist/packages/bunshot-auth/src/routes/mfa.js +991 -0
- package/dist/packages/bunshot-auth/src/routes/oauth.d.ts +3 -0
- package/dist/packages/bunshot-auth/src/routes/oauth.js +1727 -0
- package/dist/packages/bunshot-auth/src/routes/oidc.d.ts +2 -0
- package/dist/packages/bunshot-auth/src/routes/oidc.js +84 -0
- package/dist/packages/bunshot-auth/src/routes/organizations.d.ts +3 -0
- package/dist/packages/bunshot-auth/src/routes/organizations.js +741 -0
- package/dist/packages/bunshot-auth/src/routes/passkey.d.ts +2 -0
- package/dist/packages/bunshot-auth/src/routes/passkey.js +199 -0
- package/dist/packages/bunshot-auth/src/routes/saml.d.ts +2 -0
- package/dist/packages/bunshot-auth/src/routes/saml.js +226 -0
- package/dist/packages/bunshot-auth/src/routes/scim.d.ts +3 -0
- package/dist/packages/bunshot-auth/src/routes/scim.js +588 -0
- package/dist/packages/bunshot-auth/src/runtime.d.ts +52 -0
- package/dist/packages/bunshot-auth/src/runtime.js +11 -0
- package/dist/{schemas → packages/bunshot-auth/src/schemas}/auth.d.ts +4 -5
- package/dist/packages/bunshot-auth/src/schemas/auth.js +24 -0
- package/dist/packages/bunshot-auth/src/schemas/error.d.ts +10 -0
- package/dist/packages/bunshot-auth/src/schemas/error.js +10 -0
- package/dist/packages/bunshot-auth/src/schemas/success.d.ts +10 -0
- package/dist/packages/bunshot-auth/src/schemas/success.js +10 -0
- package/dist/packages/bunshot-auth/src/services/auth.d.ts +39 -0
- package/dist/packages/bunshot-auth/src/services/auth.js +378 -0
- package/dist/{services → packages/bunshot-auth/src/services}/mfa.d.ts +41 -17
- package/dist/{services → packages/bunshot-auth/src/services}/mfa.js +259 -183
- package/dist/packages/bunshot-auth/src/testing.d.ts +31 -0
- package/dist/packages/bunshot-auth/src/testing.js +23 -0
- package/dist/packages/bunshot-auth/src/types/adapter.d.ts +1 -0
- package/dist/packages/bunshot-auth/src/types/adapter.js +1 -0
- package/dist/packages/bunshot-auth/src/types/config.d.ts +152 -0
- package/dist/packages/bunshot-auth/src/types/config.js +179 -0
- package/dist/{routes → packages/bunshot-auth/src/types}/groups.d.ts +2 -3
- package/dist/packages/bunshot-auth/src/types/groups.js +1 -0
- package/dist/packages/bunshot-auth/src/types/oauthCode.d.ts +6 -0
- package/dist/packages/bunshot-auth/src/types/oauthCode.js +1 -0
- package/dist/packages/bunshot-auth/src/types/oauthReauth.d.ts +13 -0
- package/dist/packages/bunshot-auth/src/types/oauthReauth.js +1 -0
- package/dist/packages/bunshot-auth/src/types/redis.d.ts +1 -0
- package/dist/packages/bunshot-auth/src/types/redis.js +1 -0
- package/dist/packages/bunshot-auth/src/types/saml.d.ts +10 -0
- package/dist/packages/bunshot-auth/src/types/saml.js +1 -0
- package/dist/packages/bunshot-auth/src/types/session.d.ts +18 -0
- package/dist/packages/bunshot-auth/src/types/session.js +1 -0
- package/dist/packages/bunshot-auth/src/types/store.d.ts +1 -0
- package/dist/packages/bunshot-auth/src/types/store.js +1 -0
- package/dist/packages/bunshot-core/src/adminProvider.d.ts +95 -0
- package/dist/packages/bunshot-core/src/adminProvider.js +1 -0
- package/dist/packages/bunshot-core/src/auditLog.d.ts +34 -0
- package/dist/packages/bunshot-core/src/auditLog.js +1 -0
- package/dist/packages/bunshot-core/src/auth-adapter.d.ts +227 -0
- package/dist/packages/bunshot-core/src/auth-adapter.js +4 -0
- package/dist/packages/bunshot-core/src/authVariables.d.ts +14 -0
- package/dist/packages/bunshot-core/src/authVariables.js +4 -0
- package/dist/packages/bunshot-core/src/cache.d.ts +12 -0
- package/dist/packages/bunshot-core/src/cache.js +21 -0
- package/dist/{lib → packages/bunshot-core/src}/captcha.d.ts +1 -10
- package/dist/packages/bunshot-core/src/captcha.js +1 -0
- package/dist/packages/bunshot-core/src/clearRegistry.d.ts +6 -0
- package/dist/packages/bunshot-core/src/clearRegistry.js +17 -0
- package/dist/packages/bunshot-core/src/clientIp.d.ts +3 -0
- package/dist/packages/bunshot-core/src/clientIp.js +45 -0
- package/dist/packages/bunshot-core/src/configLock.d.ts +4 -0
- package/dist/packages/bunshot-core/src/configLock.js +7 -0
- package/dist/packages/bunshot-core/src/configValidation.d.ts +22 -0
- package/dist/packages/bunshot-core/src/configValidation.js +39 -0
- package/dist/packages/bunshot-core/src/constants.js +10 -0
- package/dist/packages/bunshot-core/src/context/bunshotContext.d.ts +232 -0
- package/dist/packages/bunshot-core/src/context/bunshotContext.js +1 -0
- package/dist/packages/bunshot-core/src/context/contextAccess.d.ts +3 -0
- package/dist/packages/bunshot-core/src/context/contextAccess.js +16 -0
- package/dist/packages/bunshot-core/src/context/contextStore.d.ts +16 -0
- package/dist/packages/bunshot-core/src/context/contextStore.js +31 -0
- package/dist/packages/bunshot-core/src/context/frameworkConfig.d.ts +38 -0
- package/dist/packages/bunshot-core/src/context/frameworkConfig.js +1 -0
- package/dist/packages/bunshot-core/src/context/index.d.ts +4 -0
- package/dist/packages/bunshot-core/src/context/index.js +2 -0
- package/dist/packages/bunshot-core/src/context.d.ts +40 -0
- package/dist/packages/bunshot-core/src/context.js +35 -0
- package/dist/packages/bunshot-core/src/coreContracts.d.ts +47 -0
- package/dist/packages/bunshot-core/src/coreContracts.js +1 -0
- package/dist/packages/bunshot-core/src/coreRegistrar.d.ts +6 -0
- package/dist/packages/bunshot-core/src/coreRegistrar.js +42 -0
- package/dist/{lib → packages/bunshot-core/src}/createRoute.d.ts +4 -30
- package/dist/{lib → packages/bunshot-core/src}/createRoute.js +39 -88
- package/dist/packages/bunshot-core/src/cronRegistry.d.ts +11 -0
- package/dist/packages/bunshot-core/src/cronRegistry.js +1 -0
- package/dist/packages/bunshot-core/src/crypto.d.ts +43 -0
- package/dist/packages/bunshot-core/src/crypto.js +74 -0
- package/dist/packages/bunshot-core/src/csrf.d.ts +8 -0
- package/dist/packages/bunshot-core/src/csrf.js +1 -0
- package/dist/packages/bunshot-core/src/defaults/defaultFingerprint.d.ts +7 -0
- package/dist/packages/bunshot-core/src/defaults/defaultFingerprint.js +19 -0
- package/dist/packages/bunshot-core/src/defaults/memoryCacheAdapter.d.ts +6 -0
- package/dist/packages/bunshot-core/src/defaults/memoryCacheAdapter.js +40 -0
- package/dist/packages/bunshot-core/src/defaults/memoryRateLimit.d.ts +6 -0
- package/dist/packages/bunshot-core/src/defaults/memoryRateLimit.js +24 -0
- package/dist/packages/bunshot-core/src/emailTemplates.d.ts +5 -0
- package/dist/packages/bunshot-core/src/emailTemplates.js +10 -0
- package/dist/{lib/HttpError.d.ts → packages/bunshot-core/src/errors.d.ts} +4 -1
- package/dist/{lib/HttpError.js → packages/bunshot-core/src/errors.js} +7 -1
- package/dist/packages/bunshot-core/src/eventBus.d.ts +270 -0
- package/dist/packages/bunshot-core/src/eventBus.js +143 -0
- package/dist/packages/bunshot-core/src/idempotency.d.ts +18 -0
- package/dist/packages/bunshot-core/src/idempotency.js +1 -0
- package/dist/packages/bunshot-core/src/index.d.ts +60 -0
- package/dist/packages/bunshot-core/src/index.js +34 -0
- package/dist/packages/bunshot-core/src/mail.d.ts +14 -0
- package/dist/packages/bunshot-core/src/mail.js +8 -0
- package/dist/packages/bunshot-core/src/memoryEviction.d.ts +24 -0
- package/dist/packages/bunshot-core/src/memoryEviction.js +52 -0
- package/dist/packages/bunshot-core/src/pagination.d.ts +45 -0
- package/dist/packages/bunshot-core/src/pagination.js +61 -0
- package/dist/packages/bunshot-core/src/permissions.d.ts +64 -0
- package/dist/packages/bunshot-core/src/permissions.js +27 -0
- package/dist/packages/bunshot-core/src/plugin.d.ts +44 -0
- package/dist/packages/bunshot-core/src/plugin.js +1 -0
- package/dist/packages/bunshot-core/src/rateLimit.d.ts +5 -0
- package/dist/packages/bunshot-core/src/rateLimit.js +18 -0
- package/dist/packages/bunshot-core/src/redis.d.ts +21 -0
- package/dist/packages/bunshot-core/src/redis.js +1 -0
- package/dist/packages/bunshot-core/src/routeAuth.d.ts +5 -0
- package/dist/packages/bunshot-core/src/routeAuth.js +11 -0
- package/dist/packages/bunshot-core/src/routeOverrides.d.ts +24 -0
- package/dist/packages/bunshot-core/src/routeOverrides.js +25 -0
- package/dist/packages/bunshot-core/src/routerAdapter.d.ts +6 -0
- package/dist/packages/bunshot-core/src/routerAdapter.js +56 -0
- package/dist/packages/bunshot-core/src/secrets.d.ts +48 -0
- package/dist/packages/bunshot-core/src/secrets.js +8 -0
- package/dist/packages/bunshot-core/src/signing.d.ts +41 -0
- package/dist/packages/bunshot-core/src/signing.js +1 -0
- package/dist/packages/bunshot-core/src/sse.d.ts +36 -0
- package/dist/packages/bunshot-core/src/sse.js +1 -0
- package/dist/packages/bunshot-core/src/storageAdapter.js +1 -0
- package/dist/packages/bunshot-core/src/storeInfra.d.ts +44 -0
- package/dist/packages/bunshot-core/src/storeInfra.js +18 -0
- package/dist/packages/bunshot-core/src/storeType.d.ts +7 -0
- package/dist/packages/bunshot-core/src/storeType.js +1 -0
- package/dist/packages/bunshot-core/src/testing.d.ts +1 -0
- package/dist/packages/bunshot-core/src/testing.js +1 -0
- package/dist/packages/bunshot-core/src/uploadRegistry.d.ts +23 -0
- package/dist/packages/bunshot-core/src/uploadRegistry.js +4 -0
- package/dist/packages/bunshot-core/src/userResolver.d.ts +5 -0
- package/dist/packages/bunshot-core/src/userResolver.js +14 -0
- package/dist/packages/bunshot-core/src/wsMessages.d.ts +42 -0
- package/dist/packages/bunshot-core/src/wsMessages.js +4 -0
- package/dist/packages/bunshot-permissions/src/adapters/memory.d.ts +7 -0
- package/dist/packages/bunshot-permissions/src/adapters/memory.js +73 -0
- package/dist/packages/bunshot-permissions/src/index.d.ts +10 -0
- package/dist/packages/bunshot-permissions/src/index.js +5 -0
- package/dist/packages/bunshot-permissions/src/lib/bootstrap.d.ts +7 -0
- package/dist/packages/bunshot-permissions/src/lib/bootstrap.js +12 -0
- package/dist/packages/bunshot-permissions/src/lib/evaluator.d.ts +10 -0
- package/dist/packages/bunshot-permissions/src/lib/evaluator.js +165 -0
- package/dist/packages/bunshot-permissions/src/lib/registry.d.ts +2 -0
- package/dist/packages/bunshot-permissions/src/lib/registry.js +31 -0
- package/dist/packages/bunshot-permissions/src/lib/validation.d.ts +1 -0
- package/dist/packages/bunshot-permissions/src/lib/validation.js +1 -0
- package/dist/packages/bunshot-permissions/src/types/adapter.d.ts +1 -0
- package/dist/packages/bunshot-permissions/src/types/adapter.js +1 -0
- package/dist/packages/bunshot-permissions/src/types/evaluator.d.ts +1 -0
- package/dist/packages/bunshot-permissions/src/types/evaluator.js +1 -0
- package/dist/packages/bunshot-permissions/src/types/models.d.ts +1 -0
- package/dist/packages/bunshot-permissions/src/types/models.js +1 -0
- package/dist/packages/bunshot-permissions/src/types/registry.d.ts +1 -0
- package/dist/packages/bunshot-permissions/src/types/registry.js +1 -0
- package/dist/packages/bunshot-postgres/src/adapter.d.ts +6 -0
- package/dist/packages/bunshot-postgres/src/adapter.js +794 -0
- package/dist/packages/bunshot-postgres/src/connection.d.ts +15 -0
- package/dist/packages/bunshot-postgres/src/connection.js +16 -0
- package/dist/packages/bunshot-postgres/src/index.d.ts +4 -0
- package/dist/packages/bunshot-postgres/src/index.js +2 -0
- package/dist/packages/bunshot-postgres/src/schema.d.ts +997 -0
- package/dist/packages/bunshot-postgres/src/schema.js +105 -0
- package/dist/src/app.d.ts +230 -0
- package/dist/src/app.js +182 -0
- package/dist/src/cli/commands/init.d.ts +10 -0
- package/dist/src/cli/commands/init.js +709 -0
- package/dist/src/cli/index.d.ts +1 -0
- package/dist/src/cli/index.js +3 -0
- package/dist/src/entrypoints/mongo.d.ts +6 -0
- package/dist/src/entrypoints/mongo.js +4 -0
- package/dist/src/entrypoints/queue.d.ts +2 -0
- package/dist/src/entrypoints/queue.js +1 -0
- package/dist/src/entrypoints/redis.d.ts +1 -0
- package/dist/src/entrypoints/redis.js +1 -0
- package/dist/{adapters → src/framework/adapters}/localStorage.d.ts +1 -1
- package/dist/{adapters → src/framework/adapters}/localStorage.js +10 -10
- package/dist/src/framework/adapters/memoryStorage.d.ts +2 -0
- package/dist/src/framework/adapters/memoryStorage.js +45 -0
- package/dist/{adapters → src/framework/adapters}/s3Storage.d.ts +1 -1
- package/dist/{adapters → src/framework/adapters}/s3Storage.js +12 -12
- package/dist/src/framework/admin/bunshotAccess.d.ts +2 -0
- package/dist/src/framework/admin/bunshotAccess.js +23 -0
- package/dist/src/framework/admin/bunshotUsers.d.ts +2 -0
- package/dist/src/framework/admin/bunshotUsers.js +103 -0
- package/dist/src/framework/admin/index.d.ts +7 -0
- package/dist/src/framework/admin/index.js +21 -0
- package/dist/src/framework/boundaryAdapters/cacheFactories.d.ts +13 -0
- package/dist/src/framework/boundaryAdapters/cacheFactories.js +86 -0
- package/dist/src/framework/boundaryAdapters/index.d.ts +2 -0
- package/dist/src/framework/boundaryAdapters/index.js +1 -0
- package/dist/src/framework/boundaryAdapters.d.ts +17 -0
- package/dist/src/framework/boundaryAdapters.js +62 -0
- package/dist/src/framework/buildContext.d.ts +33 -0
- package/dist/src/framework/buildContext.js +119 -0
- package/dist/src/framework/config/schema.d.ts +447 -0
- package/dist/src/framework/config/schema.js +528 -0
- package/dist/src/framework/createInfrastructure.d.ts +76 -0
- package/dist/src/framework/createInfrastructure.js +221 -0
- package/dist/src/framework/lib/auditLog.d.ts +23 -0
- package/dist/src/framework/lib/auditLog.js +416 -0
- package/dist/src/framework/lib/captcha.d.ts +11 -0
- package/dist/{lib → src/framework/lib}/captcha.js +13 -10
- package/dist/{lib → src/framework/lib}/createDtoMapper.js +4 -4
- package/dist/src/framework/lib/createRoute.d.ts +1 -0
- package/dist/src/framework/lib/createRoute.js +2 -0
- package/dist/{lib → src/framework/lib}/idempotency.d.ts +2 -6
- package/dist/src/framework/lib/idempotency.js +74 -0
- package/dist/src/framework/lib/logger.d.ts +3 -0
- package/dist/src/framework/lib/logger.js +14 -0
- package/dist/src/framework/lib/metrics.d.ts +34 -0
- package/dist/{lib → src/framework/lib}/metrics.js +49 -57
- package/dist/src/framework/lib/pagination.d.ts +42 -0
- package/dist/src/framework/lib/pagination.js +51 -0
- package/dist/src/framework/lib/redisTransport.d.ts +38 -0
- package/dist/src/framework/lib/redisTransport.js +107 -0
- package/dist/src/framework/lib/resolveUserId.d.ts +2 -0
- package/dist/src/framework/lib/resolveUserId.js +5 -0
- package/dist/src/framework/lib/sseCollision.d.ts +6 -0
- package/dist/src/framework/lib/sseCollision.js +26 -0
- package/dist/src/framework/lib/storageAdapter.d.ts +1 -0
- package/dist/src/framework/lib/storageAdapter.js +1 -0
- package/dist/{lib → src/framework/lib}/stripUnreferencedSchemas.js +4 -4
- package/dist/src/framework/lib/tenant.d.ts +21 -0
- package/dist/src/framework/lib/tenant.js +70 -0
- package/dist/{lib → src/framework/lib}/upload.d.ts +11 -10
- package/dist/src/framework/lib/upload.js +132 -0
- package/dist/src/framework/lib/uploadRegistry.d.ts +23 -0
- package/dist/src/framework/lib/uploadRegistry.js +34 -0
- package/dist/{lib → src/framework/lib}/validate.d.ts +1 -1
- package/dist/{lib → src/framework/lib}/validate.js +2 -2
- package/dist/src/framework/lib/ws.d.ts +19 -0
- package/dist/src/framework/lib/ws.js +130 -0
- package/dist/src/framework/lib/wsHeartbeat.d.ts +12 -0
- package/dist/src/framework/lib/wsHeartbeat.js +53 -0
- package/dist/src/framework/lib/wsMessages.d.ts +25 -0
- package/dist/src/framework/lib/wsMessages.js +45 -0
- package/dist/src/framework/lib/wsNamespace.d.ts +17 -0
- package/dist/src/framework/lib/wsNamespace.js +19 -0
- package/dist/src/framework/lib/wsPresence.d.ts +17 -0
- package/dist/src/framework/lib/wsPresence.js +84 -0
- package/dist/src/framework/lib/wsTransport.d.ts +38 -0
- package/dist/src/framework/lib/wsTransport.js +9 -0
- package/dist/{lib → src/framework/lib}/zodToMongoose.d.ts +1 -1
- package/dist/{lib → src/framework/lib}/zodToMongoose.js +11 -11
- package/dist/{middleware → src/framework/middleware}/auditLog.d.ts +4 -3
- package/dist/src/framework/middleware/auditLog.js +42 -0
- package/dist/{middleware → src/framework/middleware}/botProtection.d.ts +2 -2
- package/dist/{middleware → src/framework/middleware}/botProtection.js +8 -9
- package/dist/src/framework/middleware/cacheResponse.d.ts +35 -0
- package/dist/src/framework/middleware/cacheResponse.js +126 -0
- package/dist/{middleware → src/framework/middleware}/captcha.d.ts +2 -3
- package/dist/src/framework/middleware/captcha.js +37 -0
- package/dist/{middleware → src/framework/middleware}/errorHandler.d.ts +1 -1
- package/dist/{middleware → src/framework/middleware}/errorHandler.js +2 -2
- package/dist/src/framework/middleware/index.js +1 -0
- package/dist/{middleware → src/framework/middleware}/logger.d.ts +1 -1
- package/dist/src/framework/middleware/metrics.d.ts +12 -0
- package/dist/src/framework/middleware/metrics.js +26 -0
- package/dist/{middleware → src/framework/middleware}/rateLimit.d.ts +2 -2
- package/dist/src/framework/middleware/rateLimit.js +22 -0
- package/dist/src/framework/middleware/requestId.d.ts +3 -0
- package/dist/{middleware → src/framework/middleware}/requestId.js +2 -2
- package/dist/{middleware → src/framework/middleware}/requestLogger.d.ts +3 -3
- package/dist/{middleware → src/framework/middleware}/requestLogger.js +17 -12
- package/dist/{middleware → src/framework/middleware}/requestSigning.d.ts +2 -2
- package/dist/{middleware → src/framework/middleware}/requestSigning.js +18 -20
- package/dist/src/framework/middleware/tenant.d.ts +14 -0
- package/dist/{middleware → src/framework/middleware}/tenant.js +31 -27
- package/dist/src/framework/middleware/upload.d.ts +5 -0
- package/dist/{middleware → src/framework/middleware}/upload.js +4 -4
- package/dist/{middleware → src/framework/middleware}/webhookAuth.d.ts +3 -3
- package/dist/{middleware → src/framework/middleware}/webhookAuth.js +11 -12
- package/dist/src/framework/models/AuditLog.d.ts +21 -0
- package/dist/src/framework/models/AuditLog.js +31 -0
- package/dist/src/framework/mountMiddleware.d.ts +91 -0
- package/dist/src/framework/mountMiddleware.js +128 -0
- package/dist/src/framework/mountOptionalEndpoints.d.ts +103 -0
- package/dist/src/framework/mountOptionalEndpoints.js +47 -0
- package/dist/src/framework/mountRoutes.d.ts +21 -0
- package/dist/src/framework/mountRoutes.js +144 -0
- package/dist/src/framework/persistence/cronRegistry.d.ts +28 -0
- package/dist/src/framework/persistence/cronRegistry.js +139 -0
- package/dist/src/framework/persistence/idempotency.d.ts +26 -0
- package/dist/src/framework/persistence/idempotency.js +178 -0
- package/dist/src/framework/persistence/index.d.ts +6 -0
- package/dist/src/framework/persistence/index.js +8 -0
- package/dist/src/framework/persistence/storeInfra.d.ts +9 -0
- package/dist/src/framework/persistence/storeInfra.js +1 -0
- package/dist/src/framework/persistence/uploadRegistry.d.ts +35 -0
- package/dist/src/framework/persistence/uploadRegistry.js +235 -0
- package/dist/src/framework/persistence/wsMessages.d.ts +22 -0
- package/dist/src/framework/persistence/wsMessages.js +296 -0
- package/dist/src/framework/preloadSchemas.d.ts +24 -0
- package/dist/src/framework/preloadSchemas.js +42 -0
- package/dist/src/framework/registerBoundaryAdapters.d.ts +23 -0
- package/dist/src/framework/registerBoundaryAdapters.js +46 -0
- package/dist/src/framework/routes/admin.d.ts +9 -0
- package/dist/src/framework/routes/admin.js +361 -0
- package/dist/src/framework/routes/health.d.ts +1 -0
- package/dist/src/framework/routes/health.js +21 -0
- package/dist/src/framework/routes/home.d.ts +1 -0
- package/dist/src/framework/routes/home.js +18 -0
- package/dist/src/framework/routes/jobs.d.ts +3 -0
- package/dist/{routes → src/framework/routes}/jobs.js +128 -103
- package/dist/src/framework/routes/metrics.d.ts +10 -0
- package/dist/src/framework/routes/metrics.js +57 -0
- package/dist/{routes → src/framework/routes}/uploads.d.ts +3 -3
- package/dist/src/framework/routes/uploads.js +262 -0
- package/dist/src/framework/runPluginLifecycle.d.ts +27 -0
- package/dist/src/framework/runPluginLifecycle.js +121 -0
- package/dist/src/framework/secrets/frameworkSecretSchema.d.ts +58 -0
- package/dist/src/framework/secrets/frameworkSecretSchema.js +20 -0
- package/dist/src/framework/secrets/index.d.ts +9 -0
- package/dist/src/framework/secrets/index.js +7 -0
- package/dist/src/framework/secrets/providers/envProvider.d.ts +15 -0
- package/dist/src/framework/secrets/providers/envProvider.js +18 -0
- package/dist/src/framework/secrets/providers/fileProvider.d.ts +8 -0
- package/dist/src/framework/secrets/providers/fileProvider.js +82 -0
- package/dist/src/framework/secrets/providers/ssmProvider.d.ts +20 -0
- package/dist/src/framework/secrets/providers/ssmProvider.js +127 -0
- package/dist/src/framework/secrets/resolveSecretBundle.d.ts +53 -0
- package/dist/src/framework/secrets/resolveSecretBundle.js +84 -0
- package/dist/src/framework/secrets/resolveSecrets.d.ts +18 -0
- package/dist/src/framework/secrets/resolveSecrets.js +34 -0
- package/dist/src/framework/sse/index.d.ts +21 -0
- package/dist/src/framework/sse/index.js +109 -0
- package/dist/src/framework/ws/index.d.ts +11 -0
- package/dist/src/framework/ws/index.js +8 -0
- package/dist/src/index.d.ts +87 -0
- package/dist/src/index.js +58 -0
- package/dist/src/lib/appConfig.d.ts +7 -0
- package/dist/src/lib/appConfig.js +27 -0
- package/dist/src/lib/appMeta.d.ts +7 -0
- package/dist/src/lib/appMeta.js +3 -0
- package/dist/src/lib/authConfig.d.ts +532 -0
- package/dist/{lib/appConfig.js → src/lib/authConfig.js} +75 -17
- package/dist/{lib → src/lib}/context.d.ts +6 -12
- package/dist/{lib → src/lib}/context.js +5 -5
- package/dist/src/lib/logger.d.ts +1 -0
- package/dist/src/lib/logger.js +1 -0
- package/dist/src/lib/mongo.d.ts +58 -0
- package/dist/src/lib/mongo.js +96 -0
- package/dist/src/lib/queue.d.ts +72 -0
- package/dist/src/lib/queue.js +152 -0
- package/dist/src/lib/redis.d.ts +28 -0
- package/dist/src/lib/redis.js +72 -0
- package/dist/{lib → src/lib}/signing.d.ts +2 -2
- package/dist/src/lib/signing.js +210 -0
- package/dist/src/lib/signingConfig.d.ts +40 -0
- package/dist/src/lib/signingConfig.js +28 -0
- package/dist/src/server.d.ts +146 -0
- package/dist/src/server.js +469 -0
- package/dist/src/shared/lib/HttpError.d.ts +1 -0
- package/dist/src/shared/lib/HttpError.js +2 -0
- package/dist/src/shared/lib/constants.d.ts +10 -0
- package/dist/src/shared/lib/crypto.d.ts +43 -0
- package/dist/src/shared/lib/crypto.js +74 -0
- package/dist/src/shared/lib/signing.d.ts +52 -0
- package/dist/{lib → src/shared/lib}/signing.js +35 -8
- package/dist/src/testing.d.ts +34 -0
- package/dist/src/testing.js +93 -0
- package/package.json +60 -24
- package/dist/adapters/memoryAuth.d.ts +0 -52
- package/dist/adapters/memoryAuth.js +0 -749
- package/dist/adapters/memoryStorage.d.ts +0 -3
- package/dist/adapters/memoryStorage.js +0 -44
- package/dist/adapters/mongoAuth.d.ts +0 -2
- package/dist/adapters/mongoAuth.js +0 -403
- package/dist/adapters/sqliteAuth.d.ts +0 -72
- package/dist/adapters/sqliteAuth.js +0 -858
- package/dist/app.d.ts +0 -559
- package/dist/app.js +0 -651
- package/dist/entrypoints/mongo.d.ts +0 -5
- package/dist/entrypoints/mongo.js +0 -4
- package/dist/entrypoints/queue.d.ts +0 -2
- package/dist/entrypoints/queue.js +0 -1
- package/dist/entrypoints/redis.d.ts +0 -1
- package/dist/entrypoints/redis.js +0 -1
- package/dist/index.d.ts +0 -117
- package/dist/index.js +0 -88
- package/dist/lib/appConfig.d.ts +0 -275
- package/dist/lib/auditLog.d.ts +0 -58
- package/dist/lib/auditLog.js +0 -218
- package/dist/lib/authAdapter.d.ts +0 -246
- package/dist/lib/authAdapter.js +0 -7
- package/dist/lib/authRateLimit.d.ts +0 -13
- package/dist/lib/authRateLimit.js +0 -117
- package/dist/lib/clientIp.d.ts +0 -14
- package/dist/lib/credentialStuffing.d.ts +0 -31
- package/dist/lib/credentialStuffing.js +0 -77
- package/dist/lib/crypto.d.ts +0 -11
- package/dist/lib/crypto.js +0 -22
- package/dist/lib/deletionCancelToken.d.ts +0 -12
- package/dist/lib/deletionCancelToken.js +0 -88
- package/dist/lib/emailVerification.d.ts +0 -19
- package/dist/lib/emailVerification.js +0 -129
- package/dist/lib/fingerprint.js +0 -36
- package/dist/lib/idempotency.js +0 -182
- package/dist/lib/jwks.d.ts +0 -25
- package/dist/lib/jwks.js +0 -51
- package/dist/lib/jwt.d.ts +0 -15
- package/dist/lib/jwt.js +0 -111
- package/dist/lib/metrics.d.ts +0 -14
- package/dist/lib/mfaChallenge.d.ts +0 -55
- package/dist/lib/mfaChallenge.js +0 -398
- package/dist/lib/mongo.d.ts +0 -39
- package/dist/lib/mongo.js +0 -124
- package/dist/lib/oauth.d.ts +0 -40
- package/dist/lib/oauth.js +0 -101
- package/dist/lib/oauthCode.d.ts +0 -15
- package/dist/lib/oauthCode.js +0 -95
- package/dist/lib/pagination.d.ts +0 -119
- package/dist/lib/pagination.js +0 -166
- package/dist/lib/queue.d.ts +0 -37
- package/dist/lib/queue.js +0 -117
- package/dist/lib/redis.d.ts +0 -9
- package/dist/lib/redis.js +0 -61
- package/dist/lib/resetPassword.d.ts +0 -12
- package/dist/lib/resetPassword.js +0 -93
- package/dist/lib/roles.d.ts +0 -7
- package/dist/lib/roles.js +0 -49
- package/dist/lib/saml.d.ts +0 -25
- package/dist/lib/saml.js +0 -64
- package/dist/lib/securityEvents.d.ts +0 -28
- package/dist/lib/securityEvents.js +0 -26
- package/dist/lib/session.d.ts +0 -49
- package/dist/lib/session.js +0 -597
- package/dist/lib/tenant.d.ts +0 -15
- package/dist/lib/tenant.js +0 -65
- package/dist/lib/upload.js +0 -112
- package/dist/lib/uploadRegistry.d.ts +0 -18
- package/dist/lib/uploadRegistry.js +0 -83
- package/dist/lib/ws.d.ts +0 -22
- package/dist/lib/ws.js +0 -96
- package/dist/lib/wsHeartbeat.d.ts +0 -12
- package/dist/lib/wsHeartbeat.js +0 -57
- package/dist/lib/wsMessages.d.ts +0 -40
- package/dist/lib/wsMessages.js +0 -330
- package/dist/lib/wsPresence.d.ts +0 -25
- package/dist/lib/wsPresence.js +0 -99
- package/dist/middleware/auditLog.js +0 -39
- package/dist/middleware/bearerAuth.d.ts +0 -2
- package/dist/middleware/bearerAuth.js +0 -11
- package/dist/middleware/cacheResponse.d.ts +0 -15
- package/dist/middleware/cacheResponse.js +0 -178
- package/dist/middleware/captcha.js +0 -36
- package/dist/middleware/csrf.js +0 -129
- package/dist/middleware/identify.d.ts +0 -3
- package/dist/middleware/identify.js +0 -122
- package/dist/middleware/index.js +0 -1
- package/dist/middleware/metrics.d.ts +0 -9
- package/dist/middleware/metrics.js +0 -26
- package/dist/middleware/rateLimit.js +0 -22
- package/dist/middleware/requestId.d.ts +0 -3
- package/dist/middleware/scimAuth.d.ts +0 -8
- package/dist/middleware/scimAuth.js +0 -29
- package/dist/middleware/tenant.d.ts +0 -5
- package/dist/middleware/upload.d.ts +0 -5
- package/dist/middleware/userAuth.d.ts +0 -3
- package/dist/middleware/userAuth.js +0 -6
- package/dist/models/AuditLog.d.ts +0 -30
- package/dist/models/AuditLog.js +0 -39
- package/dist/models/AuthUser.js +0 -55
- package/dist/models/Group.d.ts +0 -21
- package/dist/models/Group.js +0 -28
- package/dist/models/GroupMembership.js +0 -25
- package/dist/models/TenantRole.d.ts +0 -15
- package/dist/models/TenantRole.js +0 -23
- package/dist/routes/auth.d.ts +0 -12
- package/dist/routes/auth.js +0 -744
- package/dist/routes/groups.js +0 -346
- package/dist/routes/health.d.ts +0 -1
- package/dist/routes/health.js +0 -22
- package/dist/routes/home.d.ts +0 -1
- package/dist/routes/home.js +0 -16
- package/dist/routes/jobs.d.ts +0 -2
- package/dist/routes/m2m.d.ts +0 -2
- package/dist/routes/m2m.js +0 -72
- package/dist/routes/metrics.d.ts +0 -8
- package/dist/routes/metrics.js +0 -55
- package/dist/routes/mfa.d.ts +0 -5
- package/dist/routes/mfa.js +0 -628
- package/dist/routes/oauth.d.ts +0 -2
- package/dist/routes/oauth.js +0 -520
- package/dist/routes/oidc.d.ts +0 -2
- package/dist/routes/oidc.js +0 -29
- package/dist/routes/passkey.d.ts +0 -1
- package/dist/routes/passkey.js +0 -157
- package/dist/routes/saml.d.ts +0 -2
- package/dist/routes/saml.js +0 -86
- package/dist/routes/scim.d.ts +0 -2
- package/dist/routes/scim.js +0 -255
- package/dist/routes/uploads.js +0 -227
- package/dist/schemas/auth.js +0 -30
- package/dist/server.d.ts +0 -57
- package/dist/server.js +0 -112
- package/dist/services/auth.d.ts +0 -29
- package/dist/services/auth.js +0 -238
- package/dist/ws/index.d.ts +0 -10
- package/dist/ws/index.js +0 -39
- package/docs/sections/adding-middleware/full.md +0 -35
- package/docs/sections/adding-models/full.md +0 -125
- package/docs/sections/adding-models/overview.md +0 -13
- package/docs/sections/adding-routes/full.md +0 -182
- package/docs/sections/adding-routes/overview.md +0 -23
- package/docs/sections/auth-flow/full.md +0 -790
- package/docs/sections/auth-flow/overview.md +0 -10
- package/docs/sections/auth-security-examples/full.md +0 -388
- package/docs/sections/authentication/full.md +0 -130
- package/docs/sections/authentication/overview.md +0 -5
- package/docs/sections/cli/full.md +0 -42
- package/docs/sections/configuration/full.md +0 -172
- package/docs/sections/configuration/overview.md +0 -18
- package/docs/sections/configuration-example/full.md +0 -117
- package/docs/sections/configuration-example/overview.md +0 -30
- package/docs/sections/documentation/full.md +0 -171
- package/docs/sections/environment-variables/full.md +0 -55
- package/docs/sections/exports/full.md +0 -123
- package/docs/sections/extending-context/full.md +0 -59
- package/docs/sections/header.md +0 -3
- package/docs/sections/installation/full.md +0 -6
- package/docs/sections/jobs/full.md +0 -140
- package/docs/sections/jobs/overview.md +0 -15
- package/docs/sections/logging/full.md +0 -83
- package/docs/sections/metrics/full.md +0 -131
- package/docs/sections/mongodb-connections/full.md +0 -45
- package/docs/sections/mongodb-connections/overview.md +0 -7
- package/docs/sections/multi-tenancy/full.md +0 -66
- package/docs/sections/multi-tenancy/overview.md +0 -15
- package/docs/sections/oauth/full.md +0 -189
- package/docs/sections/oauth/overview.md +0 -16
- package/docs/sections/package-development/full.md +0 -7
- package/docs/sections/pagination/full.md +0 -93
- package/docs/sections/passkey-login/full.md +0 -90
- package/docs/sections/passkey-login/overview.md +0 -1
- package/docs/sections/peer-dependencies/full.md +0 -47
- package/docs/sections/quick-start/full.md +0 -43
- package/docs/sections/response-caching/full.md +0 -117
- package/docs/sections/response-caching/overview.md +0 -13
- package/docs/sections/roles/full.md +0 -225
- package/docs/sections/roles/overview.md +0 -14
- package/docs/sections/running-without-redis/full.md +0 -16
- package/docs/sections/running-without-redis-or-mongodb/full.md +0 -60
- package/docs/sections/signing/full.md +0 -203
- package/docs/sections/stack/full.md +0 -10
- package/docs/sections/uploads/full.md +0 -208
- package/docs/sections/versioning/full.md +0 -85
- package/docs/sections/webhook-auth/full.md +0 -100
- package/docs/sections/websocket/full.md +0 -196
- package/docs/sections/websocket/overview.md +0 -5
- package/docs/sections/websocket-rooms/full.md +0 -102
- package/docs/sections/websocket-rooms/overview.md +0 -5
- /package/dist/{lib/storageAdapter.js → packages/bunshot-admin/src/types/env.js} +0 -0
- /package/dist/{lib → packages/bunshot-auth/src/lib}/fingerprint.d.ts +0 -0
- /package/dist/{lib → packages/bunshot-auth/src/lib}/logger.d.ts +0 -0
- /package/dist/{lib → packages/bunshot-core/src}/constants.d.ts +0 -0
- /package/dist/{lib → packages/bunshot-core/src}/storageAdapter.d.ts +0 -0
- /package/dist/{lib → src/framework/lib}/createDtoMapper.d.ts +0 -0
- /package/dist/{lib → src/framework/lib}/stripUnreferencedSchemas.d.ts +0 -0
- /package/dist/{middleware → src/framework/middleware}/cors.d.ts +0 -0
- /package/dist/{middleware → src/framework/middleware}/cors.js +0 -0
- /package/dist/{middleware → src/framework/middleware}/index.d.ts +0 -0
- /package/dist/{middleware → src/framework/middleware}/logger.js +0 -0
- /package/dist/{lib → src/shared/lib}/constants.js +0 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
const VERIFY_URLS = {
|
|
2
|
-
recaptcha:
|
|
3
|
-
hcaptcha:
|
|
4
|
-
turnstile:
|
|
2
|
+
recaptcha: 'https://www.google.com/recaptcha/api/siteverify',
|
|
3
|
+
hcaptcha: 'https://hcaptcha.com/siteverify',
|
|
4
|
+
turnstile: 'https://challenges.cloudflare.com/turnstile/v0/siteverify',
|
|
5
5
|
};
|
|
6
6
|
/**
|
|
7
7
|
* Verify a CAPTCHA token with the provider's API.
|
|
@@ -11,25 +11,28 @@ export async function verifyCaptcha(token, config, ip) {
|
|
|
11
11
|
const url = VERIFY_URLS[config.provider];
|
|
12
12
|
const body = new URLSearchParams({ secret: config.secretKey, response: token });
|
|
13
13
|
if (ip)
|
|
14
|
-
body.set(
|
|
14
|
+
body.set('remoteip', ip);
|
|
15
15
|
let data;
|
|
16
16
|
try {
|
|
17
|
-
const res = await fetch(url, { method:
|
|
17
|
+
const res = await fetch(url, { method: 'POST', body });
|
|
18
18
|
if (!res.ok)
|
|
19
19
|
return { success: false, error: `Provider returned ${res.status}` };
|
|
20
|
-
data = await res.json();
|
|
20
|
+
data = (await res.json());
|
|
21
21
|
}
|
|
22
22
|
catch (err) {
|
|
23
|
-
return { success: false, error:
|
|
23
|
+
return { success: false, error: 'CAPTCHA provider unreachable' };
|
|
24
24
|
}
|
|
25
25
|
if (!data.success) {
|
|
26
|
-
return {
|
|
26
|
+
return {
|
|
27
|
+
success: false,
|
|
28
|
+
error: String(data['error-codes']?.[0] ?? 'invalid-token'),
|
|
29
|
+
};
|
|
27
30
|
}
|
|
28
31
|
// reCAPTCHA v3: check score
|
|
29
|
-
if (config.provider ===
|
|
32
|
+
if (config.provider === 'recaptcha' && typeof data.score === 'number') {
|
|
30
33
|
const minScore = config.minScore ?? 0.5;
|
|
31
34
|
if (data.score < minScore) {
|
|
32
|
-
return { success: false, score: data.score, error:
|
|
35
|
+
return { success: false, score: data.score, error: 'score-too-low' };
|
|
33
36
|
}
|
|
34
37
|
return { success: true, score: data.score };
|
|
35
38
|
}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
/** Check if a Zod type is nullable or optional */
|
|
2
2
|
function isNullable(zodType) {
|
|
3
3
|
const defType = zodType?._zod?.def?.type;
|
|
4
|
-
if (defType ===
|
|
4
|
+
if (defType === 'nullable')
|
|
5
5
|
return true;
|
|
6
|
-
if (defType ===
|
|
6
|
+
if (defType === 'optional')
|
|
7
7
|
return true;
|
|
8
|
-
if (defType ===
|
|
8
|
+
if (defType === 'default')
|
|
9
9
|
return isNullable(zodType._zod.def.innerType);
|
|
10
10
|
return false;
|
|
11
11
|
}
|
|
@@ -46,7 +46,7 @@ export function createDtoMapper(zodSchema, config = {}) {
|
|
|
46
46
|
return (doc) => {
|
|
47
47
|
const dto = {};
|
|
48
48
|
for (const field of apiFields) {
|
|
49
|
-
if (field ===
|
|
49
|
+
if (field === 'id') {
|
|
50
50
|
dto.id = doc._id.toString();
|
|
51
51
|
continue;
|
|
52
52
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { createRoute, withSecurity, registerSchema, registerSchemas, maybeAutoRegister, } from '../../../packages/bunshot-core/src/index.js';
|
|
@@ -1,12 +1,9 @@
|
|
|
1
|
-
import type { MiddlewareHandler } from
|
|
2
|
-
import type { AppEnv } from
|
|
1
|
+
import type { MiddlewareHandler } from 'hono';
|
|
2
|
+
import type { AppEnv } from '../../../packages/bunshot-core/src/index.js';
|
|
3
3
|
export interface IdempotencyOptions {
|
|
4
4
|
/** TTL in seconds for cached responses. Default: 86400 (24 hours). */
|
|
5
5
|
ttl?: number;
|
|
6
6
|
}
|
|
7
|
-
type IdempotencyStore = "redis" | "mongo" | "sqlite" | "memory";
|
|
8
|
-
export declare const setIdempotencyStore: (store: IdempotencyStore) => void;
|
|
9
|
-
export declare const clearIdempotencyMemoryStore: () => void;
|
|
10
7
|
/**
|
|
11
8
|
* Idempotency middleware. Reads the `Idempotency-Key` header and returns a
|
|
12
9
|
* cached response if one exists for this user + key combination. Otherwise
|
|
@@ -19,4 +16,3 @@ export declare const clearIdempotencyMemoryStore: () => void;
|
|
|
19
16
|
* prevent enumeration. When off, raw keys are stored (slight enumeration risk).
|
|
20
17
|
*/
|
|
21
18
|
export declare const idempotent: (opts?: IdempotencyOptions) => MiddlewareHandler<AppEnv>;
|
|
22
|
-
export {};
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
// ---------------------------------------------------------------------------
|
|
2
|
+
// Idempotency middleware — consumes repository from BunshotContext
|
|
3
|
+
// ---------------------------------------------------------------------------
|
|
4
|
+
import { hmacSign } from '../../lib/signing';
|
|
5
|
+
import { HEADER_IDEMPOTENCY_KEY } from '../../../packages/bunshot-core/src/index.js';
|
|
6
|
+
// ---------------------------------------------------------------------------
|
|
7
|
+
// Key derivation
|
|
8
|
+
// ---------------------------------------------------------------------------
|
|
9
|
+
function deriveKey(rawKey, userId, signing) {
|
|
10
|
+
const prefix = userId ?? 'anon';
|
|
11
|
+
if (signing?.config?.idempotencyKeys && signing.secret) {
|
|
12
|
+
return `${prefix}:${hmacSign(rawKey, signing.secret)}`;
|
|
13
|
+
}
|
|
14
|
+
return `${prefix}:${rawKey}`;
|
|
15
|
+
}
|
|
16
|
+
// ---------------------------------------------------------------------------
|
|
17
|
+
// Middleware factory
|
|
18
|
+
// ---------------------------------------------------------------------------
|
|
19
|
+
/**
|
|
20
|
+
* Idempotency middleware. Reads the `Idempotency-Key` header and returns a
|
|
21
|
+
* cached response if one exists for this user + key combination. Otherwise
|
|
22
|
+
* calls the next handler, stores the response, and returns it.
|
|
23
|
+
*
|
|
24
|
+
* On write collision (two concurrent identical requests), the second request
|
|
25
|
+
* re-reads and returns the first-stored result.
|
|
26
|
+
*
|
|
27
|
+
* When `signing.idempotencyKeys: true`, keys are HMAC'd before storage to
|
|
28
|
+
* prevent enumeration. When off, raw keys are stored (slight enumeration risk).
|
|
29
|
+
*/
|
|
30
|
+
export const idempotent = (opts) => async (c, next) => {
|
|
31
|
+
const rawKey = c.req.header(HEADER_IDEMPOTENCY_KEY);
|
|
32
|
+
if (!rawKey) {
|
|
33
|
+
await next();
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
const ctx = c.get('bunshotCtx');
|
|
37
|
+
const adapter = ctx?.persistence.idempotency;
|
|
38
|
+
if (!adapter) {
|
|
39
|
+
// No persistence configured — pass through
|
|
40
|
+
await next();
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
const userId = c.get('authUserId') ?? null;
|
|
44
|
+
const signingConfig = ctx?.signing ?? null;
|
|
45
|
+
const signingSecret = signingConfig?.secret ?? null;
|
|
46
|
+
const key = deriveKey(rawKey, userId, { config: signingConfig, secret: signingSecret });
|
|
47
|
+
const ttl = opts?.ttl ?? 86400;
|
|
48
|
+
// Cache hit — return stored response
|
|
49
|
+
const cached = await adapter.get(key);
|
|
50
|
+
if (cached) {
|
|
51
|
+
return c.json(JSON.parse(cached.response), cached.status);
|
|
52
|
+
}
|
|
53
|
+
// Cache miss — call handler
|
|
54
|
+
await next();
|
|
55
|
+
// Capture the response body by reading it
|
|
56
|
+
const status = c.res.status;
|
|
57
|
+
let body = '';
|
|
58
|
+
try {
|
|
59
|
+
body = await c.res.clone().text();
|
|
60
|
+
}
|
|
61
|
+
catch {
|
|
62
|
+
// Non-text/non-json response — skip caching
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
await adapter.set(key, body, status, ttl);
|
|
66
|
+
// Re-read to handle write collision (NX semantics — set() may have been a no-op)
|
|
67
|
+
const stored = await adapter.get(key);
|
|
68
|
+
if (stored && stored.response !== body) {
|
|
69
|
+
c.res = new Response(stored.response, {
|
|
70
|
+
status: stored.status,
|
|
71
|
+
headers: { 'content-type': 'application/json' },
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
};
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
function isVerbose() {
|
|
2
|
+
const v = process.env.LOGGING_VERBOSE;
|
|
3
|
+
return v !== undefined ? v === 'true' : process.env.NODE_ENV !== 'production';
|
|
4
|
+
}
|
|
5
|
+
export const log = (...args) => {
|
|
6
|
+
if (isVerbose())
|
|
7
|
+
console.log(...args);
|
|
8
|
+
};
|
|
9
|
+
const authTraceEnabled = process.env.LOGGING_AUTH_TRACE === 'true';
|
|
10
|
+
/** Like log(), but also requires LOGGING_AUTH_TRACE=true. Use for lines that include user/session IDs. */
|
|
11
|
+
export const authTrace = (...args) => {
|
|
12
|
+
if (authTraceEnabled)
|
|
13
|
+
log(...args);
|
|
14
|
+
};
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
type Labels = Record<string, string>;
|
|
2
|
+
interface CounterEntry {
|
|
3
|
+
labels: Labels;
|
|
4
|
+
value: number;
|
|
5
|
+
}
|
|
6
|
+
interface HistogramEntry {
|
|
7
|
+
labels: Labels;
|
|
8
|
+
buckets: number[];
|
|
9
|
+
sum: number;
|
|
10
|
+
count: number;
|
|
11
|
+
}
|
|
12
|
+
type GaugeCallback = () => Promise<{
|
|
13
|
+
labels: Labels;
|
|
14
|
+
value: number;
|
|
15
|
+
}[]>;
|
|
16
|
+
export interface MetricsState {
|
|
17
|
+
readonly counters: Map<string, Map<string, CounterEntry>>;
|
|
18
|
+
readonly histograms: Map<string, {
|
|
19
|
+
boundaries: number[];
|
|
20
|
+
entries: Map<string, HistogramEntry>;
|
|
21
|
+
}>;
|
|
22
|
+
readonly gaugeCallbacks: Map<string, GaugeCallback>;
|
|
23
|
+
queues: Map<string, any> | null;
|
|
24
|
+
}
|
|
25
|
+
export declare function createMetricsState(): MetricsState;
|
|
26
|
+
export declare function defaultNormalizePath(path: string): string;
|
|
27
|
+
export declare function incrementCounter(state: MetricsState, name: string, labels: Labels, amount?: number): void;
|
|
28
|
+
export declare function observeHistogram(state: MetricsState, name: string, labels: Labels, value: number, buckets?: number[]): void;
|
|
29
|
+
export declare function registerGaugeCallback(state: MetricsState, name: string, cb: GaugeCallback): void;
|
|
30
|
+
export declare function serializeMetrics(state: MetricsState): Promise<string>;
|
|
31
|
+
export declare function resetMetrics(state: MetricsState): void;
|
|
32
|
+
export declare function setMetricsQueues(state: MetricsState, map: Map<string, any>): void;
|
|
33
|
+
export declare function closeMetricsQueues(state: MetricsState): Promise<void>;
|
|
34
|
+
export {};
|
|
@@ -1,44 +1,49 @@
|
|
|
1
1
|
// In-memory Prometheus-compatible metrics registry.
|
|
2
|
-
//
|
|
3
|
-
|
|
2
|
+
// Owned per app instance via MetricsState, not process-global.
|
|
3
|
+
export function createMetricsState() {
|
|
4
|
+
return {
|
|
5
|
+
counters: new Map(),
|
|
6
|
+
histograms: new Map(),
|
|
7
|
+
gaugeCallbacks: new Map(),
|
|
8
|
+
queues: null,
|
|
9
|
+
};
|
|
10
|
+
}
|
|
4
11
|
function labelKey(labels) {
|
|
5
12
|
return Object.entries(labels)
|
|
6
13
|
.sort(([a], [b]) => a.localeCompare(b))
|
|
7
14
|
.map(([k, v]) => `${k}="${v}"`)
|
|
8
|
-
.join(
|
|
15
|
+
.join(',');
|
|
9
16
|
}
|
|
10
17
|
function formatLabels(labels) {
|
|
11
18
|
const pairs = Object.entries(labels)
|
|
12
19
|
.sort(([a], [b]) => a.localeCompare(b))
|
|
13
20
|
.map(([k, v]) => `${k}="${v}"`);
|
|
14
|
-
return pairs.length ? `{${pairs.join(
|
|
21
|
+
return pairs.length ? `{${pairs.join(',')}}` : '';
|
|
15
22
|
}
|
|
16
|
-
// ── Path normalization ───────────────────────────────────────────────────────
|
|
17
23
|
const UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
18
24
|
const OBJECTID_RE = /^[0-9a-f]{24}$/i;
|
|
19
25
|
const NUMERIC_RE = /^\d+$/;
|
|
20
26
|
export function defaultNormalizePath(path) {
|
|
21
27
|
return path
|
|
22
|
-
.split(
|
|
23
|
-
.map(
|
|
28
|
+
.split('/')
|
|
29
|
+
.map(seg => {
|
|
24
30
|
if (!seg)
|
|
25
31
|
return seg;
|
|
26
32
|
if (UUID_RE.test(seg))
|
|
27
|
-
return
|
|
33
|
+
return ':id';
|
|
28
34
|
if (OBJECTID_RE.test(seg))
|
|
29
|
-
return
|
|
35
|
+
return ':id';
|
|
30
36
|
if (NUMERIC_RE.test(seg))
|
|
31
|
-
return
|
|
37
|
+
return ':id';
|
|
32
38
|
return seg;
|
|
33
39
|
})
|
|
34
|
-
.join(
|
|
40
|
+
.join('/');
|
|
35
41
|
}
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
let metric = counters.get(name);
|
|
42
|
+
export function incrementCounter(state, name, labels, amount = 1) {
|
|
43
|
+
let metric = state.counters.get(name);
|
|
39
44
|
if (!metric) {
|
|
40
45
|
metric = new Map();
|
|
41
|
-
counters.set(name, metric);
|
|
46
|
+
state.counters.set(name, metric);
|
|
42
47
|
}
|
|
43
48
|
const key = labelKey(labels);
|
|
44
49
|
const existing = metric.get(key);
|
|
@@ -49,14 +54,12 @@ export function incrementCounter(name, labels, amount = 1) {
|
|
|
49
54
|
metric.set(key, { labels: { ...labels }, value: amount });
|
|
50
55
|
}
|
|
51
56
|
}
|
|
52
|
-
// ── Histogram ────────────────────────────────────────────────────────────────
|
|
53
57
|
const DEFAULT_BUCKETS = [0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1, 2.5, 5, 10];
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
let metric = histograms.get(name);
|
|
58
|
+
export function observeHistogram(state, name, labels, value, buckets = DEFAULT_BUCKETS) {
|
|
59
|
+
let metric = state.histograms.get(name);
|
|
57
60
|
if (!metric) {
|
|
58
61
|
metric = { boundaries: buckets, entries: new Map() };
|
|
59
|
-
histograms.set(name, metric);
|
|
62
|
+
state.histograms.set(name, metric);
|
|
60
63
|
}
|
|
61
64
|
const key = labelKey(labels);
|
|
62
65
|
let entry = metric.entries.get(key);
|
|
@@ -64,8 +67,6 @@ export function observeHistogram(name, labels, value, buckets = DEFAULT_BUCKETS)
|
|
|
64
67
|
entry = { labels: { ...labels }, buckets: new Array(buckets.length).fill(0), sum: 0, count: 0 };
|
|
65
68
|
metric.entries.set(key, entry);
|
|
66
69
|
}
|
|
67
|
-
// Find the first (tightest) bucket the value fits in.
|
|
68
|
-
// Serialization will compute cumulative sums across buckets.
|
|
69
70
|
for (let i = 0; i < metric.boundaries.length; i++) {
|
|
70
71
|
if (value <= metric.boundaries[i]) {
|
|
71
72
|
entry.buckets[i]++;
|
|
@@ -75,43 +76,37 @@ export function observeHistogram(name, labels, value, buckets = DEFAULT_BUCKETS)
|
|
|
75
76
|
entry.sum += value;
|
|
76
77
|
entry.count++;
|
|
77
78
|
}
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
gaugeCallbacks.set(name, cb);
|
|
79
|
+
export function registerGaugeCallback(state, name, cb) {
|
|
80
|
+
state.gaugeCallbacks.set(name, cb);
|
|
81
81
|
}
|
|
82
|
-
|
|
83
|
-
export async function serializeMetrics() {
|
|
82
|
+
export async function serializeMetrics(state) {
|
|
84
83
|
const lines = [];
|
|
85
|
-
// Collect gauge callbacks first so any error-counter increments are
|
|
86
|
-
// included when we serialize counters below.
|
|
87
84
|
const gaugeLines = [];
|
|
88
|
-
for (const [name, cb] of gaugeCallbacks) {
|
|
85
|
+
for (const [name, cb] of state.gaugeCallbacks) {
|
|
89
86
|
try {
|
|
90
87
|
const results = await cb();
|
|
91
|
-
gaugeLines.push(`# HELP ${name} ${name.replace(/_/g,
|
|
88
|
+
gaugeLines.push(`# HELP ${name} ${name.replace(/_/g, ' ')}`);
|
|
92
89
|
gaugeLines.push(`# TYPE ${name} gauge`);
|
|
93
90
|
for (const { labels, value } of results) {
|
|
94
91
|
gaugeLines.push(`${name}${formatLabels(labels)} ${value}`);
|
|
95
92
|
}
|
|
96
|
-
gaugeLines.push(
|
|
93
|
+
gaugeLines.push('');
|
|
97
94
|
}
|
|
98
95
|
catch (err) {
|
|
99
96
|
console.warn(`[metrics] Gauge callback "${name}" failed:`, err);
|
|
100
|
-
incrementCounter(
|
|
97
|
+
incrementCounter(state, 'bunshot_gauge_errors_total', { gauge: name });
|
|
101
98
|
}
|
|
102
99
|
}
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
lines.push(`# HELP ${name} Total ${name.replace(/_/g, " ")}`);
|
|
100
|
+
for (const [name, entries] of state.counters) {
|
|
101
|
+
lines.push(`# HELP ${name} Total ${name.replace(/_/g, ' ')}`);
|
|
106
102
|
lines.push(`# TYPE ${name} counter`);
|
|
107
103
|
for (const entry of entries.values()) {
|
|
108
104
|
lines.push(`${name}${formatLabels(entry.labels)} ${entry.value}`);
|
|
109
105
|
}
|
|
110
|
-
lines.push(
|
|
106
|
+
lines.push('');
|
|
111
107
|
}
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
lines.push(`# HELP ${name} ${name.replace(/_/g, " ")}`);
|
|
108
|
+
for (const [name, metric] of state.histograms) {
|
|
109
|
+
lines.push(`# HELP ${name} ${name.replace(/_/g, ' ')}`);
|
|
115
110
|
lines.push(`# TYPE ${name} histogram`);
|
|
116
111
|
for (const entry of metric.entries.values()) {
|
|
117
112
|
const lbls = formatLabels(entry.labels);
|
|
@@ -121,32 +116,28 @@ export async function serializeMetrics() {
|
|
|
121
116
|
const bucketLabels = { ...entry.labels, le: String(metric.boundaries[i]) };
|
|
122
117
|
lines.push(`${name}_bucket${formatLabels(bucketLabels)} ${cumulative}`);
|
|
123
118
|
}
|
|
124
|
-
const infLabels = { ...entry.labels, le:
|
|
119
|
+
const infLabels = { ...entry.labels, le: '+Inf' };
|
|
125
120
|
lines.push(`${name}_bucket${formatLabels(infLabels)} ${entry.count}`);
|
|
126
121
|
lines.push(`${name}_sum${lbls} ${entry.sum}`);
|
|
127
122
|
lines.push(`${name}_count${lbls} ${entry.count}`);
|
|
128
123
|
}
|
|
129
|
-
lines.push(
|
|
124
|
+
lines.push('');
|
|
130
125
|
}
|
|
131
|
-
// Gauges (already collected above)
|
|
132
126
|
lines.push(...gaugeLines);
|
|
133
|
-
return lines.join(
|
|
127
|
+
return lines.join('\n');
|
|
134
128
|
}
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
gaugeCallbacks.clear();
|
|
129
|
+
export function resetMetrics(state) {
|
|
130
|
+
state.counters.clear();
|
|
131
|
+
state.histograms.clear();
|
|
132
|
+
state.gaugeCallbacks.clear();
|
|
140
133
|
}
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
export function setMetricsQueues(map) {
|
|
144
|
-
metricsQueues = map;
|
|
134
|
+
export function setMetricsQueues(state, map) {
|
|
135
|
+
state.queues = map;
|
|
145
136
|
}
|
|
146
|
-
export async function closeMetricsQueues() {
|
|
147
|
-
if (!
|
|
137
|
+
export async function closeMetricsQueues(state) {
|
|
138
|
+
if (!state.queues)
|
|
148
139
|
return;
|
|
149
|
-
for (const q of
|
|
140
|
+
for (const q of state.queues.values()) {
|
|
150
141
|
try {
|
|
151
142
|
await q.close();
|
|
152
143
|
}
|
|
@@ -154,5 +145,6 @@ export async function closeMetricsQueues() {
|
|
|
154
145
|
// best-effort cleanup
|
|
155
146
|
}
|
|
156
147
|
}
|
|
157
|
-
|
|
148
|
+
state.queues.clear();
|
|
149
|
+
state.queues = null;
|
|
158
150
|
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import type { SigningConfig } from '../../lib/signingConfig';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
import type { ZodType } from 'zod';
|
|
4
|
+
export type { PaginationOpts, PaginatedResult } from '../../../packages/bunshot-core/src/index.js';
|
|
5
|
+
export { offsetParams, parseOffsetParams, paginatedResponse } from '../../../packages/bunshot-core/src/index.js';
|
|
6
|
+
export { cursorPaginatedResponse } from '../../../packages/bunshot-core/src/index.js';
|
|
7
|
+
export type { OffsetParamDefaults, ParsedOffsetParams } from '../../../packages/bunshot-core/src/index.js';
|
|
8
|
+
export interface CursorParamDefaults {
|
|
9
|
+
limit?: number;
|
|
10
|
+
maxLimit?: number;
|
|
11
|
+
}
|
|
12
|
+
export interface ParsedCursorParams {
|
|
13
|
+
limit: number;
|
|
14
|
+
cursor: string | undefined;
|
|
15
|
+
}
|
|
16
|
+
export interface CursorResult<T> {
|
|
17
|
+
items: T[];
|
|
18
|
+
nextCursor: string | null;
|
|
19
|
+
hasMore: boolean;
|
|
20
|
+
}
|
|
21
|
+
export declare function cursorParams(defaults?: CursorParamDefaults): z.ZodObject<{
|
|
22
|
+
limit: z.ZodOptional<z.ZodString>;
|
|
23
|
+
cursor: z.ZodOptional<z.ZodString>;
|
|
24
|
+
}, z.core.$strip>;
|
|
25
|
+
export declare function parseCursorParams(raw: {
|
|
26
|
+
limit?: string;
|
|
27
|
+
cursor?: string;
|
|
28
|
+
}, defaults?: CursorParamDefaults, signing?: {
|
|
29
|
+
config: SigningConfig | null;
|
|
30
|
+
secret: string | string[] | null;
|
|
31
|
+
}): ParsedCursorParams & {
|
|
32
|
+
invalidCursor?: true;
|
|
33
|
+
};
|
|
34
|
+
export declare function maybeSignCursor(cursor: string | null, signing?: {
|
|
35
|
+
config: SigningConfig | null;
|
|
36
|
+
secret: string | string[] | null;
|
|
37
|
+
}): string | null;
|
|
38
|
+
export declare function cursorResponse<T extends ZodType>(itemSchema: T, name: string): z.ZodObject<{
|
|
39
|
+
items: z.ZodArray<T>;
|
|
40
|
+
nextCursor: z.ZodNullable<z.ZodString>;
|
|
41
|
+
hasMore: z.ZodBoolean;
|
|
42
|
+
}, z.core.$strip>;
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { signCursor, verifyCursor } from '../../lib/signing';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
import { registerSchema } from '../../../packages/bunshot-core/src/index.js';
|
|
4
|
+
export { offsetParams, parseOffsetParams, paginatedResponse } from '../../../packages/bunshot-core/src/index.js';
|
|
5
|
+
export { cursorPaginatedResponse } from '../../../packages/bunshot-core/src/index.js';
|
|
6
|
+
export function cursorParams(defaults) {
|
|
7
|
+
const defaultLimit = defaults?.limit ?? 50;
|
|
8
|
+
const maxLimit = defaults?.maxLimit ?? 200;
|
|
9
|
+
return z.object({
|
|
10
|
+
limit: z
|
|
11
|
+
.string()
|
|
12
|
+
.optional()
|
|
13
|
+
.describe(`Number of items to return (1-${maxLimit}, default ${defaultLimit})`),
|
|
14
|
+
cursor: z
|
|
15
|
+
.string()
|
|
16
|
+
.optional()
|
|
17
|
+
.describe("Opaque cursor from a previous response's nextCursor field"),
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
export function parseCursorParams(raw, defaults, signing) {
|
|
21
|
+
const defaultLimit = defaults?.limit ?? 50;
|
|
22
|
+
const maxLimit = defaults?.maxLimit ?? 200;
|
|
23
|
+
const rawLimit = parseInt(raw.limit ?? '', 10);
|
|
24
|
+
const limit = isNaN(rawLimit) ? defaultLimit : Math.min(Math.max(rawLimit, 1), maxLimit);
|
|
25
|
+
if (!raw.cursor)
|
|
26
|
+
return { limit, cursor: undefined };
|
|
27
|
+
if (signing?.config?.cursors && signing.secret) {
|
|
28
|
+
const verified = verifyCursor(raw.cursor, signing.secret);
|
|
29
|
+
if (verified === null)
|
|
30
|
+
return { limit, cursor: undefined, invalidCursor: true };
|
|
31
|
+
return { limit, cursor: verified };
|
|
32
|
+
}
|
|
33
|
+
return { limit, cursor: raw.cursor };
|
|
34
|
+
}
|
|
35
|
+
export function maybeSignCursor(cursor, signing) {
|
|
36
|
+
if (!cursor)
|
|
37
|
+
return cursor;
|
|
38
|
+
if (signing?.config?.cursors && signing.secret) {
|
|
39
|
+
return signCursor(cursor, signing.secret);
|
|
40
|
+
}
|
|
41
|
+
return cursor;
|
|
42
|
+
}
|
|
43
|
+
export function cursorResponse(itemSchema, name) {
|
|
44
|
+
const wrapper = z.object({
|
|
45
|
+
items: z.array(itemSchema),
|
|
46
|
+
nextCursor: z.string().nullable(),
|
|
47
|
+
hasMore: z.boolean(),
|
|
48
|
+
});
|
|
49
|
+
registerSchema(name, wrapper);
|
|
50
|
+
return wrapper;
|
|
51
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { RedisOptions } from 'ioredis';
|
|
2
|
+
import type { WsTransportAdapter } from './wsTransport';
|
|
3
|
+
export type { WsTransportAdapter };
|
|
4
|
+
export interface RedisTransportOptions {
|
|
5
|
+
/** ioredis connection options or a Redis URL string */
|
|
6
|
+
connection: RedisOptions | string;
|
|
7
|
+
/** Channel prefix for pub/sub. Default: "ws:room:" */
|
|
8
|
+
channelPrefix?: string;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Redis pub/sub transport for horizontal WebSocket scaling.
|
|
12
|
+
*
|
|
13
|
+
* Uses two ioredis clients — one for publishing and one for subscribing —
|
|
14
|
+
* as required by the Redis pub/sub protocol (a client in subscribe mode
|
|
15
|
+
* cannot issue regular commands).
|
|
16
|
+
*
|
|
17
|
+
* Uses `psubscribe` on `<prefix>*` so that joining new rooms never
|
|
18
|
+
* requires an additional SUBSCRIBE call.
|
|
19
|
+
*
|
|
20
|
+
* Self-echo prevention: every published message is wrapped with the
|
|
21
|
+
* `origin` passed in from `ws.ts` (the server instance UUID). Messages
|
|
22
|
+
* whose origin matches the local instance are dropped by the caller —
|
|
23
|
+
* the origin is forwarded intact to the `onMessage` callback.
|
|
24
|
+
*
|
|
25
|
+
* @example
|
|
26
|
+
* ```ts
|
|
27
|
+
* import { createRedisTransport } from '@lastshotlabs/bunshot'
|
|
28
|
+
*
|
|
29
|
+
* // Pass transport via ws.transport in createServer config:
|
|
30
|
+
* createServer({
|
|
31
|
+
* ws: {
|
|
32
|
+
* transport: createRedisTransport({ connection: { host: 'localhost', port: 6379 } }),
|
|
33
|
+
* endpoints: { '/ws': {} },
|
|
34
|
+
* },
|
|
35
|
+
* })
|
|
36
|
+
* ```
|
|
37
|
+
*/
|
|
38
|
+
export declare function createRedisTransport(opts: RedisTransportOptions): WsTransportAdapter;
|