@lastshotlabs/bunshot 0.0.27 → 0.1.0

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 +211 -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 +277 -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 +64 -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 +100 -26
  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,145 @@
1
+ import { DEFAULT_MAX_ENTRIES, evictExpired, evictOldest, sha256 } from '../../../bunshot-core/src/index.js';
2
+ export function createMemoryMagicLinkRepository() {
3
+ const tokens = new Map();
4
+ return {
5
+ async store(hash, userId, ttl) {
6
+ evictExpired(tokens);
7
+ evictOldest(tokens, DEFAULT_MAX_ENTRIES);
8
+ tokens.set(hash, { userId, expiresAt: Date.now() + ttl * 1000 });
9
+ },
10
+ async consume(hash) {
11
+ const entry = tokens.get(hash);
12
+ if (!entry || entry.expiresAt <= Date.now()) {
13
+ tokens.delete(hash);
14
+ return null;
15
+ }
16
+ tokens.delete(hash);
17
+ return entry.userId;
18
+ },
19
+ };
20
+ }
21
+ // ---------------------------------------------------------------------------
22
+ // SQLite repository factory
23
+ // ---------------------------------------------------------------------------
24
+ export function createSqliteMagicLinkRepository(db) {
25
+ let initialized = false;
26
+ function init() {
27
+ if (initialized)
28
+ return;
29
+ db.run(`CREATE TABLE IF NOT EXISTS auth_magic_links (
30
+ tokenHash TEXT PRIMARY KEY,
31
+ userId TEXT NOT NULL,
32
+ expiresAt INTEGER NOT NULL
33
+ )`);
34
+ db.run('CREATE INDEX IF NOT EXISTS idx_auth_magic_links_expiresAt ON auth_magic_links(expiresAt)');
35
+ initialized = true;
36
+ }
37
+ return {
38
+ async store(hash, userId, ttl) {
39
+ init();
40
+ const expiresAt = Date.now() + ttl * 1000;
41
+ db.run(`INSERT INTO auth_magic_links (tokenHash, userId, expiresAt)
42
+ VALUES (?, ?, ?)
43
+ ON CONFLICT(tokenHash) DO UPDATE SET userId = excluded.userId, expiresAt = excluded.expiresAt`, [hash, userId, expiresAt]);
44
+ },
45
+ async consume(hash) {
46
+ init();
47
+ const now = Date.now();
48
+ const row = db
49
+ .query('SELECT userId FROM auth_magic_links WHERE tokenHash = ? AND expiresAt > ?')
50
+ .get(hash, now);
51
+ db.run('DELETE FROM auth_magic_links WHERE tokenHash = ?', [hash]);
52
+ if (!row)
53
+ return null;
54
+ return row.userId;
55
+ },
56
+ };
57
+ }
58
+ // ---------------------------------------------------------------------------
59
+ // Redis repository factory
60
+ // ---------------------------------------------------------------------------
61
+ /** Atomically GET+DEL a key. Uses native GETDEL (Redis >= 6.2) with a Lua fallback. */
62
+ async function redisGetDel(redis, key) {
63
+ if (typeof redis.getdel === 'function') {
64
+ try {
65
+ return await redis.getdel(key);
66
+ }
67
+ catch (err) {
68
+ const msg = err?.message ?? '';
69
+ if (!/unknown command|ERR unknown command/i.test(msg))
70
+ throw err;
71
+ }
72
+ }
73
+ const result = await redis.eval("local v = redis.call('GET', KEYS[1])\nif v then redis.call('DEL', KEYS[1]) end\nreturn v", 1, key);
74
+ return result ?? null;
75
+ }
76
+ export function createRedisMagicLinkRepository(getRedis, appName) {
77
+ return {
78
+ async store(hash, userId, ttl) {
79
+ await getRedis().set(`magiclink:${appName}:${hash}`, userId, 'EX', ttl);
80
+ },
81
+ async consume(hash) {
82
+ const userId = await redisGetDel(getRedis(), `magiclink:${appName}:${hash}`);
83
+ return userId ?? null;
84
+ },
85
+ };
86
+ }
87
+ export function createMongoMagicLinkRepository(conn, mg) {
88
+ function getModel() {
89
+ if (conn.models['MagicLink'])
90
+ return conn.models['MagicLink'];
91
+ const { Schema } = mg;
92
+ const magicLinkSchema = new Schema({
93
+ token: { type: String, required: true, unique: true },
94
+ userId: { type: String, required: true },
95
+ expiresAt: { type: Date, required: true, index: { expireAfterSeconds: 0 } },
96
+ }, { collection: 'magic_links' });
97
+ return conn.model('MagicLink', magicLinkSchema);
98
+ }
99
+ return {
100
+ async store(hash, userId, ttl) {
101
+ await getModel().create({
102
+ token: hash,
103
+ userId,
104
+ expiresAt: new Date(Date.now() + ttl * 1000),
105
+ });
106
+ },
107
+ async consume(hash) {
108
+ const doc = await getModel()
109
+ .findOneAndDelete({ token: hash, expiresAt: { $gt: new Date() } })
110
+ .lean();
111
+ if (!doc)
112
+ return null;
113
+ return doc.userId;
114
+ },
115
+ };
116
+ }
117
+ export const magicLinkFactories = {
118
+ memory: () => createMemoryMagicLinkRepository(),
119
+ sqlite: infra => createSqliteMagicLinkRepository(infra.getSqliteDb()),
120
+ redis: infra => createRedisMagicLinkRepository(infra.getRedis, infra.appName),
121
+ mongo: infra => {
122
+ const { conn, mg } = infra.getMongo();
123
+ return createMongoMagicLinkRepository(conn, mg);
124
+ },
125
+ postgres: () => {
126
+ throw new Error('[bunshot-auth] postgres store is not yet supported for magicLink repository');
127
+ },
128
+ };
129
+ // ---------------------------------------------------------------------------
130
+ // Public API
131
+ // ---------------------------------------------------------------------------
132
+ const DEFAULT_MAGIC_LINK_TTL = 60 * 15; // 15 minutes
133
+ export const createMagicLinkToken = async (repo, userId, ttlSeconds) => {
134
+ const bytes = new Uint8Array(32);
135
+ crypto.getRandomValues(bytes);
136
+ const token = Buffer.from(bytes).toString('base64url');
137
+ const hash = sha256(token);
138
+ const ttl = ttlSeconds ?? DEFAULT_MAGIC_LINK_TTL;
139
+ await repo.store(hash, userId, ttl);
140
+ return token;
141
+ };
142
+ export const consumeMagicLinkToken = async (repo, token) => {
143
+ const hash = sha256(token);
144
+ return repo.consume(hash);
145
+ };
@@ -0,0 +1,60 @@
1
+ import type { RepoFactories } from '../../../bunshot-core/src/index.js';
2
+ import type { AuthResolvedConfig } from '../config/authConfig';
3
+ import type { RedisLike } from '../types/redis';
4
+ export type MfaChallengePurpose = 'login' | 'webauthn-registration' | 'passkey-login' | 'reauth';
5
+ export interface MfaChallengeOptions {
6
+ emailOtpHash?: string;
7
+ webauthnChallenge?: string;
8
+ }
9
+ export interface ReauthChallengeOptions {
10
+ emailOtpHash?: string;
11
+ webauthnChallenge?: string;
12
+ ttlSeconds?: number;
13
+ }
14
+ export interface MfaChallengeData {
15
+ userId: string;
16
+ purpose: MfaChallengePurpose;
17
+ emailOtpHash?: string;
18
+ webauthnChallenge?: string;
19
+ sessionId?: string;
20
+ }
21
+ interface MfaChallengeRecord {
22
+ userId: string;
23
+ purpose: MfaChallengePurpose;
24
+ emailOtpHash?: string;
25
+ webauthnChallenge?: string;
26
+ sessionId?: string;
27
+ createdAt: number;
28
+ resendCount: number;
29
+ }
30
+ export interface IMfaChallengeRepository {
31
+ createChallenge(hash: string, data: MfaChallengeRecord, ttl: number): Promise<void>;
32
+ consumeChallenge(hash: string): Promise<MfaChallengeRecord | null>;
33
+ replaceOtp(hash: string, newOtpHash: string, ttl: number, maxResends: number): Promise<{
34
+ userId: string;
35
+ resendCount: number;
36
+ } | null>;
37
+ }
38
+ export declare function createMemoryMfaChallengeRepository(): IMfaChallengeRepository;
39
+ export declare function createSqliteMfaChallengeRepository(db: import('bun:sqlite').Database): IMfaChallengeRepository;
40
+ export declare function createRedisMfaChallengeRepository(getRedis: () => RedisLike, appName: string): IMfaChallengeRepository;
41
+ export declare function createMongoMfaChallengeRepository(conn: import('mongoose').Connection, mg: typeof import('mongoose')): IMfaChallengeRepository;
42
+ export declare const mfaChallengeFactories: RepoFactories<IMfaChallengeRepository>;
43
+ export declare const createMfaChallenge: (repo: IMfaChallengeRepository, userId: string, options?: MfaChallengeOptions, config?: AuthResolvedConfig) => Promise<string>;
44
+ export declare const consumeMfaChallenge: (repo: IMfaChallengeRepository, token: string) => Promise<MfaChallengeData | null>;
45
+ export declare const replaceMfaChallengeOtp: (repo: IMfaChallengeRepository, token: string, newEmailOtpHash: string, config?: AuthResolvedConfig) => Promise<{
46
+ userId: string;
47
+ resendCount: number;
48
+ } | null>;
49
+ export declare const createWebAuthnRegistrationChallenge: (repo: IMfaChallengeRepository, userId: string, challenge: string, config?: AuthResolvedConfig) => Promise<string>;
50
+ export declare const consumeWebAuthnRegistrationChallenge: (repo: IMfaChallengeRepository, token: string) => Promise<{
51
+ userId: string;
52
+ challenge: string;
53
+ } | null>;
54
+ export declare const createPasskeyLoginChallenge: (repo: IMfaChallengeRepository, challenge: string) => Promise<string>;
55
+ export declare const consumePasskeyLoginChallenge: (repo: IMfaChallengeRepository, token: string) => Promise<{
56
+ webauthnChallenge: string;
57
+ } | null>;
58
+ export declare const createReauthChallenge: (repo: IMfaChallengeRepository, userId: string, sessionId: string, options?: ReauthChallengeOptions, config?: AuthResolvedConfig) => Promise<string>;
59
+ export declare const consumeReauthChallenge: (repo: IMfaChallengeRepository, token: string, sessionId: string) => Promise<MfaChallengeData | null>;
60
+ export {};
@@ -0,0 +1,419 @@
1
+ import { DEFAULT_MAX_ENTRIES, evictExpired, evictOldest, sha256, timingSafeEqual, } from '../../../bunshot-core/src/index.js';
2
+ const MAX_RESENDS = 3;
3
+ // ---------------------------------------------------------------------------
4
+ // Memory repository factory
5
+ // ---------------------------------------------------------------------------
6
+ export function createMemoryMfaChallengeRepository() {
7
+ const challenges = new Map();
8
+ return {
9
+ async createChallenge(hash, data, ttl) {
10
+ evictExpired(challenges);
11
+ evictOldest(challenges, DEFAULT_MAX_ENTRIES);
12
+ challenges.set(hash, { ...data, expiresAt: Date.now() + ttl * 1000 });
13
+ },
14
+ async consumeChallenge(hash) {
15
+ const entry = challenges.get(hash);
16
+ if (!entry || entry.expiresAt <= Date.now()) {
17
+ challenges.delete(hash);
18
+ return null;
19
+ }
20
+ challenges.delete(hash);
21
+ return {
22
+ userId: entry.userId,
23
+ purpose: entry.purpose,
24
+ emailOtpHash: entry.emailOtpHash,
25
+ webauthnChallenge: entry.webauthnChallenge,
26
+ sessionId: entry.sessionId,
27
+ createdAt: entry.createdAt,
28
+ resendCount: entry.resendCount,
29
+ };
30
+ },
31
+ async replaceOtp(hash, newOtpHash, ttl, maxResends) {
32
+ const entry = challenges.get(hash);
33
+ if (!entry || entry.expiresAt <= Date.now()) {
34
+ challenges.delete(hash);
35
+ return null;
36
+ }
37
+ if (entry.resendCount >= maxResends)
38
+ return null;
39
+ entry.emailOtpHash = newOtpHash;
40
+ entry.resendCount++;
41
+ const maxExpiry = entry.createdAt + ttl * 3 * 1000;
42
+ entry.expiresAt = Math.min(Date.now() + ttl * 1000, maxExpiry);
43
+ return { userId: entry.userId, resendCount: entry.resendCount };
44
+ },
45
+ };
46
+ }
47
+ // ---------------------------------------------------------------------------
48
+ // SQLite repository factory
49
+ // ---------------------------------------------------------------------------
50
+ export function createSqliteMfaChallengeRepository(db) {
51
+ let tableCreated = false;
52
+ function ensureTable() {
53
+ if (tableCreated || !db)
54
+ return;
55
+ db.run(`CREATE TABLE IF NOT EXISTS mfa_challenges (
56
+ token TEXT PRIMARY KEY,
57
+ userId TEXT NOT NULL,
58
+ purpose TEXT NOT NULL DEFAULT 'login',
59
+ emailOtpHash TEXT,
60
+ webauthnChallenge TEXT,
61
+ sessionId TEXT,
62
+ createdAt INTEGER NOT NULL,
63
+ resendCount INTEGER NOT NULL DEFAULT 0,
64
+ expiresAt INTEGER NOT NULL
65
+ )`);
66
+ // Migrate pre-existing tables that lack newer columns
67
+ try {
68
+ db.run('ALTER TABLE mfa_challenges ADD COLUMN emailOtpHash TEXT');
69
+ }
70
+ catch {
71
+ /* already exists */
72
+ }
73
+ try {
74
+ db.run('ALTER TABLE mfa_challenges ADD COLUMN createdAt INTEGER NOT NULL DEFAULT 0');
75
+ }
76
+ catch {
77
+ /* already exists */
78
+ }
79
+ try {
80
+ db.run('ALTER TABLE mfa_challenges ADD COLUMN resendCount INTEGER NOT NULL DEFAULT 0');
81
+ }
82
+ catch {
83
+ /* already exists */
84
+ }
85
+ try {
86
+ db.run("ALTER TABLE mfa_challenges ADD COLUMN purpose TEXT NOT NULL DEFAULT 'login'");
87
+ }
88
+ catch {
89
+ /* already exists */
90
+ }
91
+ try {
92
+ db.run('ALTER TABLE mfa_challenges ADD COLUMN webauthnChallenge TEXT');
93
+ }
94
+ catch {
95
+ /* already exists */
96
+ }
97
+ try {
98
+ db.run('ALTER TABLE mfa_challenges ADD COLUMN sessionId TEXT');
99
+ }
100
+ catch {
101
+ /* already exists */
102
+ }
103
+ tableCreated = true;
104
+ }
105
+ return {
106
+ async createChallenge(hash, data, ttl) {
107
+ ensureTable();
108
+ const now = Date.now();
109
+ db.run('INSERT INTO mfa_challenges (token, userId, purpose, emailOtpHash, webauthnChallenge, sessionId, createdAt, resendCount, expiresAt) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)', [
110
+ hash,
111
+ data.userId,
112
+ data.purpose,
113
+ data.emailOtpHash ?? null,
114
+ data.webauthnChallenge ?? null,
115
+ data.sessionId ?? null,
116
+ data.createdAt,
117
+ data.resendCount,
118
+ now + ttl * 1000,
119
+ ]);
120
+ },
121
+ async consumeChallenge(hash) {
122
+ ensureTable();
123
+ const row = db
124
+ .query('DELETE FROM mfa_challenges WHERE token = ? AND expiresAt > ? RETURNING userId, purpose, emailOtpHash, webauthnChallenge, sessionId, createdAt, resendCount')
125
+ .get(hash, Date.now());
126
+ if (!row)
127
+ return null;
128
+ return {
129
+ userId: row.userId,
130
+ purpose: row.purpose,
131
+ emailOtpHash: row.emailOtpHash ?? undefined,
132
+ webauthnChallenge: row.webauthnChallenge ?? undefined,
133
+ sessionId: row.sessionId ?? undefined,
134
+ createdAt: row.createdAt,
135
+ resendCount: row.resendCount,
136
+ };
137
+ },
138
+ async replaceOtp(hash, newOtpHash, ttl, maxResends) {
139
+ ensureTable();
140
+ const now = Date.now();
141
+ const existing = db
142
+ .query('SELECT createdAt, resendCount FROM mfa_challenges WHERE token = ? AND expiresAt > ?')
143
+ .get(hash, now);
144
+ if (!existing || existing.resendCount >= maxResends)
145
+ return null;
146
+ const newExpiry = Math.min(now + ttl * 1000, existing.createdAt + ttl * 3 * 1000);
147
+ const newCount = existing.resendCount + 1;
148
+ const row = db
149
+ .query('UPDATE mfa_challenges SET emailOtpHash = ?, resendCount = ?, expiresAt = ? WHERE token = ? RETURNING userId')
150
+ .get(newOtpHash, newCount, newExpiry, hash);
151
+ return row ? { userId: row.userId, resendCount: newCount } : null;
152
+ },
153
+ };
154
+ }
155
+ // ---------------------------------------------------------------------------
156
+ // Redis repository factory
157
+ // ---------------------------------------------------------------------------
158
+ /** Atomically GET+DEL a key. Uses native GETDEL (Redis >= 6.2) with a Lua fallback. */
159
+ async function redisGetDel(redis, key) {
160
+ if (typeof redis.getdel === 'function') {
161
+ try {
162
+ return await redis.getdel(key);
163
+ }
164
+ catch (err) {
165
+ const msg = err?.message ?? '';
166
+ if (!/unknown command|ERR unknown command/i.test(msg))
167
+ throw err;
168
+ // Fall through to Lua on "unknown command"
169
+ }
170
+ }
171
+ const result = await redis.eval("local v = redis.call('GET', KEYS[1])\nif v then redis.call('DEL', KEYS[1]) end\nreturn v", 1, key);
172
+ return result ?? null;
173
+ }
174
+ export function createRedisMfaChallengeRepository(getRedis, appName) {
175
+ return {
176
+ async createChallenge(hash, data, ttl) {
177
+ const redis = getRedis();
178
+ await redis.set(`mfachallenge:${appName}:${hash}`, JSON.stringify(data), 'EX', ttl);
179
+ },
180
+ async consumeChallenge(hash) {
181
+ const redis = getRedis();
182
+ const key = `mfachallenge:${appName}:${hash}`;
183
+ const raw = await redisGetDel(redis, key);
184
+ if (!raw)
185
+ return null;
186
+ return JSON.parse(raw);
187
+ },
188
+ async replaceOtp(hash, newOtpHash, ttl, maxResends) {
189
+ const redis = getRedis();
190
+ const key = `mfachallenge:${appName}:${hash}`;
191
+ const now = Date.now();
192
+ const luaScript = `
193
+ local raw = redis.call('GET', KEYS[1])
194
+ if not raw then return nil end
195
+ local data = cjson.decode(raw)
196
+ if data.resendCount >= tonumber(ARGV[1]) then return nil end
197
+ data.emailOtpHash = ARGV[2]
198
+ data.resendCount = data.resendCount + 1
199
+ local maxExpiry = data.createdAt + tonumber(ARGV[3]) * 3 * 1000
200
+ local nowTtl = tonumber(ARGV[4]) + tonumber(ARGV[3]) * 1000
201
+ local newExpiry = math.min(nowTtl, maxExpiry)
202
+ local remainingTtl = math.max(1, math.ceil((newExpiry - tonumber(ARGV[4])) / 1000))
203
+ redis.call('SET', KEYS[1], cjson.encode(data), 'EX', remainingTtl)
204
+ return cjson.encode({ userId = data.userId, resendCount = data.resendCount })
205
+ `;
206
+ const result = (await redis.eval(luaScript, 1, key, maxResends, newOtpHash, ttl, now));
207
+ if (!result)
208
+ return null;
209
+ return JSON.parse(result);
210
+ },
211
+ };
212
+ }
213
+ export function createMongoMfaChallengeRepository(conn, mg) {
214
+ function getModel() {
215
+ if (conn.models['MfaChallenge'])
216
+ return conn.models['MfaChallenge'];
217
+ const { Schema } = mg;
218
+ const schema = new Schema({
219
+ token: { type: String, required: true, unique: true },
220
+ userId: { type: String, required: true },
221
+ purpose: { type: String, required: true, default: 'login' },
222
+ emailOtpHash: { type: String },
223
+ webauthnChallenge: { type: String },
224
+ sessionId: { type: String },
225
+ createdAt: { type: Date, required: true },
226
+ resendCount: { type: Number, required: true, default: 0 },
227
+ expiresAt: { type: Date, required: true, index: { expireAfterSeconds: 0 } },
228
+ }, { collection: 'mfa_challenges' });
229
+ return conn.model('MfaChallenge', schema);
230
+ }
231
+ return {
232
+ async createChallenge(hash, data, ttl) {
233
+ await getModel().create({
234
+ token: hash,
235
+ userId: data.userId,
236
+ purpose: data.purpose,
237
+ emailOtpHash: data.emailOtpHash,
238
+ webauthnChallenge: data.webauthnChallenge,
239
+ sessionId: data.sessionId,
240
+ createdAt: new Date(data.createdAt),
241
+ resendCount: data.resendCount,
242
+ expiresAt: new Date(data.createdAt + ttl * 1000),
243
+ });
244
+ },
245
+ async consumeChallenge(hash) {
246
+ const doc = await getModel().findOneAndDelete({
247
+ token: hash,
248
+ expiresAt: { $gt: new Date() },
249
+ });
250
+ if (!doc)
251
+ return null;
252
+ return {
253
+ userId: doc.userId,
254
+ purpose: doc.purpose,
255
+ emailOtpHash: doc.emailOtpHash,
256
+ webauthnChallenge: doc.webauthnChallenge,
257
+ sessionId: doc.sessionId,
258
+ createdAt: doc.createdAt.getTime(),
259
+ resendCount: doc.resendCount,
260
+ };
261
+ },
262
+ async replaceOtp(hash, newOtpHash, ttl, maxResends) {
263
+ const now = new Date();
264
+ const nowMs = now.getTime();
265
+ const doc = await getModel().findOneAndUpdate({
266
+ token: hash,
267
+ expiresAt: { $gt: now },
268
+ resendCount: { $lt: maxResends },
269
+ }, [
270
+ {
271
+ $set: {
272
+ emailOtpHash: newOtpHash,
273
+ resendCount: { $add: ['$resendCount', 1] },
274
+ expiresAt: {
275
+ $min: [new Date(nowMs + ttl * 1000), { $add: ['$createdAt', ttl * 3 * 1000] }],
276
+ },
277
+ },
278
+ },
279
+ ], { new: true, updatePipeline: true });
280
+ if (!doc)
281
+ return null;
282
+ return { userId: doc.userId, resendCount: doc.resendCount };
283
+ },
284
+ };
285
+ }
286
+ export const mfaChallengeFactories = {
287
+ memory: () => createMemoryMfaChallengeRepository(),
288
+ sqlite: infra => createSqliteMfaChallengeRepository(infra.getSqliteDb()),
289
+ redis: infra => createRedisMfaChallengeRepository(infra.getRedis, infra.appName),
290
+ mongo: infra => {
291
+ const { conn, mg } = infra.getMongo();
292
+ return createMongoMfaChallengeRepository(conn, mg);
293
+ },
294
+ postgres: () => {
295
+ throw new Error('[bunshot-auth] postgres store is not yet supported for mfaChallenge repository');
296
+ },
297
+ };
298
+ // ---------------------------------------------------------------------------
299
+ // Public API
300
+ // ---------------------------------------------------------------------------
301
+ export const createMfaChallenge = async (repo, userId, options, config) => {
302
+ const bytes = new Uint8Array(32);
303
+ crypto.getRandomValues(bytes);
304
+ const token = Buffer.from(bytes).toString('base64url');
305
+ const hash = sha256(token);
306
+ const ttl = config?.mfa?.challengeTtlSeconds ?? 300;
307
+ const now = Date.now();
308
+ await repo.createChallenge(hash, {
309
+ userId,
310
+ purpose: 'login',
311
+ emailOtpHash: options?.emailOtpHash,
312
+ webauthnChallenge: options?.webauthnChallenge,
313
+ createdAt: now,
314
+ resendCount: 0,
315
+ }, ttl);
316
+ return token;
317
+ };
318
+ export const consumeMfaChallenge = async (repo, token) => {
319
+ const hash = sha256(token);
320
+ const record = await repo.consumeChallenge(hash);
321
+ if (!record || record.purpose !== 'login')
322
+ return null;
323
+ return {
324
+ userId: record.userId,
325
+ purpose: record.purpose,
326
+ emailOtpHash: record.emailOtpHash,
327
+ webauthnChallenge: record.webauthnChallenge,
328
+ };
329
+ };
330
+ export const replaceMfaChallengeOtp = async (repo, token, newEmailOtpHash, config) => {
331
+ const hash = sha256(token);
332
+ const ttl = config?.mfa?.challengeTtlSeconds ?? 300;
333
+ return repo.replaceOtp(hash, newEmailOtpHash, ttl, MAX_RESENDS);
334
+ };
335
+ // ---------------------------------------------------------------------------
336
+ // WebAuthn registration challenge helpers
337
+ // ---------------------------------------------------------------------------
338
+ export const createWebAuthnRegistrationChallenge = async (repo, userId, challenge, config) => {
339
+ const bytes = new Uint8Array(32);
340
+ crypto.getRandomValues(bytes);
341
+ const token = Buffer.from(bytes).toString('base64url');
342
+ const hash = sha256(token);
343
+ const ttl = config?.mfa?.challengeTtlSeconds ?? 300;
344
+ await repo.createChallenge(hash, {
345
+ userId,
346
+ purpose: 'webauthn-registration',
347
+ webauthnChallenge: challenge,
348
+ createdAt: Date.now(),
349
+ resendCount: 0,
350
+ }, ttl);
351
+ return token;
352
+ };
353
+ export const consumeWebAuthnRegistrationChallenge = async (repo, token) => {
354
+ const hash = sha256(token);
355
+ const record = await repo.consumeChallenge(hash);
356
+ if (!record || record.purpose !== 'webauthn-registration' || !record.webauthnChallenge)
357
+ return null;
358
+ return { userId: record.userId, challenge: record.webauthnChallenge };
359
+ };
360
+ // ---------------------------------------------------------------------------
361
+ // Passkey login challenge helpers
362
+ // ---------------------------------------------------------------------------
363
+ const PASSKEY_LOGIN_CHALLENGE_TTL = 120;
364
+ export const createPasskeyLoginChallenge = async (repo, challenge) => {
365
+ const bytes = new Uint8Array(32);
366
+ crypto.getRandomValues(bytes);
367
+ const token = Buffer.from(bytes).toString('base64url');
368
+ const hash = sha256(token);
369
+ await repo.createChallenge(hash, {
370
+ userId: '',
371
+ purpose: 'passkey-login',
372
+ webauthnChallenge: challenge,
373
+ createdAt: Date.now(),
374
+ resendCount: 0,
375
+ }, PASSKEY_LOGIN_CHALLENGE_TTL);
376
+ return token;
377
+ };
378
+ export const consumePasskeyLoginChallenge = async (repo, token) => {
379
+ const hash = sha256(token);
380
+ const record = await repo.consumeChallenge(hash);
381
+ if (!record || record.purpose !== 'passkey-login' || !record.webauthnChallenge)
382
+ return null;
383
+ return { webauthnChallenge: record.webauthnChallenge };
384
+ };
385
+ // ---------------------------------------------------------------------------
386
+ // Reauth challenge helpers
387
+ // ---------------------------------------------------------------------------
388
+ export const createReauthChallenge = async (repo, userId, sessionId, options, config) => {
389
+ const bytes = new Uint8Array(32);
390
+ crypto.getRandomValues(bytes);
391
+ const token = Buffer.from(bytes).toString('base64url');
392
+ const hash = sha256(token);
393
+ const ttl = options?.ttlSeconds ?? config?.mfa?.challengeTtlSeconds ?? 300;
394
+ await repo.createChallenge(hash, {
395
+ userId,
396
+ purpose: 'reauth',
397
+ emailOtpHash: options?.emailOtpHash,
398
+ webauthnChallenge: options?.webauthnChallenge,
399
+ sessionId,
400
+ createdAt: Date.now(),
401
+ resendCount: 0,
402
+ }, ttl);
403
+ return token;
404
+ };
405
+ export const consumeReauthChallenge = async (repo, token, sessionId) => {
406
+ const hash = sha256(token);
407
+ const record = await repo.consumeChallenge(hash);
408
+ if (!record || record.purpose !== 'reauth')
409
+ return null;
410
+ if (!record.sessionId || !timingSafeEqual(record.sessionId, sessionId))
411
+ return null;
412
+ return {
413
+ userId: record.userId,
414
+ purpose: record.purpose,
415
+ emailOtpHash: record.emailOtpHash,
416
+ webauthnChallenge: record.webauthnChallenge,
417
+ sessionId: record.sessionId,
418
+ };
419
+ };