@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.
Files changed (742) hide show
  1. package/.oclif.manifest.json +39 -0
  2. package/README.md +8282 -2147
  3. package/dist/cli/commands/init.js +690 -0
  4. package/dist/cli/index.js +6 -0
  5. package/dist/cli.js +4 -4
  6. package/dist/packages/bunshot-admin/src/index.d.ts +15 -0
  7. package/dist/packages/bunshot-admin/src/index.js +11 -0
  8. package/dist/packages/bunshot-admin/src/lib/resourceTypes.d.ts +8 -0
  9. package/dist/packages/bunshot-admin/src/lib/resourceTypes.js +33 -0
  10. package/dist/packages/bunshot-admin/src/lib/typedRoute.d.ts +14 -0
  11. package/dist/packages/bunshot-admin/src/lib/typedRoute.js +17 -0
  12. package/dist/packages/bunshot-admin/src/plugin.d.ts +4 -0
  13. package/dist/packages/bunshot-admin/src/plugin.js +46 -0
  14. package/dist/packages/bunshot-admin/src/providers/auth0Access.d.ts +6 -0
  15. package/dist/packages/bunshot-admin/src/providers/auth0Access.js +32 -0
  16. package/dist/packages/bunshot-admin/src/routes/admin.d.ts +10 -0
  17. package/dist/packages/bunshot-admin/src/routes/admin.js +923 -0
  18. package/dist/packages/bunshot-admin/src/routes/mail.d.ts +6 -0
  19. package/dist/packages/bunshot-admin/src/routes/mail.js +114 -0
  20. package/dist/packages/bunshot-admin/src/routes/permissions.d.ts +8 -0
  21. package/dist/packages/bunshot-admin/src/routes/permissions.js +315 -0
  22. package/dist/packages/bunshot-admin/src/types/config.d.ts +16 -0
  23. package/dist/packages/bunshot-admin/src/types/config.js +37 -0
  24. package/dist/packages/bunshot-admin/src/types/env.d.ts +14 -0
  25. package/dist/packages/bunshot-admin/src/types/provider.d.ts +1 -0
  26. package/dist/packages/bunshot-admin/src/types/provider.js +4 -0
  27. package/dist/packages/bunshot-auth/src/adapters/memoryAuth.d.ts +66 -0
  28. package/dist/packages/bunshot-auth/src/adapters/memoryAuth.js +1063 -0
  29. package/dist/packages/bunshot-auth/src/adapters/mongoAuth.d.ts +2 -0
  30. package/dist/packages/bunshot-auth/src/adapters/mongoAuth.js +536 -0
  31. package/dist/packages/bunshot-auth/src/adapters/sqliteAuth.d.ts +88 -0
  32. package/dist/packages/bunshot-auth/src/adapters/sqliteAuth.js +1366 -0
  33. package/dist/packages/bunshot-auth/src/admin/bunshotAccess.d.ts +2 -0
  34. package/dist/packages/bunshot-auth/src/admin/bunshotAccess.js +23 -0
  35. package/dist/packages/bunshot-auth/src/admin/bunshotUsers.d.ts +5 -0
  36. package/dist/packages/bunshot-auth/src/admin/bunshotUsers.js +131 -0
  37. package/dist/packages/bunshot-auth/src/bootstrap.d.ts +38 -0
  38. package/dist/packages/bunshot-auth/src/bootstrap.js +384 -0
  39. package/dist/packages/bunshot-auth/src/config/appConfig.d.ts +3 -0
  40. package/dist/packages/bunshot-auth/src/config/appConfig.js +4 -0
  41. package/dist/packages/bunshot-auth/src/config/authConfig.d.ts +478 -0
  42. package/dist/packages/bunshot-auth/src/config/authConfig.js +46 -0
  43. package/dist/packages/bunshot-auth/src/config/configLock.d.ts +2 -0
  44. package/dist/packages/bunshot-auth/src/config/configLock.js +10 -0
  45. package/dist/packages/bunshot-auth/src/index.d.ts +25 -0
  46. package/dist/packages/bunshot-auth/src/index.js +23 -0
  47. package/dist/packages/bunshot-auth/src/infra/mongo.d.ts +15 -0
  48. package/dist/packages/bunshot-auth/src/infra/mongo.js +44 -0
  49. package/dist/packages/bunshot-auth/src/infra/queue.d.ts +14 -0
  50. package/dist/packages/bunshot-auth/src/infra/queue.js +27 -0
  51. package/dist/packages/bunshot-auth/src/infra/redis.d.ts +5 -0
  52. package/dist/packages/bunshot-auth/src/infra/redis.js +15 -0
  53. package/dist/packages/bunshot-auth/src/infra/signing.d.ts +7 -0
  54. package/dist/packages/bunshot-auth/src/infra/signing.js +8 -0
  55. package/dist/packages/bunshot-auth/src/lib/accountLockout.d.ts +34 -0
  56. package/dist/packages/bunshot-auth/src/lib/accountLockout.js +244 -0
  57. package/dist/packages/bunshot-auth/src/lib/adapterTiers.d.ts +1 -0
  58. package/dist/packages/bunshot-auth/src/lib/adapterTiers.js +1 -0
  59. package/dist/packages/bunshot-auth/src/lib/authAdapter.d.ts +1 -0
  60. package/dist/packages/bunshot-auth/src/lib/authAdapter.js +1 -0
  61. package/dist/packages/bunshot-auth/src/lib/authContext.d.ts +15 -0
  62. package/dist/packages/bunshot-auth/src/lib/authContext.js +1 -0
  63. package/dist/packages/bunshot-auth/src/lib/authEventBus.d.ts +4 -0
  64. package/dist/packages/bunshot-auth/src/lib/authEventBus.js +15 -0
  65. package/dist/packages/bunshot-auth/src/lib/authRateLimit.d.ts +28 -0
  66. package/dist/packages/bunshot-auth/src/lib/authRateLimit.js +205 -0
  67. package/dist/{lib → packages/bunshot-auth/src/lib}/breachedPassword.d.ts +8 -2
  68. package/dist/{lib → packages/bunshot-auth/src/lib}/breachedPassword.js +22 -9
  69. package/dist/packages/bunshot-auth/src/lib/cache.d.ts +12 -0
  70. package/dist/packages/bunshot-auth/src/lib/cache.js +120 -0
  71. package/dist/packages/bunshot-auth/src/lib/clientIp.d.ts +4 -0
  72. package/dist/{lib → packages/bunshot-auth/src/lib}/clientIp.js +14 -7
  73. package/dist/packages/bunshot-auth/src/lib/cookieOptions.d.ts +27 -0
  74. package/dist/packages/bunshot-auth/src/lib/cookieOptions.js +33 -0
  75. package/dist/packages/bunshot-auth/src/lib/credentialStuffing.d.ts +40 -0
  76. package/dist/packages/bunshot-auth/src/lib/credentialStuffing.js +221 -0
  77. package/dist/packages/bunshot-auth/src/lib/deletionCancelToken.d.ts +19 -0
  78. package/dist/packages/bunshot-auth/src/lib/deletionCancelToken.js +148 -0
  79. package/dist/packages/bunshot-auth/src/lib/emailTemplates.d.ts +23 -0
  80. package/dist/packages/bunshot-auth/src/lib/emailTemplates.js +265 -0
  81. package/dist/packages/bunshot-auth/src/lib/emailVerification.d.ts +30 -0
  82. package/dist/packages/bunshot-auth/src/lib/emailVerification.js +200 -0
  83. package/dist/packages/bunshot-auth/src/lib/env.d.ts +1 -0
  84. package/dist/packages/bunshot-auth/src/lib/env.js +3 -0
  85. package/dist/packages/bunshot-auth/src/lib/fingerprint.js +36 -0
  86. package/dist/{lib → packages/bunshot-auth/src/lib}/groups.d.ts +15 -16
  87. package/dist/{lib → packages/bunshot-auth/src/lib}/groups.js +22 -34
  88. package/dist/packages/bunshot-auth/src/lib/jwks.d.ts +28 -0
  89. package/dist/packages/bunshot-auth/src/lib/jwks.js +79 -0
  90. package/dist/packages/bunshot-auth/src/lib/jwt.d.ts +12 -0
  91. package/dist/packages/bunshot-auth/src/lib/jwt.js +86 -0
  92. package/dist/{lib → packages/bunshot-auth/src/lib}/logger.js +3 -3
  93. package/dist/{lib → packages/bunshot-auth/src/lib}/m2m.d.ts +5 -4
  94. package/dist/{lib → packages/bunshot-auth/src/lib}/m2m.js +6 -10
  95. package/dist/packages/bunshot-auth/src/lib/magicLink.d.ts +13 -0
  96. package/dist/packages/bunshot-auth/src/lib/magicLink.js +145 -0
  97. package/dist/packages/bunshot-auth/src/lib/mfaChallenge.d.ts +60 -0
  98. package/dist/packages/bunshot-auth/src/lib/mfaChallenge.js +419 -0
  99. package/dist/packages/bunshot-auth/src/lib/oauth.d.ts +82 -0
  100. package/dist/packages/bunshot-auth/src/lib/oauth.js +177 -0
  101. package/dist/packages/bunshot-auth/src/lib/oauthCode.d.ts +19 -0
  102. package/dist/packages/bunshot-auth/src/lib/oauthCode.js +182 -0
  103. package/dist/packages/bunshot-auth/src/lib/oauthReauth.d.ts +19 -0
  104. package/dist/packages/bunshot-auth/src/lib/oauthReauth.js +255 -0
  105. package/dist/packages/bunshot-auth/src/lib/organization.d.ts +66 -0
  106. package/dist/packages/bunshot-auth/src/lib/organization.js +225 -0
  107. package/dist/packages/bunshot-auth/src/lib/passwordHistory.d.ts +12 -0
  108. package/dist/packages/bunshot-auth/src/lib/passwordHistory.js +31 -0
  109. package/dist/packages/bunshot-auth/src/lib/resetPassword.d.ts +20 -0
  110. package/dist/packages/bunshot-auth/src/lib/resetPassword.js +148 -0
  111. package/dist/packages/bunshot-auth/src/lib/roles.d.ts +9 -0
  112. package/dist/packages/bunshot-auth/src/lib/roles.js +93 -0
  113. package/dist/packages/bunshot-auth/src/lib/saml.d.ts +29 -0
  114. package/dist/packages/bunshot-auth/src/lib/saml.js +73 -0
  115. package/dist/packages/bunshot-auth/src/lib/samlRequestId.d.ts +13 -0
  116. package/dist/packages/bunshot-auth/src/lib/samlRequestId.js +129 -0
  117. package/dist/{lib → packages/bunshot-auth/src/lib}/scim.d.ts +7 -7
  118. package/dist/{lib → packages/bunshot-auth/src/lib}/scim.js +15 -13
  119. package/dist/packages/bunshot-auth/src/lib/securityEventWiring.d.ts +22 -0
  120. package/dist/packages/bunshot-auth/src/lib/securityEventWiring.js +65 -0
  121. package/dist/packages/bunshot-auth/src/lib/session.d.ts +45 -0
  122. package/dist/packages/bunshot-auth/src/lib/session.js +1211 -0
  123. package/dist/packages/bunshot-auth/src/lib/storeInfra.d.ts +26 -0
  124. package/dist/packages/bunshot-auth/src/lib/storeInfra.js +18 -0
  125. package/dist/{lib → packages/bunshot-auth/src/lib}/suspension.d.ts +3 -2
  126. package/dist/{lib → packages/bunshot-auth/src/lib}/suspension.js +2 -5
  127. package/dist/packages/bunshot-auth/src/lib/validateAdapter.d.ts +16 -0
  128. package/dist/packages/bunshot-auth/src/lib/validateAdapter.js +161 -0
  129. package/dist/packages/bunshot-auth/src/middleware/bearerAuth.d.ts +13 -0
  130. package/dist/packages/bunshot-auth/src/middleware/bearerAuth.js +58 -0
  131. package/dist/{middleware → packages/bunshot-auth/src/middleware}/csrf.d.ts +5 -4
  132. package/dist/packages/bunshot-auth/src/middleware/csrf.js +138 -0
  133. package/dist/packages/bunshot-auth/src/middleware/identify.d.ts +4 -0
  134. package/dist/packages/bunshot-auth/src/middleware/identify.js +124 -0
  135. package/dist/{middleware → packages/bunshot-auth/src/middleware}/requireMfaSetup.d.ts +2 -2
  136. package/dist/{middleware → packages/bunshot-auth/src/middleware}/requireMfaSetup.js +10 -8
  137. package/dist/{middleware → packages/bunshot-auth/src/middleware}/requireRole.d.ts +2 -2
  138. package/dist/{middleware → packages/bunshot-auth/src/middleware}/requireRole.js +20 -16
  139. package/dist/{middleware → packages/bunshot-auth/src/middleware}/requireScope.d.ts +2 -2
  140. package/dist/{middleware → packages/bunshot-auth/src/middleware}/requireScope.js +6 -6
  141. package/dist/{middleware → packages/bunshot-auth/src/middleware}/requireStepUp.d.ts +2 -2
  142. package/dist/{middleware → packages/bunshot-auth/src/middleware}/requireStepUp.js +8 -7
  143. package/dist/{middleware → packages/bunshot-auth/src/middleware}/requireVerifiedEmail.d.ts +2 -2
  144. package/dist/{middleware → packages/bunshot-auth/src/middleware}/requireVerifiedEmail.js +7 -6
  145. package/dist/packages/bunshot-auth/src/middleware/scimAuth.d.ts +8 -0
  146. package/dist/packages/bunshot-auth/src/middleware/scimAuth.js +29 -0
  147. package/dist/packages/bunshot-auth/src/middleware/userAuth.d.ts +3 -0
  148. package/dist/packages/bunshot-auth/src/middleware/userAuth.js +6 -0
  149. package/dist/{models → packages/bunshot-auth/src/models}/AuthUser.d.ts +12 -8
  150. package/dist/packages/bunshot-auth/src/models/AuthUser.js +53 -0
  151. package/dist/packages/bunshot-auth/src/models/Group.d.ts +19 -0
  152. package/dist/packages/bunshot-auth/src/models/Group.js +22 -0
  153. package/dist/{models → packages/bunshot-auth/src/models}/GroupMembership.d.ts +6 -8
  154. package/dist/packages/bunshot-auth/src/models/GroupMembership.js +19 -0
  155. package/dist/{models → packages/bunshot-auth/src/models}/M2MClient.d.ts +1 -1
  156. package/dist/{models → packages/bunshot-auth/src/models}/M2MClient.js +5 -5
  157. package/dist/packages/bunshot-auth/src/models/TenantRole.d.ts +13 -0
  158. package/dist/packages/bunshot-auth/src/models/TenantRole.js +17 -0
  159. package/dist/packages/bunshot-auth/src/plugin.d.ts +4 -0
  160. package/dist/packages/bunshot-auth/src/plugin.js +274 -0
  161. package/dist/packages/bunshot-auth/src/routes/auth.d.ts +15 -0
  162. package/dist/packages/bunshot-auth/src/routes/auth.js +1624 -0
  163. package/dist/packages/bunshot-auth/src/routes/groups.d.ts +4 -0
  164. package/dist/packages/bunshot-auth/src/routes/groups.js +481 -0
  165. package/dist/packages/bunshot-auth/src/routes/m2m.d.ts +2 -0
  166. package/dist/packages/bunshot-auth/src/routes/m2m.js +145 -0
  167. package/dist/packages/bunshot-auth/src/routes/mfa.d.ts +6 -0
  168. package/dist/packages/bunshot-auth/src/routes/mfa.js +991 -0
  169. package/dist/packages/bunshot-auth/src/routes/oauth.d.ts +3 -0
  170. package/dist/packages/bunshot-auth/src/routes/oauth.js +1727 -0
  171. package/dist/packages/bunshot-auth/src/routes/oidc.d.ts +2 -0
  172. package/dist/packages/bunshot-auth/src/routes/oidc.js +84 -0
  173. package/dist/packages/bunshot-auth/src/routes/organizations.d.ts +3 -0
  174. package/dist/packages/bunshot-auth/src/routes/organizations.js +741 -0
  175. package/dist/packages/bunshot-auth/src/routes/passkey.d.ts +2 -0
  176. package/dist/packages/bunshot-auth/src/routes/passkey.js +199 -0
  177. package/dist/packages/bunshot-auth/src/routes/saml.d.ts +2 -0
  178. package/dist/packages/bunshot-auth/src/routes/saml.js +226 -0
  179. package/dist/packages/bunshot-auth/src/routes/scim.d.ts +3 -0
  180. package/dist/packages/bunshot-auth/src/routes/scim.js +588 -0
  181. package/dist/packages/bunshot-auth/src/runtime.d.ts +52 -0
  182. package/dist/packages/bunshot-auth/src/runtime.js +11 -0
  183. package/dist/{schemas → packages/bunshot-auth/src/schemas}/auth.d.ts +4 -5
  184. package/dist/packages/bunshot-auth/src/schemas/auth.js +24 -0
  185. package/dist/packages/bunshot-auth/src/schemas/error.d.ts +10 -0
  186. package/dist/packages/bunshot-auth/src/schemas/error.js +10 -0
  187. package/dist/packages/bunshot-auth/src/schemas/success.d.ts +10 -0
  188. package/dist/packages/bunshot-auth/src/schemas/success.js +10 -0
  189. package/dist/packages/bunshot-auth/src/services/auth.d.ts +39 -0
  190. package/dist/packages/bunshot-auth/src/services/auth.js +378 -0
  191. package/dist/{services → packages/bunshot-auth/src/services}/mfa.d.ts +41 -17
  192. package/dist/{services → packages/bunshot-auth/src/services}/mfa.js +259 -183
  193. package/dist/packages/bunshot-auth/src/testing.d.ts +31 -0
  194. package/dist/packages/bunshot-auth/src/testing.js +23 -0
  195. package/dist/packages/bunshot-auth/src/types/adapter.d.ts +1 -0
  196. package/dist/packages/bunshot-auth/src/types/adapter.js +1 -0
  197. package/dist/packages/bunshot-auth/src/types/config.d.ts +152 -0
  198. package/dist/packages/bunshot-auth/src/types/config.js +179 -0
  199. package/dist/{routes → packages/bunshot-auth/src/types}/groups.d.ts +2 -3
  200. package/dist/packages/bunshot-auth/src/types/groups.js +1 -0
  201. package/dist/packages/bunshot-auth/src/types/oauthCode.d.ts +6 -0
  202. package/dist/packages/bunshot-auth/src/types/oauthCode.js +1 -0
  203. package/dist/packages/bunshot-auth/src/types/oauthReauth.d.ts +13 -0
  204. package/dist/packages/bunshot-auth/src/types/oauthReauth.js +1 -0
  205. package/dist/packages/bunshot-auth/src/types/redis.d.ts +1 -0
  206. package/dist/packages/bunshot-auth/src/types/redis.js +1 -0
  207. package/dist/packages/bunshot-auth/src/types/saml.d.ts +10 -0
  208. package/dist/packages/bunshot-auth/src/types/saml.js +1 -0
  209. package/dist/packages/bunshot-auth/src/types/session.d.ts +18 -0
  210. package/dist/packages/bunshot-auth/src/types/session.js +1 -0
  211. package/dist/packages/bunshot-auth/src/types/store.d.ts +1 -0
  212. package/dist/packages/bunshot-auth/src/types/store.js +1 -0
  213. package/dist/packages/bunshot-core/src/adminProvider.d.ts +95 -0
  214. package/dist/packages/bunshot-core/src/adminProvider.js +1 -0
  215. package/dist/packages/bunshot-core/src/auditLog.d.ts +34 -0
  216. package/dist/packages/bunshot-core/src/auditLog.js +1 -0
  217. package/dist/packages/bunshot-core/src/auth-adapter.d.ts +227 -0
  218. package/dist/packages/bunshot-core/src/auth-adapter.js +4 -0
  219. package/dist/packages/bunshot-core/src/authVariables.d.ts +14 -0
  220. package/dist/packages/bunshot-core/src/authVariables.js +4 -0
  221. package/dist/packages/bunshot-core/src/cache.d.ts +12 -0
  222. package/dist/packages/bunshot-core/src/cache.js +21 -0
  223. package/dist/{lib → packages/bunshot-core/src}/captcha.d.ts +1 -10
  224. package/dist/packages/bunshot-core/src/captcha.js +1 -0
  225. package/dist/packages/bunshot-core/src/clearRegistry.d.ts +6 -0
  226. package/dist/packages/bunshot-core/src/clearRegistry.js +17 -0
  227. package/dist/packages/bunshot-core/src/clientIp.d.ts +3 -0
  228. package/dist/packages/bunshot-core/src/clientIp.js +45 -0
  229. package/dist/packages/bunshot-core/src/configLock.d.ts +4 -0
  230. package/dist/packages/bunshot-core/src/configLock.js +7 -0
  231. package/dist/packages/bunshot-core/src/configValidation.d.ts +22 -0
  232. package/dist/packages/bunshot-core/src/configValidation.js +39 -0
  233. package/dist/packages/bunshot-core/src/constants.js +10 -0
  234. package/dist/packages/bunshot-core/src/context/bunshotContext.d.ts +232 -0
  235. package/dist/packages/bunshot-core/src/context/bunshotContext.js +1 -0
  236. package/dist/packages/bunshot-core/src/context/contextAccess.d.ts +3 -0
  237. package/dist/packages/bunshot-core/src/context/contextAccess.js +16 -0
  238. package/dist/packages/bunshot-core/src/context/contextStore.d.ts +16 -0
  239. package/dist/packages/bunshot-core/src/context/contextStore.js +31 -0
  240. package/dist/packages/bunshot-core/src/context/frameworkConfig.d.ts +38 -0
  241. package/dist/packages/bunshot-core/src/context/frameworkConfig.js +1 -0
  242. package/dist/packages/bunshot-core/src/context/index.d.ts +4 -0
  243. package/dist/packages/bunshot-core/src/context/index.js +2 -0
  244. package/dist/packages/bunshot-core/src/context.d.ts +40 -0
  245. package/dist/packages/bunshot-core/src/context.js +35 -0
  246. package/dist/packages/bunshot-core/src/coreContracts.d.ts +47 -0
  247. package/dist/packages/bunshot-core/src/coreContracts.js +1 -0
  248. package/dist/packages/bunshot-core/src/coreRegistrar.d.ts +6 -0
  249. package/dist/packages/bunshot-core/src/coreRegistrar.js +42 -0
  250. package/dist/{lib → packages/bunshot-core/src}/createRoute.d.ts +4 -30
  251. package/dist/{lib → packages/bunshot-core/src}/createRoute.js +39 -88
  252. package/dist/packages/bunshot-core/src/cronRegistry.d.ts +11 -0
  253. package/dist/packages/bunshot-core/src/cronRegistry.js +1 -0
  254. package/dist/packages/bunshot-core/src/crypto.d.ts +43 -0
  255. package/dist/packages/bunshot-core/src/crypto.js +74 -0
  256. package/dist/packages/bunshot-core/src/csrf.d.ts +8 -0
  257. package/dist/packages/bunshot-core/src/csrf.js +1 -0
  258. package/dist/packages/bunshot-core/src/defaults/defaultFingerprint.d.ts +7 -0
  259. package/dist/packages/bunshot-core/src/defaults/defaultFingerprint.js +19 -0
  260. package/dist/packages/bunshot-core/src/defaults/memoryCacheAdapter.d.ts +6 -0
  261. package/dist/packages/bunshot-core/src/defaults/memoryCacheAdapter.js +40 -0
  262. package/dist/packages/bunshot-core/src/defaults/memoryRateLimit.d.ts +6 -0
  263. package/dist/packages/bunshot-core/src/defaults/memoryRateLimit.js +24 -0
  264. package/dist/packages/bunshot-core/src/emailTemplates.d.ts +5 -0
  265. package/dist/packages/bunshot-core/src/emailTemplates.js +10 -0
  266. package/dist/{lib/HttpError.d.ts → packages/bunshot-core/src/errors.d.ts} +4 -1
  267. package/dist/{lib/HttpError.js → packages/bunshot-core/src/errors.js} +7 -1
  268. package/dist/packages/bunshot-core/src/eventBus.d.ts +270 -0
  269. package/dist/packages/bunshot-core/src/eventBus.js +143 -0
  270. package/dist/packages/bunshot-core/src/idempotency.d.ts +18 -0
  271. package/dist/packages/bunshot-core/src/idempotency.js +1 -0
  272. package/dist/packages/bunshot-core/src/index.d.ts +60 -0
  273. package/dist/packages/bunshot-core/src/index.js +34 -0
  274. package/dist/packages/bunshot-core/src/mail.d.ts +14 -0
  275. package/dist/packages/bunshot-core/src/mail.js +8 -0
  276. package/dist/packages/bunshot-core/src/memoryEviction.d.ts +24 -0
  277. package/dist/packages/bunshot-core/src/memoryEviction.js +52 -0
  278. package/dist/packages/bunshot-core/src/pagination.d.ts +45 -0
  279. package/dist/packages/bunshot-core/src/pagination.js +61 -0
  280. package/dist/packages/bunshot-core/src/permissions.d.ts +64 -0
  281. package/dist/packages/bunshot-core/src/permissions.js +27 -0
  282. package/dist/packages/bunshot-core/src/plugin.d.ts +44 -0
  283. package/dist/packages/bunshot-core/src/plugin.js +1 -0
  284. package/dist/packages/bunshot-core/src/rateLimit.d.ts +5 -0
  285. package/dist/packages/bunshot-core/src/rateLimit.js +18 -0
  286. package/dist/packages/bunshot-core/src/redis.d.ts +21 -0
  287. package/dist/packages/bunshot-core/src/redis.js +1 -0
  288. package/dist/packages/bunshot-core/src/routeAuth.d.ts +5 -0
  289. package/dist/packages/bunshot-core/src/routeAuth.js +11 -0
  290. package/dist/packages/bunshot-core/src/routeOverrides.d.ts +24 -0
  291. package/dist/packages/bunshot-core/src/routeOverrides.js +25 -0
  292. package/dist/packages/bunshot-core/src/routerAdapter.d.ts +6 -0
  293. package/dist/packages/bunshot-core/src/routerAdapter.js +56 -0
  294. package/dist/packages/bunshot-core/src/secrets.d.ts +48 -0
  295. package/dist/packages/bunshot-core/src/secrets.js +8 -0
  296. package/dist/packages/bunshot-core/src/signing.d.ts +41 -0
  297. package/dist/packages/bunshot-core/src/signing.js +1 -0
  298. package/dist/packages/bunshot-core/src/sse.d.ts +36 -0
  299. package/dist/packages/bunshot-core/src/sse.js +1 -0
  300. package/dist/packages/bunshot-core/src/storageAdapter.js +1 -0
  301. package/dist/packages/bunshot-core/src/storeInfra.d.ts +44 -0
  302. package/dist/packages/bunshot-core/src/storeInfra.js +18 -0
  303. package/dist/packages/bunshot-core/src/storeType.d.ts +7 -0
  304. package/dist/packages/bunshot-core/src/storeType.js +1 -0
  305. package/dist/packages/bunshot-core/src/testing.d.ts +1 -0
  306. package/dist/packages/bunshot-core/src/testing.js +1 -0
  307. package/dist/packages/bunshot-core/src/uploadRegistry.d.ts +23 -0
  308. package/dist/packages/bunshot-core/src/uploadRegistry.js +4 -0
  309. package/dist/packages/bunshot-core/src/userResolver.d.ts +5 -0
  310. package/dist/packages/bunshot-core/src/userResolver.js +14 -0
  311. package/dist/packages/bunshot-core/src/wsMessages.d.ts +42 -0
  312. package/dist/packages/bunshot-core/src/wsMessages.js +4 -0
  313. package/dist/packages/bunshot-permissions/src/adapters/memory.d.ts +7 -0
  314. package/dist/packages/bunshot-permissions/src/adapters/memory.js +73 -0
  315. package/dist/packages/bunshot-permissions/src/index.d.ts +10 -0
  316. package/dist/packages/bunshot-permissions/src/index.js +5 -0
  317. package/dist/packages/bunshot-permissions/src/lib/bootstrap.d.ts +7 -0
  318. package/dist/packages/bunshot-permissions/src/lib/bootstrap.js +12 -0
  319. package/dist/packages/bunshot-permissions/src/lib/evaluator.d.ts +10 -0
  320. package/dist/packages/bunshot-permissions/src/lib/evaluator.js +165 -0
  321. package/dist/packages/bunshot-permissions/src/lib/registry.d.ts +2 -0
  322. package/dist/packages/bunshot-permissions/src/lib/registry.js +31 -0
  323. package/dist/packages/bunshot-permissions/src/lib/validation.d.ts +1 -0
  324. package/dist/packages/bunshot-permissions/src/lib/validation.js +1 -0
  325. package/dist/packages/bunshot-permissions/src/types/adapter.d.ts +1 -0
  326. package/dist/packages/bunshot-permissions/src/types/adapter.js +1 -0
  327. package/dist/packages/bunshot-permissions/src/types/evaluator.d.ts +1 -0
  328. package/dist/packages/bunshot-permissions/src/types/evaluator.js +1 -0
  329. package/dist/packages/bunshot-permissions/src/types/models.d.ts +1 -0
  330. package/dist/packages/bunshot-permissions/src/types/models.js +1 -0
  331. package/dist/packages/bunshot-permissions/src/types/registry.d.ts +1 -0
  332. package/dist/packages/bunshot-permissions/src/types/registry.js +1 -0
  333. package/dist/packages/bunshot-postgres/src/adapter.d.ts +6 -0
  334. package/dist/packages/bunshot-postgres/src/adapter.js +794 -0
  335. package/dist/packages/bunshot-postgres/src/connection.d.ts +15 -0
  336. package/dist/packages/bunshot-postgres/src/connection.js +16 -0
  337. package/dist/packages/bunshot-postgres/src/index.d.ts +4 -0
  338. package/dist/packages/bunshot-postgres/src/index.js +2 -0
  339. package/dist/packages/bunshot-postgres/src/schema.d.ts +997 -0
  340. package/dist/packages/bunshot-postgres/src/schema.js +105 -0
  341. package/dist/src/app.d.ts +230 -0
  342. package/dist/src/app.js +182 -0
  343. package/dist/src/cli/commands/init.d.ts +10 -0
  344. package/dist/src/cli/commands/init.js +709 -0
  345. package/dist/src/cli/index.d.ts +1 -0
  346. package/dist/src/cli/index.js +3 -0
  347. package/dist/src/entrypoints/mongo.d.ts +6 -0
  348. package/dist/src/entrypoints/mongo.js +4 -0
  349. package/dist/src/entrypoints/queue.d.ts +2 -0
  350. package/dist/src/entrypoints/queue.js +1 -0
  351. package/dist/src/entrypoints/redis.d.ts +1 -0
  352. package/dist/src/entrypoints/redis.js +1 -0
  353. package/dist/{adapters → src/framework/adapters}/localStorage.d.ts +1 -1
  354. package/dist/{adapters → src/framework/adapters}/localStorage.js +10 -10
  355. package/dist/src/framework/adapters/memoryStorage.d.ts +2 -0
  356. package/dist/src/framework/adapters/memoryStorage.js +45 -0
  357. package/dist/{adapters → src/framework/adapters}/s3Storage.d.ts +1 -1
  358. package/dist/{adapters → src/framework/adapters}/s3Storage.js +12 -12
  359. package/dist/src/framework/admin/bunshotAccess.d.ts +2 -0
  360. package/dist/src/framework/admin/bunshotAccess.js +23 -0
  361. package/dist/src/framework/admin/bunshotUsers.d.ts +2 -0
  362. package/dist/src/framework/admin/bunshotUsers.js +103 -0
  363. package/dist/src/framework/admin/index.d.ts +7 -0
  364. package/dist/src/framework/admin/index.js +21 -0
  365. package/dist/src/framework/boundaryAdapters/cacheFactories.d.ts +13 -0
  366. package/dist/src/framework/boundaryAdapters/cacheFactories.js +86 -0
  367. package/dist/src/framework/boundaryAdapters/index.d.ts +2 -0
  368. package/dist/src/framework/boundaryAdapters/index.js +1 -0
  369. package/dist/src/framework/boundaryAdapters.d.ts +17 -0
  370. package/dist/src/framework/boundaryAdapters.js +62 -0
  371. package/dist/src/framework/buildContext.d.ts +33 -0
  372. package/dist/src/framework/buildContext.js +119 -0
  373. package/dist/src/framework/config/schema.d.ts +447 -0
  374. package/dist/src/framework/config/schema.js +528 -0
  375. package/dist/src/framework/createInfrastructure.d.ts +76 -0
  376. package/dist/src/framework/createInfrastructure.js +221 -0
  377. package/dist/src/framework/lib/auditLog.d.ts +23 -0
  378. package/dist/src/framework/lib/auditLog.js +416 -0
  379. package/dist/src/framework/lib/captcha.d.ts +11 -0
  380. package/dist/{lib → src/framework/lib}/captcha.js +13 -10
  381. package/dist/{lib → src/framework/lib}/createDtoMapper.js +4 -4
  382. package/dist/src/framework/lib/createRoute.d.ts +1 -0
  383. package/dist/src/framework/lib/createRoute.js +2 -0
  384. package/dist/{lib → src/framework/lib}/idempotency.d.ts +2 -6
  385. package/dist/src/framework/lib/idempotency.js +74 -0
  386. package/dist/src/framework/lib/logger.d.ts +3 -0
  387. package/dist/src/framework/lib/logger.js +14 -0
  388. package/dist/src/framework/lib/metrics.d.ts +34 -0
  389. package/dist/{lib → src/framework/lib}/metrics.js +49 -57
  390. package/dist/src/framework/lib/pagination.d.ts +42 -0
  391. package/dist/src/framework/lib/pagination.js +51 -0
  392. package/dist/src/framework/lib/redisTransport.d.ts +38 -0
  393. package/dist/src/framework/lib/redisTransport.js +107 -0
  394. package/dist/src/framework/lib/resolveUserId.d.ts +2 -0
  395. package/dist/src/framework/lib/resolveUserId.js +5 -0
  396. package/dist/src/framework/lib/sseCollision.d.ts +6 -0
  397. package/dist/src/framework/lib/sseCollision.js +26 -0
  398. package/dist/src/framework/lib/storageAdapter.d.ts +1 -0
  399. package/dist/src/framework/lib/storageAdapter.js +1 -0
  400. package/dist/{lib → src/framework/lib}/stripUnreferencedSchemas.js +4 -4
  401. package/dist/src/framework/lib/tenant.d.ts +21 -0
  402. package/dist/src/framework/lib/tenant.js +70 -0
  403. package/dist/{lib → src/framework/lib}/upload.d.ts +11 -10
  404. package/dist/src/framework/lib/upload.js +132 -0
  405. package/dist/src/framework/lib/uploadRegistry.d.ts +23 -0
  406. package/dist/src/framework/lib/uploadRegistry.js +34 -0
  407. package/dist/{lib → src/framework/lib}/validate.d.ts +1 -1
  408. package/dist/{lib → src/framework/lib}/validate.js +2 -2
  409. package/dist/src/framework/lib/ws.d.ts +19 -0
  410. package/dist/src/framework/lib/ws.js +130 -0
  411. package/dist/src/framework/lib/wsHeartbeat.d.ts +12 -0
  412. package/dist/src/framework/lib/wsHeartbeat.js +53 -0
  413. package/dist/src/framework/lib/wsMessages.d.ts +25 -0
  414. package/dist/src/framework/lib/wsMessages.js +45 -0
  415. package/dist/src/framework/lib/wsNamespace.d.ts +17 -0
  416. package/dist/src/framework/lib/wsNamespace.js +19 -0
  417. package/dist/src/framework/lib/wsPresence.d.ts +17 -0
  418. package/dist/src/framework/lib/wsPresence.js +84 -0
  419. package/dist/src/framework/lib/wsTransport.d.ts +38 -0
  420. package/dist/src/framework/lib/wsTransport.js +9 -0
  421. package/dist/{lib → src/framework/lib}/zodToMongoose.d.ts +1 -1
  422. package/dist/{lib → src/framework/lib}/zodToMongoose.js +11 -11
  423. package/dist/{middleware → src/framework/middleware}/auditLog.d.ts +4 -3
  424. package/dist/src/framework/middleware/auditLog.js +42 -0
  425. package/dist/{middleware → src/framework/middleware}/botProtection.d.ts +2 -2
  426. package/dist/{middleware → src/framework/middleware}/botProtection.js +8 -9
  427. package/dist/src/framework/middleware/cacheResponse.d.ts +35 -0
  428. package/dist/src/framework/middleware/cacheResponse.js +126 -0
  429. package/dist/{middleware → src/framework/middleware}/captcha.d.ts +2 -3
  430. package/dist/src/framework/middleware/captcha.js +37 -0
  431. package/dist/{middleware → src/framework/middleware}/errorHandler.d.ts +1 -1
  432. package/dist/{middleware → src/framework/middleware}/errorHandler.js +2 -2
  433. package/dist/src/framework/middleware/index.js +1 -0
  434. package/dist/{middleware → src/framework/middleware}/logger.d.ts +1 -1
  435. package/dist/src/framework/middleware/metrics.d.ts +12 -0
  436. package/dist/src/framework/middleware/metrics.js +26 -0
  437. package/dist/{middleware → src/framework/middleware}/rateLimit.d.ts +2 -2
  438. package/dist/src/framework/middleware/rateLimit.js +22 -0
  439. package/dist/src/framework/middleware/requestId.d.ts +3 -0
  440. package/dist/{middleware → src/framework/middleware}/requestId.js +2 -2
  441. package/dist/{middleware → src/framework/middleware}/requestLogger.d.ts +3 -3
  442. package/dist/{middleware → src/framework/middleware}/requestLogger.js +17 -12
  443. package/dist/{middleware → src/framework/middleware}/requestSigning.d.ts +2 -2
  444. package/dist/{middleware → src/framework/middleware}/requestSigning.js +18 -20
  445. package/dist/src/framework/middleware/tenant.d.ts +14 -0
  446. package/dist/{middleware → src/framework/middleware}/tenant.js +31 -27
  447. package/dist/src/framework/middleware/upload.d.ts +5 -0
  448. package/dist/{middleware → src/framework/middleware}/upload.js +4 -4
  449. package/dist/{middleware → src/framework/middleware}/webhookAuth.d.ts +3 -3
  450. package/dist/{middleware → src/framework/middleware}/webhookAuth.js +11 -12
  451. package/dist/src/framework/models/AuditLog.d.ts +21 -0
  452. package/dist/src/framework/models/AuditLog.js +31 -0
  453. package/dist/src/framework/mountMiddleware.d.ts +91 -0
  454. package/dist/src/framework/mountMiddleware.js +128 -0
  455. package/dist/src/framework/mountOptionalEndpoints.d.ts +103 -0
  456. package/dist/src/framework/mountOptionalEndpoints.js +47 -0
  457. package/dist/src/framework/mountRoutes.d.ts +21 -0
  458. package/dist/src/framework/mountRoutes.js +144 -0
  459. package/dist/src/framework/persistence/cronRegistry.d.ts +28 -0
  460. package/dist/src/framework/persistence/cronRegistry.js +139 -0
  461. package/dist/src/framework/persistence/idempotency.d.ts +26 -0
  462. package/dist/src/framework/persistence/idempotency.js +178 -0
  463. package/dist/src/framework/persistence/index.d.ts +6 -0
  464. package/dist/src/framework/persistence/index.js +8 -0
  465. package/dist/src/framework/persistence/storeInfra.d.ts +9 -0
  466. package/dist/src/framework/persistence/storeInfra.js +1 -0
  467. package/dist/src/framework/persistence/uploadRegistry.d.ts +35 -0
  468. package/dist/src/framework/persistence/uploadRegistry.js +235 -0
  469. package/dist/src/framework/persistence/wsMessages.d.ts +22 -0
  470. package/dist/src/framework/persistence/wsMessages.js +296 -0
  471. package/dist/src/framework/preloadSchemas.d.ts +24 -0
  472. package/dist/src/framework/preloadSchemas.js +42 -0
  473. package/dist/src/framework/registerBoundaryAdapters.d.ts +23 -0
  474. package/dist/src/framework/registerBoundaryAdapters.js +46 -0
  475. package/dist/src/framework/routes/admin.d.ts +9 -0
  476. package/dist/src/framework/routes/admin.js +361 -0
  477. package/dist/src/framework/routes/health.d.ts +1 -0
  478. package/dist/src/framework/routes/health.js +21 -0
  479. package/dist/src/framework/routes/home.d.ts +1 -0
  480. package/dist/src/framework/routes/home.js +18 -0
  481. package/dist/src/framework/routes/jobs.d.ts +3 -0
  482. package/dist/{routes → src/framework/routes}/jobs.js +128 -103
  483. package/dist/src/framework/routes/metrics.d.ts +10 -0
  484. package/dist/src/framework/routes/metrics.js +57 -0
  485. package/dist/{routes → src/framework/routes}/uploads.d.ts +3 -3
  486. package/dist/src/framework/routes/uploads.js +262 -0
  487. package/dist/src/framework/runPluginLifecycle.d.ts +27 -0
  488. package/dist/src/framework/runPluginLifecycle.js +121 -0
  489. package/dist/src/framework/secrets/frameworkSecretSchema.d.ts +58 -0
  490. package/dist/src/framework/secrets/frameworkSecretSchema.js +20 -0
  491. package/dist/src/framework/secrets/index.d.ts +9 -0
  492. package/dist/src/framework/secrets/index.js +7 -0
  493. package/dist/src/framework/secrets/providers/envProvider.d.ts +15 -0
  494. package/dist/src/framework/secrets/providers/envProvider.js +18 -0
  495. package/dist/src/framework/secrets/providers/fileProvider.d.ts +8 -0
  496. package/dist/src/framework/secrets/providers/fileProvider.js +82 -0
  497. package/dist/src/framework/secrets/providers/ssmProvider.d.ts +20 -0
  498. package/dist/src/framework/secrets/providers/ssmProvider.js +127 -0
  499. package/dist/src/framework/secrets/resolveSecretBundle.d.ts +53 -0
  500. package/dist/src/framework/secrets/resolveSecretBundle.js +84 -0
  501. package/dist/src/framework/secrets/resolveSecrets.d.ts +18 -0
  502. package/dist/src/framework/secrets/resolveSecrets.js +34 -0
  503. package/dist/src/framework/sse/index.d.ts +21 -0
  504. package/dist/src/framework/sse/index.js +109 -0
  505. package/dist/src/framework/ws/index.d.ts +11 -0
  506. package/dist/src/framework/ws/index.js +8 -0
  507. package/dist/src/index.d.ts +87 -0
  508. package/dist/src/index.js +58 -0
  509. package/dist/src/lib/appConfig.d.ts +7 -0
  510. package/dist/src/lib/appConfig.js +27 -0
  511. package/dist/src/lib/appMeta.d.ts +7 -0
  512. package/dist/src/lib/appMeta.js +3 -0
  513. package/dist/src/lib/authConfig.d.ts +532 -0
  514. package/dist/{lib/appConfig.js → src/lib/authConfig.js} +75 -17
  515. package/dist/{lib → src/lib}/context.d.ts +6 -12
  516. package/dist/{lib → src/lib}/context.js +5 -5
  517. package/dist/src/lib/logger.d.ts +1 -0
  518. package/dist/src/lib/logger.js +1 -0
  519. package/dist/src/lib/mongo.d.ts +58 -0
  520. package/dist/src/lib/mongo.js +96 -0
  521. package/dist/src/lib/queue.d.ts +72 -0
  522. package/dist/src/lib/queue.js +152 -0
  523. package/dist/src/lib/redis.d.ts +28 -0
  524. package/dist/src/lib/redis.js +72 -0
  525. package/dist/{lib → src/lib}/signing.d.ts +2 -2
  526. package/dist/src/lib/signing.js +210 -0
  527. package/dist/src/lib/signingConfig.d.ts +40 -0
  528. package/dist/src/lib/signingConfig.js +28 -0
  529. package/dist/src/server.d.ts +146 -0
  530. package/dist/src/server.js +469 -0
  531. package/dist/src/shared/lib/HttpError.d.ts +1 -0
  532. package/dist/src/shared/lib/HttpError.js +2 -0
  533. package/dist/src/shared/lib/constants.d.ts +10 -0
  534. package/dist/src/shared/lib/crypto.d.ts +43 -0
  535. package/dist/src/shared/lib/crypto.js +74 -0
  536. package/dist/src/shared/lib/signing.d.ts +52 -0
  537. package/dist/{lib → src/shared/lib}/signing.js +35 -8
  538. package/dist/src/testing.d.ts +34 -0
  539. package/dist/src/testing.js +93 -0
  540. package/package.json +60 -24
  541. package/dist/adapters/memoryAuth.d.ts +0 -52
  542. package/dist/adapters/memoryAuth.js +0 -749
  543. package/dist/adapters/memoryStorage.d.ts +0 -3
  544. package/dist/adapters/memoryStorage.js +0 -44
  545. package/dist/adapters/mongoAuth.d.ts +0 -2
  546. package/dist/adapters/mongoAuth.js +0 -403
  547. package/dist/adapters/sqliteAuth.d.ts +0 -72
  548. package/dist/adapters/sqliteAuth.js +0 -858
  549. package/dist/app.d.ts +0 -559
  550. package/dist/app.js +0 -651
  551. package/dist/entrypoints/mongo.d.ts +0 -5
  552. package/dist/entrypoints/mongo.js +0 -4
  553. package/dist/entrypoints/queue.d.ts +0 -2
  554. package/dist/entrypoints/queue.js +0 -1
  555. package/dist/entrypoints/redis.d.ts +0 -1
  556. package/dist/entrypoints/redis.js +0 -1
  557. package/dist/index.d.ts +0 -117
  558. package/dist/index.js +0 -88
  559. package/dist/lib/appConfig.d.ts +0 -275
  560. package/dist/lib/auditLog.d.ts +0 -58
  561. package/dist/lib/auditLog.js +0 -218
  562. package/dist/lib/authAdapter.d.ts +0 -246
  563. package/dist/lib/authAdapter.js +0 -7
  564. package/dist/lib/authRateLimit.d.ts +0 -13
  565. package/dist/lib/authRateLimit.js +0 -117
  566. package/dist/lib/clientIp.d.ts +0 -14
  567. package/dist/lib/credentialStuffing.d.ts +0 -31
  568. package/dist/lib/credentialStuffing.js +0 -77
  569. package/dist/lib/crypto.d.ts +0 -11
  570. package/dist/lib/crypto.js +0 -22
  571. package/dist/lib/deletionCancelToken.d.ts +0 -12
  572. package/dist/lib/deletionCancelToken.js +0 -88
  573. package/dist/lib/emailVerification.d.ts +0 -19
  574. package/dist/lib/emailVerification.js +0 -129
  575. package/dist/lib/fingerprint.js +0 -36
  576. package/dist/lib/idempotency.js +0 -182
  577. package/dist/lib/jwks.d.ts +0 -25
  578. package/dist/lib/jwks.js +0 -51
  579. package/dist/lib/jwt.d.ts +0 -15
  580. package/dist/lib/jwt.js +0 -111
  581. package/dist/lib/metrics.d.ts +0 -14
  582. package/dist/lib/mfaChallenge.d.ts +0 -55
  583. package/dist/lib/mfaChallenge.js +0 -398
  584. package/dist/lib/mongo.d.ts +0 -39
  585. package/dist/lib/mongo.js +0 -124
  586. package/dist/lib/oauth.d.ts +0 -40
  587. package/dist/lib/oauth.js +0 -101
  588. package/dist/lib/oauthCode.d.ts +0 -15
  589. package/dist/lib/oauthCode.js +0 -95
  590. package/dist/lib/pagination.d.ts +0 -119
  591. package/dist/lib/pagination.js +0 -166
  592. package/dist/lib/queue.d.ts +0 -37
  593. package/dist/lib/queue.js +0 -117
  594. package/dist/lib/redis.d.ts +0 -9
  595. package/dist/lib/redis.js +0 -61
  596. package/dist/lib/resetPassword.d.ts +0 -12
  597. package/dist/lib/resetPassword.js +0 -93
  598. package/dist/lib/roles.d.ts +0 -7
  599. package/dist/lib/roles.js +0 -49
  600. package/dist/lib/saml.d.ts +0 -25
  601. package/dist/lib/saml.js +0 -64
  602. package/dist/lib/securityEvents.d.ts +0 -28
  603. package/dist/lib/securityEvents.js +0 -26
  604. package/dist/lib/session.d.ts +0 -49
  605. package/dist/lib/session.js +0 -597
  606. package/dist/lib/tenant.d.ts +0 -15
  607. package/dist/lib/tenant.js +0 -65
  608. package/dist/lib/upload.js +0 -112
  609. package/dist/lib/uploadRegistry.d.ts +0 -18
  610. package/dist/lib/uploadRegistry.js +0 -83
  611. package/dist/lib/ws.d.ts +0 -22
  612. package/dist/lib/ws.js +0 -96
  613. package/dist/lib/wsHeartbeat.d.ts +0 -12
  614. package/dist/lib/wsHeartbeat.js +0 -57
  615. package/dist/lib/wsMessages.d.ts +0 -40
  616. package/dist/lib/wsMessages.js +0 -330
  617. package/dist/lib/wsPresence.d.ts +0 -25
  618. package/dist/lib/wsPresence.js +0 -99
  619. package/dist/middleware/auditLog.js +0 -39
  620. package/dist/middleware/bearerAuth.d.ts +0 -2
  621. package/dist/middleware/bearerAuth.js +0 -11
  622. package/dist/middleware/cacheResponse.d.ts +0 -15
  623. package/dist/middleware/cacheResponse.js +0 -178
  624. package/dist/middleware/captcha.js +0 -36
  625. package/dist/middleware/csrf.js +0 -129
  626. package/dist/middleware/identify.d.ts +0 -3
  627. package/dist/middleware/identify.js +0 -122
  628. package/dist/middleware/index.js +0 -1
  629. package/dist/middleware/metrics.d.ts +0 -9
  630. package/dist/middleware/metrics.js +0 -26
  631. package/dist/middleware/rateLimit.js +0 -22
  632. package/dist/middleware/requestId.d.ts +0 -3
  633. package/dist/middleware/scimAuth.d.ts +0 -8
  634. package/dist/middleware/scimAuth.js +0 -29
  635. package/dist/middleware/tenant.d.ts +0 -5
  636. package/dist/middleware/upload.d.ts +0 -5
  637. package/dist/middleware/userAuth.d.ts +0 -3
  638. package/dist/middleware/userAuth.js +0 -6
  639. package/dist/models/AuditLog.d.ts +0 -30
  640. package/dist/models/AuditLog.js +0 -39
  641. package/dist/models/AuthUser.js +0 -55
  642. package/dist/models/Group.d.ts +0 -21
  643. package/dist/models/Group.js +0 -28
  644. package/dist/models/GroupMembership.js +0 -25
  645. package/dist/models/TenantRole.d.ts +0 -15
  646. package/dist/models/TenantRole.js +0 -23
  647. package/dist/routes/auth.d.ts +0 -12
  648. package/dist/routes/auth.js +0 -744
  649. package/dist/routes/groups.js +0 -346
  650. package/dist/routes/health.d.ts +0 -1
  651. package/dist/routes/health.js +0 -22
  652. package/dist/routes/home.d.ts +0 -1
  653. package/dist/routes/home.js +0 -16
  654. package/dist/routes/jobs.d.ts +0 -2
  655. package/dist/routes/m2m.d.ts +0 -2
  656. package/dist/routes/m2m.js +0 -72
  657. package/dist/routes/metrics.d.ts +0 -8
  658. package/dist/routes/metrics.js +0 -55
  659. package/dist/routes/mfa.d.ts +0 -5
  660. package/dist/routes/mfa.js +0 -628
  661. package/dist/routes/oauth.d.ts +0 -2
  662. package/dist/routes/oauth.js +0 -520
  663. package/dist/routes/oidc.d.ts +0 -2
  664. package/dist/routes/oidc.js +0 -29
  665. package/dist/routes/passkey.d.ts +0 -1
  666. package/dist/routes/passkey.js +0 -157
  667. package/dist/routes/saml.d.ts +0 -2
  668. package/dist/routes/saml.js +0 -86
  669. package/dist/routes/scim.d.ts +0 -2
  670. package/dist/routes/scim.js +0 -255
  671. package/dist/routes/uploads.js +0 -227
  672. package/dist/schemas/auth.js +0 -30
  673. package/dist/server.d.ts +0 -57
  674. package/dist/server.js +0 -112
  675. package/dist/services/auth.d.ts +0 -29
  676. package/dist/services/auth.js +0 -238
  677. package/dist/ws/index.d.ts +0 -10
  678. package/dist/ws/index.js +0 -39
  679. package/docs/sections/adding-middleware/full.md +0 -35
  680. package/docs/sections/adding-models/full.md +0 -125
  681. package/docs/sections/adding-models/overview.md +0 -13
  682. package/docs/sections/adding-routes/full.md +0 -182
  683. package/docs/sections/adding-routes/overview.md +0 -23
  684. package/docs/sections/auth-flow/full.md +0 -790
  685. package/docs/sections/auth-flow/overview.md +0 -10
  686. package/docs/sections/auth-security-examples/full.md +0 -388
  687. package/docs/sections/authentication/full.md +0 -130
  688. package/docs/sections/authentication/overview.md +0 -5
  689. package/docs/sections/cli/full.md +0 -42
  690. package/docs/sections/configuration/full.md +0 -172
  691. package/docs/sections/configuration/overview.md +0 -18
  692. package/docs/sections/configuration-example/full.md +0 -117
  693. package/docs/sections/configuration-example/overview.md +0 -30
  694. package/docs/sections/documentation/full.md +0 -171
  695. package/docs/sections/environment-variables/full.md +0 -55
  696. package/docs/sections/exports/full.md +0 -123
  697. package/docs/sections/extending-context/full.md +0 -59
  698. package/docs/sections/header.md +0 -3
  699. package/docs/sections/installation/full.md +0 -6
  700. package/docs/sections/jobs/full.md +0 -140
  701. package/docs/sections/jobs/overview.md +0 -15
  702. package/docs/sections/logging/full.md +0 -83
  703. package/docs/sections/metrics/full.md +0 -131
  704. package/docs/sections/mongodb-connections/full.md +0 -45
  705. package/docs/sections/mongodb-connections/overview.md +0 -7
  706. package/docs/sections/multi-tenancy/full.md +0 -66
  707. package/docs/sections/multi-tenancy/overview.md +0 -15
  708. package/docs/sections/oauth/full.md +0 -189
  709. package/docs/sections/oauth/overview.md +0 -16
  710. package/docs/sections/package-development/full.md +0 -7
  711. package/docs/sections/pagination/full.md +0 -93
  712. package/docs/sections/passkey-login/full.md +0 -90
  713. package/docs/sections/passkey-login/overview.md +0 -1
  714. package/docs/sections/peer-dependencies/full.md +0 -47
  715. package/docs/sections/quick-start/full.md +0 -43
  716. package/docs/sections/response-caching/full.md +0 -117
  717. package/docs/sections/response-caching/overview.md +0 -13
  718. package/docs/sections/roles/full.md +0 -225
  719. package/docs/sections/roles/overview.md +0 -14
  720. package/docs/sections/running-without-redis/full.md +0 -16
  721. package/docs/sections/running-without-redis-or-mongodb/full.md +0 -60
  722. package/docs/sections/signing/full.md +0 -203
  723. package/docs/sections/stack/full.md +0 -10
  724. package/docs/sections/uploads/full.md +0 -208
  725. package/docs/sections/versioning/full.md +0 -85
  726. package/docs/sections/webhook-auth/full.md +0 -100
  727. package/docs/sections/websocket/full.md +0 -196
  728. package/docs/sections/websocket/overview.md +0 -5
  729. package/docs/sections/websocket-rooms/full.md +0 -102
  730. package/docs/sections/websocket-rooms/overview.md +0 -5
  731. /package/dist/{lib/storageAdapter.js → packages/bunshot-admin/src/types/env.js} +0 -0
  732. /package/dist/{lib → packages/bunshot-auth/src/lib}/fingerprint.d.ts +0 -0
  733. /package/dist/{lib → packages/bunshot-auth/src/lib}/logger.d.ts +0 -0
  734. /package/dist/{lib → packages/bunshot-core/src}/constants.d.ts +0 -0
  735. /package/dist/{lib → packages/bunshot-core/src}/storageAdapter.d.ts +0 -0
  736. /package/dist/{lib → src/framework/lib}/createDtoMapper.d.ts +0 -0
  737. /package/dist/{lib → src/framework/lib}/stripUnreferencedSchemas.d.ts +0 -0
  738. /package/dist/{middleware → src/framework/middleware}/cors.d.ts +0 -0
  739. /package/dist/{middleware → src/framework/middleware}/cors.js +0 -0
  740. /package/dist/{middleware → src/framework/middleware}/index.d.ts +0 -0
  741. /package/dist/{middleware → src/framework/middleware}/logger.js +0 -0
  742. /package/dist/{lib → src/shared/lib}/constants.js +0 -0
@@ -0,0 +1,27 @@
1
+ function requireBullMQ() {
2
+ try {
3
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
4
+ return require('bullmq');
5
+ }
6
+ catch {
7
+ throw new Error('bullmq is not installed. Run: bun add bullmq');
8
+ }
9
+ }
10
+ /**
11
+ * Create a queue factory that captures Redis connection info once.
12
+ * All queues and workers created from this factory share the same connection.
13
+ */
14
+ export function createQueueFactory(getRedis) {
15
+ const client = getRedis();
16
+ if (!client)
17
+ throw new Error('[bunshot-auth] Redis not available for queue connection.');
18
+ const { Queue, Worker } = requireBullMQ();
19
+ return {
20
+ createQueue(name, options) {
21
+ return new Queue(name, { connection: client, ...options });
22
+ },
23
+ createWorker(name, processor, options) {
24
+ return new Worker(name, processor, { connection: client, ...options });
25
+ },
26
+ };
27
+ }
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Resolve the Redis client from BunshotContext.
3
+ * Throws if no redis client is available.
4
+ */
5
+ export declare function getRedisFromContext(app?: object): any;
@@ -0,0 +1,15 @@
1
+ // Auth-internal Redis accessor.
2
+ // Redis client is resolved from BunshotContext — no module-level state.
3
+ import { getContextOrNull } from '../../../bunshot-core/src/index.js';
4
+ /**
5
+ * Resolve the Redis client from BunshotContext.
6
+ * Throws if no redis client is available.
7
+ */
8
+ export function getRedisFromContext(app) {
9
+ if (app) {
10
+ const ctx = getContextOrNull(app);
11
+ if (ctx?.redis)
12
+ return ctx.redis;
13
+ }
14
+ throw new Error('[bunshot-auth] Redis not available. Ensure redis is configured in BunshotContext.');
15
+ }
@@ -0,0 +1,7 @@
1
+ import type { SigningConfig } from '../../../bunshot-core/src/index.js';
2
+ /**
3
+ * Get the signing secret from the resolved SigningConfig.
4
+ * No process.env fallback — the secret provider injects JWT_SECRET
5
+ * into SigningConfig.secret during bootstrap.
6
+ */
7
+ export declare function getSigningSecret(signing?: SigningConfig | null): string | string[] | null;
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Get the signing secret from the resolved SigningConfig.
3
+ * No process.env fallback — the secret provider injects JWT_SECRET
4
+ * into SigningConfig.secret during bootstrap.
5
+ */
6
+ export function getSigningSecret(signing) {
7
+ return signing?.secret ?? null;
8
+ }
@@ -0,0 +1,34 @@
1
+ import { RedisLike } from '../../../bunshot-core/src/index.js';
2
+ import type { RepoFactories } from '../../../bunshot-core/src/index.js';
3
+ export interface LockoutConfig {
4
+ /** Failed attempts before account lockout. */
5
+ maxAttempts: number;
6
+ /** Duration to stay locked in seconds. */
7
+ lockoutDuration: number;
8
+ /** Reset failure counter on successful login. Default: true. */
9
+ resetOnSuccess?: boolean;
10
+ /** Called when an account is locked. Non-blocking - errors are swallowed. */
11
+ onLocked?: (userId: string, identifier: string) => Promise<void>;
12
+ }
13
+ export interface ILockoutRepository {
14
+ getAttempts(key: string): Promise<number>;
15
+ setAttempts(key: string, count: number, ttlMs: number): Promise<void>;
16
+ deleteAttempts(key: string): Promise<void>;
17
+ setLocked(key: string, ttlMs: number): Promise<void>;
18
+ isLocked(key: string): Promise<boolean>;
19
+ deleteLocked(key: string): Promise<void>;
20
+ }
21
+ export interface LockoutService {
22
+ recordFailedAttempt(userId: string): Promise<number>;
23
+ isAccountLocked(userId: string): Promise<boolean>;
24
+ lockAccount(userId: string): Promise<void>;
25
+ unlockAccount(userId: string): Promise<void>;
26
+ resetFailureCount(userId: string): Promise<void>;
27
+ readonly config: LockoutConfig;
28
+ }
29
+ export declare function createMemoryLockoutRepository(): ILockoutRepository;
30
+ export declare function createSqliteLockoutRepository(db: import('bun:sqlite').Database): ILockoutRepository;
31
+ export declare function createRedisLockoutRepository(getRedis: () => RedisLike, appName: string): ILockoutRepository;
32
+ export declare function createMongoLockoutRepository(conn: import('mongoose').Connection, mg: typeof import('mongoose')): ILockoutRepository;
33
+ export declare const lockoutRepositoryFactories: RepoFactories<ILockoutRepository>;
34
+ export declare function createLockoutService(config: LockoutConfig, repo: ILockoutRepository): LockoutService;
@@ -0,0 +1,244 @@
1
+ import { DEFAULT_MAX_ENTRIES, evictExpired, evictOldest, } from '../../../bunshot-core/src/index.js';
2
+ export function createMemoryLockoutRepository() {
3
+ const attempts = new Map();
4
+ const locked = new Map();
5
+ return {
6
+ async getAttempts(key) {
7
+ const entry = attempts.get(key);
8
+ if (!entry)
9
+ return 0;
10
+ if (entry.expiresAt <= Date.now()) {
11
+ attempts.delete(key);
12
+ return 0;
13
+ }
14
+ return entry.count;
15
+ },
16
+ async setAttempts(key, count, ttlMs) {
17
+ evictExpired(attempts);
18
+ evictOldest(attempts, DEFAULT_MAX_ENTRIES);
19
+ attempts.set(key, { count, expiresAt: Date.now() + ttlMs });
20
+ },
21
+ async deleteAttempts(key) {
22
+ attempts.delete(key);
23
+ },
24
+ async setLocked(key, ttlMs) {
25
+ evictOldest(locked, DEFAULT_MAX_ENTRIES);
26
+ locked.set(key, Date.now() + ttlMs);
27
+ },
28
+ async isLocked(key) {
29
+ const expiresAt = locked.get(key);
30
+ if (!expiresAt)
31
+ return false;
32
+ if (expiresAt <= Date.now()) {
33
+ locked.delete(key);
34
+ return false;
35
+ }
36
+ return true;
37
+ },
38
+ async deleteLocked(key) {
39
+ locked.delete(key);
40
+ },
41
+ };
42
+ }
43
+ // ---------------------------------------------------------------------------
44
+ // SQLite repository factory
45
+ // ---------------------------------------------------------------------------
46
+ export function createSqliteLockoutRepository(db) {
47
+ let initialized = false;
48
+ function init() {
49
+ if (initialized)
50
+ return;
51
+ db.run(`CREATE TABLE IF NOT EXISTS auth_lockout_attempts (
52
+ subjectKey TEXT PRIMARY KEY,
53
+ count INTEGER NOT NULL,
54
+ expiresAt INTEGER NOT NULL
55
+ )`);
56
+ db.run(`CREATE TABLE IF NOT EXISTS auth_locked_accounts (
57
+ subjectKey TEXT PRIMARY KEY,
58
+ expiresAt INTEGER NOT NULL
59
+ )`);
60
+ db.run('CREATE INDEX IF NOT EXISTS idx_auth_lockout_attempts_expiresAt ON auth_lockout_attempts(expiresAt)');
61
+ db.run('CREATE INDEX IF NOT EXISTS idx_auth_locked_accounts_expiresAt ON auth_locked_accounts(expiresAt)');
62
+ initialized = true;
63
+ }
64
+ return {
65
+ async getAttempts(key) {
66
+ init();
67
+ const now = Date.now();
68
+ const row = db
69
+ .query('SELECT count FROM auth_lockout_attempts WHERE subjectKey = ? AND expiresAt > ?')
70
+ .get(key, now);
71
+ if (row)
72
+ return row.count;
73
+ db.run('DELETE FROM auth_lockout_attempts WHERE subjectKey = ? AND expiresAt <= ?', [
74
+ key,
75
+ now,
76
+ ]);
77
+ return 0;
78
+ },
79
+ async setAttempts(key, count, ttlMs) {
80
+ init();
81
+ const expiresAt = Date.now() + ttlMs;
82
+ db.run(`INSERT INTO auth_lockout_attempts (subjectKey, count, expiresAt)
83
+ VALUES (?, ?, ?)
84
+ ON CONFLICT(subjectKey) DO UPDATE SET count = excluded.count, expiresAt = excluded.expiresAt`, [key, count, expiresAt]);
85
+ },
86
+ async deleteAttempts(key) {
87
+ init();
88
+ db.run('DELETE FROM auth_lockout_attempts WHERE subjectKey = ?', [key]);
89
+ },
90
+ async setLocked(key, ttlMs) {
91
+ init();
92
+ const expiresAt = Date.now() + ttlMs;
93
+ db.run(`INSERT INTO auth_locked_accounts (subjectKey, expiresAt)
94
+ VALUES (?, ?)
95
+ ON CONFLICT(subjectKey) DO UPDATE SET expiresAt = excluded.expiresAt`, [key, expiresAt]);
96
+ },
97
+ async isLocked(key) {
98
+ init();
99
+ const now = Date.now();
100
+ const row = db
101
+ .query('SELECT expiresAt FROM auth_locked_accounts WHERE subjectKey = ? AND expiresAt > ?')
102
+ .get(key, now);
103
+ if (row)
104
+ return true;
105
+ db.run('DELETE FROM auth_locked_accounts WHERE subjectKey = ? AND expiresAt <= ?', [
106
+ key,
107
+ now,
108
+ ]);
109
+ return false;
110
+ },
111
+ async deleteLocked(key) {
112
+ init();
113
+ db.run('DELETE FROM auth_locked_accounts WHERE subjectKey = ?', [key]);
114
+ },
115
+ };
116
+ }
117
+ // ---------------------------------------------------------------------------
118
+ // Redis repository factory
119
+ // ---------------------------------------------------------------------------
120
+ export function createRedisLockoutRepository(getRedis, appName) {
121
+ const redis = getRedis();
122
+ return {
123
+ async getAttempts(key) {
124
+ const raw = await redis.get(`lockout:attempts:${appName}:${key}`);
125
+ if (!raw)
126
+ return 0;
127
+ const value = parseInt(raw, 10);
128
+ return Number.isFinite(value) ? value : 0;
129
+ },
130
+ async setAttempts(key, count, ttlMs) {
131
+ await redis.set(`lockout:attempts:${appName}:${key}`, String(count), 'PX', ttlMs);
132
+ },
133
+ async deleteAttempts(key) {
134
+ await redis.del(`lockout:attempts:${appName}:${key}`);
135
+ },
136
+ async setLocked(key, ttlMs) {
137
+ await redis.set(`lockout:locked:${appName}:${key}`, '1', 'PX', ttlMs);
138
+ },
139
+ async isLocked(key) {
140
+ const raw = await redis.get(`lockout:locked:${appName}:${key}`);
141
+ return raw !== null;
142
+ },
143
+ async deleteLocked(key) {
144
+ await redis.del(`lockout:locked:${appName}:${key}`);
145
+ },
146
+ };
147
+ }
148
+ export function createMongoLockoutRepository(conn, mg) {
149
+ function getAttemptsModel() {
150
+ if (conn.models['AuthLockoutAttempt']) {
151
+ return conn.models['AuthLockoutAttempt'];
152
+ }
153
+ const { Schema } = mg;
154
+ const schema = new Schema({
155
+ subjectKey: { type: String, required: true, unique: true },
156
+ count: { type: Number, required: true },
157
+ expiresAt: { type: Date, required: true, index: { expireAfterSeconds: 0 } },
158
+ }, { collection: 'auth_lockout_attempts' });
159
+ return conn.model('AuthLockoutAttempt', schema);
160
+ }
161
+ function getLockedModel() {
162
+ if (conn.models['AuthLockedAccount']) {
163
+ return conn.models['AuthLockedAccount'];
164
+ }
165
+ const { Schema } = mg;
166
+ const schema = new Schema({
167
+ subjectKey: { type: String, required: true, unique: true },
168
+ expiresAt: { type: Date, required: true, index: { expireAfterSeconds: 0 } },
169
+ }, { collection: 'auth_locked_accounts' });
170
+ return conn.model('AuthLockedAccount', schema);
171
+ }
172
+ return {
173
+ async getAttempts(key) {
174
+ const doc = await getAttemptsModel()
175
+ .findOne({
176
+ subjectKey: key,
177
+ expiresAt: { $gt: new Date() },
178
+ })
179
+ .lean();
180
+ return doc?.count ?? 0;
181
+ },
182
+ async setAttempts(key, count, ttlMs) {
183
+ await getAttemptsModel().updateOne({ subjectKey: key }, { $set: { count, expiresAt: new Date(Date.now() + ttlMs) } }, { upsert: true });
184
+ },
185
+ async deleteAttempts(key) {
186
+ await getAttemptsModel().deleteOne({ subjectKey: key });
187
+ },
188
+ async setLocked(key, ttlMs) {
189
+ await getLockedModel().updateOne({ subjectKey: key }, { $set: { expiresAt: new Date(Date.now() + ttlMs) } }, { upsert: true });
190
+ },
191
+ async isLocked(key) {
192
+ const doc = await getLockedModel()
193
+ .findOne({
194
+ subjectKey: key,
195
+ expiresAt: { $gt: new Date() },
196
+ })
197
+ .lean();
198
+ return doc !== null;
199
+ },
200
+ async deleteLocked(key) {
201
+ await getLockedModel().deleteOne({ subjectKey: key });
202
+ },
203
+ };
204
+ }
205
+ export const lockoutRepositoryFactories = {
206
+ memory: () => createMemoryLockoutRepository(),
207
+ sqlite: infra => createSqliteLockoutRepository(infra.getSqliteDb()),
208
+ redis: infra => createRedisLockoutRepository(infra.getRedis, infra.appName),
209
+ mongo: infra => {
210
+ const { conn, mg } = infra.getMongo();
211
+ return createMongoLockoutRepository(conn, mg);
212
+ },
213
+ postgres: () => {
214
+ throw new Error('[bunshot-auth] postgres store is not yet supported for lockout repository');
215
+ },
216
+ };
217
+ // ---------------------------------------------------------------------------
218
+ // Service factory
219
+ // ---------------------------------------------------------------------------
220
+ export function createLockoutService(config, repo) {
221
+ return {
222
+ config,
223
+ async recordFailedAttempt(userId) {
224
+ const ttlMs = config.lockoutDuration * 2 * 1000;
225
+ const current = await repo.getAttempts(userId);
226
+ const next = current + 1;
227
+ await repo.setAttempts(userId, next, ttlMs);
228
+ return next;
229
+ },
230
+ async isAccountLocked(userId) {
231
+ return repo.isLocked(userId);
232
+ },
233
+ async lockAccount(userId) {
234
+ await repo.setLocked(userId, config.lockoutDuration * 1000);
235
+ },
236
+ async unlockAccount(userId) {
237
+ await repo.deleteLocked(userId);
238
+ await repo.deleteAttempts(userId);
239
+ },
240
+ async resetFailureCount(userId) {
241
+ await repo.deleteAttempts(userId);
242
+ },
243
+ };
244
+ }
@@ -0,0 +1 @@
1
+ export type { CoreAuthAdapter, OAuthAdapter, MfaAdapter, WebAuthnAdapter, RolesAdapter, GroupsAdapter, SuspensionAdapter, EnterpriseAdapter, } from '../../../bunshot-core/src/index.js';
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export type { GroupRecord, GroupMembershipRecord, PaginationOpts, PaginatedResult, M2MClientRecord, IdentityProfile, WebAuthnCredential, UserQuery, UserRecord, AuthAdapter, } from '../../../bunshot-core/src/index.js';
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,15 @@
1
+ import type { JWTPayload } from 'jose';
2
+ export interface AuthVariables {
3
+ /** Authenticated user ID from the JWT sid claim. Null when unauthenticated. */
4
+ authUserId: string | null;
5
+ /** Session ID from the JWT sid claim. Null when unauthenticated. */
6
+ sessionId: string | null;
7
+ /** Effective roles for the authenticated user. Null when unauthenticated. */
8
+ roles: string[] | null;
9
+ /** Set by identify when a scope-bearing M2M token (no sid) is verified. */
10
+ authClientId: string | null;
11
+ /** Set by bearerAuth when a BearerAuthClient match is found (clientId from the matched entry). */
12
+ bearerClientId: string | null;
13
+ /** Raw verified JWT payload stashed by identify for downstream middleware. Null when unauthenticated. */
14
+ tokenPayload: JWTPayload | null;
15
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,4 @@
1
+ import type { BunshotEventBus } from '../../../bunshot-core/src/index.js';
2
+ export declare function setAuthEventBus(bus: BunshotEventBus): void;
3
+ /** Returns the active event bus, or a no-op bus if not set (safe for pre-plugin-setup calls). */
4
+ export declare function getAuthEventBus(): BunshotEventBus;
@@ -0,0 +1,15 @@
1
+ let _bus = null;
2
+ export function setAuthEventBus(bus) {
3
+ _bus = bus;
4
+ }
5
+ /** Returns the active event bus, or a no-op bus if not set (safe for pre-plugin-setup calls). */
6
+ export function getAuthEventBus() {
7
+ if (!_bus) {
8
+ return {
9
+ emit: () => { },
10
+ on: () => { },
11
+ off: () => { },
12
+ };
13
+ }
14
+ return _bus;
15
+ }
@@ -0,0 +1,28 @@
1
+ import type { RepoFactories } from '../../../bunshot-core/src/index.js';
2
+ import type { RedisLike } from '../types/redis';
3
+ export interface AuthRateLimitEntry {
4
+ count: number;
5
+ resetAt: number;
6
+ }
7
+ export interface LimitOpts {
8
+ windowMs: number;
9
+ max: number;
10
+ }
11
+ export interface AuthRateLimitService {
12
+ isLimited(key: string, opts: LimitOpts): Promise<boolean>;
13
+ trackAttempt(key: string, opts: LimitOpts): Promise<boolean>;
14
+ bustAuthLimit(key: string): Promise<void>;
15
+ }
16
+ export interface IAuthRateLimitRepository {
17
+ get(key: string): Promise<AuthRateLimitEntry | null>;
18
+ set(key: string, entry: AuthRateLimitEntry, ttlMs: number): Promise<void>;
19
+ delete(key: string): Promise<void>;
20
+ /** Atomically increment and return the new count. Optional — falls back to read-modify-write. */
21
+ increment?(key: string, windowMs: number): Promise<number>;
22
+ }
23
+ export declare function createMemoryAuthRateLimitRepository(): IAuthRateLimitRepository;
24
+ export declare function createSqliteAuthRateLimitRepository(db: import('bun:sqlite').Database): IAuthRateLimitRepository;
25
+ export declare function createRedisAuthRateLimitRepository(getRedis: () => RedisLike, appName: string): IAuthRateLimitRepository;
26
+ export declare function createMongoAuthRateLimitRepository(conn: import('mongoose').Connection, mg: typeof import('mongoose')): IAuthRateLimitRepository;
27
+ export declare const authRateLimitFactories: RepoFactories<IAuthRateLimitRepository>;
28
+ export declare function createAuthRateLimitService(repo: IAuthRateLimitRepository): AuthRateLimitService;
@@ -0,0 +1,205 @@
1
+ import { DEFAULT_MAX_ENTRIES, evictOldest } from '../../../bunshot-core/src/index.js';
2
+ // ---------------------------------------------------------------------------
3
+ // Memory repository factory
4
+ // ---------------------------------------------------------------------------
5
+ export function createMemoryAuthRateLimitRepository() {
6
+ const store = new Map();
7
+ return {
8
+ async get(key) {
9
+ const entry = store.get(key);
10
+ if (!entry)
11
+ return null;
12
+ if (entry.resetAt <= Date.now()) {
13
+ store.delete(key);
14
+ return null;
15
+ }
16
+ return entry;
17
+ },
18
+ async set(key, entry) {
19
+ evictOldest(store, DEFAULT_MAX_ENTRIES);
20
+ store.set(key, entry);
21
+ },
22
+ async delete(key) {
23
+ store.delete(key);
24
+ },
25
+ // No increment — memory store uses the read-modify-write fallback (single-process, acceptable)
26
+ };
27
+ }
28
+ // ---------------------------------------------------------------------------
29
+ // SQLite repository factory
30
+ // ---------------------------------------------------------------------------
31
+ export function createSqliteAuthRateLimitRepository(db) {
32
+ let initialized = false;
33
+ function init() {
34
+ if (initialized)
35
+ return;
36
+ db.run(`CREATE TABLE IF NOT EXISTS auth_rate_limit (
37
+ subjectKey TEXT PRIMARY KEY,
38
+ count INTEGER NOT NULL,
39
+ resetAt INTEGER NOT NULL
40
+ )`);
41
+ db.run('CREATE INDEX IF NOT EXISTS idx_auth_rate_limit_resetAt ON auth_rate_limit(resetAt)');
42
+ initialized = true;
43
+ }
44
+ return {
45
+ async get(key) {
46
+ init();
47
+ const now = Date.now();
48
+ const row = db
49
+ .query('SELECT count, resetAt FROM auth_rate_limit WHERE subjectKey = ? AND resetAt > ?')
50
+ .get(key, now);
51
+ if (row)
52
+ return { count: row.count, resetAt: row.resetAt };
53
+ db.run('DELETE FROM auth_rate_limit WHERE subjectKey = ? AND resetAt <= ?', [key, now]);
54
+ return null;
55
+ },
56
+ async set(key, entry) {
57
+ init();
58
+ db.run(`INSERT INTO auth_rate_limit (subjectKey, count, resetAt)
59
+ VALUES (?, ?, ?)
60
+ ON CONFLICT(subjectKey) DO UPDATE SET count = excluded.count, resetAt = excluded.resetAt`, [key, entry.count, entry.resetAt]);
61
+ },
62
+ async delete(key) {
63
+ init();
64
+ db.run('DELETE FROM auth_rate_limit WHERE subjectKey = ?', [key]);
65
+ },
66
+ };
67
+ }
68
+ // ---------------------------------------------------------------------------
69
+ // Redis repository factory
70
+ // ---------------------------------------------------------------------------
71
+ // Lua script: atomically read + increment + write JSON entry, preserving { count, resetAt } format.
72
+ // Returns the new count as a number.
73
+ const TRACK_SCRIPT = `
74
+ local key = KEYS[1]
75
+ local windowMs = tonumber(ARGV[1])
76
+ local now = tonumber(ARGV[2])
77
+ local raw = redis.call("GET", key)
78
+ local count, resetAt
79
+
80
+ if raw then
81
+ local entry = cjson.decode(raw)
82
+ count = entry.count + 1
83
+ resetAt = entry.resetAt
84
+ else
85
+ count = 1
86
+ resetAt = now + windowMs
87
+ end
88
+
89
+ local ttl = math.max(1, resetAt - now)
90
+ local payload = cjson.encode({count = count, resetAt = resetAt})
91
+ redis.call("SET", key, payload, "PX", ttl)
92
+ return count
93
+ `;
94
+ export function createRedisAuthRateLimitRepository(getRedis, appName) {
95
+ const redis = getRedis();
96
+ return {
97
+ async get(key) {
98
+ const raw = await redis.get(`rl:${appName}:${key}`);
99
+ if (!raw)
100
+ return null;
101
+ const entry = JSON.parse(raw);
102
+ if (entry.resetAt <= Date.now())
103
+ return null;
104
+ return entry;
105
+ },
106
+ async set(key, entry, ttlMs) {
107
+ await redis.set(`rl:${appName}:${key}`, JSON.stringify(entry), 'PX', ttlMs);
108
+ },
109
+ async delete(key) {
110
+ await redis.del(`rl:${appName}:${key}`);
111
+ },
112
+ async increment(key, windowMs) {
113
+ const fullKey = `rl:${appName}:${key}`;
114
+ const now = Date.now();
115
+ const count = (await redis.eval(TRACK_SCRIPT, 1, fullKey, windowMs, now));
116
+ return count;
117
+ },
118
+ };
119
+ }
120
+ export function createMongoAuthRateLimitRepository(conn, mg) {
121
+ function getModel() {
122
+ if (conn.models['AuthRateLimit']) {
123
+ return conn.models['AuthRateLimit'];
124
+ }
125
+ const { Schema } = mg;
126
+ const schema = new Schema({
127
+ subjectKey: { type: String, required: true, unique: true },
128
+ count: { type: Number, required: true },
129
+ resetAt: { type: Number, required: true },
130
+ expiresAt: { type: Date, required: true, index: { expireAfterSeconds: 0 } },
131
+ }, { collection: 'auth_rate_limits' });
132
+ return conn.model('AuthRateLimit', schema);
133
+ }
134
+ return {
135
+ async get(key) {
136
+ const now = Date.now();
137
+ const doc = await getModel()
138
+ .findOne({
139
+ subjectKey: key,
140
+ resetAt: { $gt: now },
141
+ })
142
+ .lean();
143
+ if (!doc)
144
+ return null;
145
+ return { count: doc.count, resetAt: doc.resetAt };
146
+ },
147
+ async set(key, entry) {
148
+ await getModel().updateOne({ subjectKey: key }, {
149
+ $set: {
150
+ count: entry.count,
151
+ resetAt: entry.resetAt,
152
+ expiresAt: new Date(entry.resetAt),
153
+ },
154
+ }, { upsert: true });
155
+ },
156
+ async delete(key) {
157
+ await getModel().deleteOne({ subjectKey: key });
158
+ },
159
+ };
160
+ }
161
+ export const authRateLimitFactories = {
162
+ memory: () => createMemoryAuthRateLimitRepository(),
163
+ sqlite: infra => createSqliteAuthRateLimitRepository(infra.getSqliteDb()),
164
+ redis: infra => createRedisAuthRateLimitRepository(infra.getRedis, infra.appName),
165
+ mongo: infra => {
166
+ const { conn, mg } = infra.getMongo();
167
+ return createMongoAuthRateLimitRepository(conn, mg);
168
+ },
169
+ postgres: () => {
170
+ throw new Error('[bunshot-auth] postgres store is not yet supported for authRateLimit repository');
171
+ },
172
+ };
173
+ // ---------------------------------------------------------------------------
174
+ // Service factory
175
+ // ---------------------------------------------------------------------------
176
+ export function createAuthRateLimitService(repo) {
177
+ return {
178
+ async isLimited(key, opts) {
179
+ const entry = await repo.get(key);
180
+ if (!entry)
181
+ return false;
182
+ return entry.count >= opts.max;
183
+ },
184
+ async trackAttempt(key, opts) {
185
+ if (repo.increment) {
186
+ const count = await repo.increment(key, opts.windowMs);
187
+ return count >= opts.max;
188
+ }
189
+ // Read-modify-write fallback for memory store (single-process — no lost increments)
190
+ const now = Date.now();
191
+ const existing = await repo.get(key);
192
+ if (!existing) {
193
+ await repo.set(key, { count: 1, resetAt: now + opts.windowMs }, opts.windowMs);
194
+ return 1 >= opts.max;
195
+ }
196
+ const updated = { count: existing.count + 1, resetAt: existing.resetAt };
197
+ const remaining = Math.max(1, existing.resetAt - now);
198
+ await repo.set(key, updated, remaining);
199
+ return updated.count >= opts.max;
200
+ },
201
+ async bustAuthLimit(key) {
202
+ await repo.delete(key);
203
+ },
204
+ };
205
+ }
@@ -1,4 +1,5 @@
1
- import type { BreachedPasswordConfig } from "./appConfig";
1
+ import type { BunshotEventBus } from '../../../bunshot-core/src/index.js';
2
+ import type { BreachedPasswordConfig } from '../config/authConfig';
2
3
  export type { BreachedPasswordConfig };
3
4
  /**
4
5
  * Check whether a password has appeared in a data breach using the
@@ -7,7 +8,12 @@ export type { BreachedPasswordConfig };
7
8
  * Sends only the first 5 hex chars of the SHA-1 hash — the full hash
8
9
  * never leaves the server.
9
10
  */
10
- export declare function checkBreachedPassword(password: string, config?: BreachedPasswordConfig): Promise<{
11
+ export declare function checkBreachedPassword(password: string, config?: BreachedPasswordConfig, context?: {
12
+ userId?: string;
13
+ ip?: string;
14
+ requestId?: string;
15
+ sessionId?: string;
16
+ }, eventBus?: BunshotEventBus): Promise<{
11
17
  breached: boolean;
12
18
  count: number;
13
19
  }>;