@lastshotlabs/bunshot 0.0.25 → 0.0.28

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (725) 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/packages/bunshot-auth/src/lib/breachedPassword.d.ts +19 -0
  68. package/dist/packages/bunshot-auth/src/lib/breachedPassword.js +61 -0
  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/packages/bunshot-auth/src/lib/logger.d.ts +3 -0
  93. package/dist/packages/bunshot-auth/src/lib/logger.js +13 -0
  94. package/dist/packages/bunshot-auth/src/lib/m2m.d.ts +30 -0
  95. package/dist/packages/bunshot-auth/src/lib/m2m.js +44 -0
  96. package/dist/packages/bunshot-auth/src/lib/magicLink.d.ts +13 -0
  97. package/dist/packages/bunshot-auth/src/lib/magicLink.js +145 -0
  98. package/dist/packages/bunshot-auth/src/lib/mfaChallenge.d.ts +60 -0
  99. package/dist/packages/bunshot-auth/src/lib/mfaChallenge.js +419 -0
  100. package/dist/packages/bunshot-auth/src/lib/oauth.d.ts +82 -0
  101. package/dist/packages/bunshot-auth/src/lib/oauth.js +177 -0
  102. package/dist/packages/bunshot-auth/src/lib/oauthCode.d.ts +19 -0
  103. package/dist/packages/bunshot-auth/src/lib/oauthCode.js +182 -0
  104. package/dist/packages/bunshot-auth/src/lib/oauthReauth.d.ts +19 -0
  105. package/dist/packages/bunshot-auth/src/lib/oauthReauth.js +255 -0
  106. package/dist/packages/bunshot-auth/src/lib/organization.d.ts +66 -0
  107. package/dist/packages/bunshot-auth/src/lib/organization.js +225 -0
  108. package/dist/packages/bunshot-auth/src/lib/passwordHistory.d.ts +12 -0
  109. package/dist/packages/bunshot-auth/src/lib/passwordHistory.js +31 -0
  110. package/dist/packages/bunshot-auth/src/lib/resetPassword.d.ts +20 -0
  111. package/dist/packages/bunshot-auth/src/lib/resetPassword.js +148 -0
  112. package/dist/packages/bunshot-auth/src/lib/roles.d.ts +9 -0
  113. package/dist/packages/bunshot-auth/src/lib/roles.js +93 -0
  114. package/dist/packages/bunshot-auth/src/lib/saml.d.ts +29 -0
  115. package/dist/packages/bunshot-auth/src/lib/saml.js +73 -0
  116. package/dist/packages/bunshot-auth/src/lib/samlRequestId.d.ts +13 -0
  117. package/dist/packages/bunshot-auth/src/lib/samlRequestId.js +129 -0
  118. package/dist/packages/bunshot-auth/src/lib/scim.d.ts +44 -0
  119. package/dist/packages/bunshot-auth/src/lib/scim.js +56 -0
  120. package/dist/packages/bunshot-auth/src/lib/securityEventWiring.d.ts +22 -0
  121. package/dist/packages/bunshot-auth/src/lib/securityEventWiring.js +65 -0
  122. package/dist/packages/bunshot-auth/src/lib/session.d.ts +45 -0
  123. package/dist/packages/bunshot-auth/src/lib/session.js +1211 -0
  124. package/dist/packages/bunshot-auth/src/lib/storeInfra.d.ts +26 -0
  125. package/dist/packages/bunshot-auth/src/lib/storeInfra.js +18 -0
  126. package/dist/packages/bunshot-auth/src/lib/suspension.d.ts +14 -0
  127. package/dist/packages/bunshot-auth/src/lib/suspension.js +20 -0
  128. package/dist/packages/bunshot-auth/src/lib/validateAdapter.d.ts +16 -0
  129. package/dist/packages/bunshot-auth/src/lib/validateAdapter.js +161 -0
  130. package/dist/packages/bunshot-auth/src/middleware/bearerAuth.d.ts +13 -0
  131. package/dist/packages/bunshot-auth/src/middleware/bearerAuth.js +58 -0
  132. package/dist/{middleware → packages/bunshot-auth/src/middleware}/csrf.d.ts +5 -4
  133. package/dist/packages/bunshot-auth/src/middleware/csrf.js +138 -0
  134. package/dist/packages/bunshot-auth/src/middleware/identify.d.ts +4 -0
  135. package/dist/packages/bunshot-auth/src/middleware/identify.js +124 -0
  136. package/dist/{middleware → packages/bunshot-auth/src/middleware}/requireMfaSetup.d.ts +2 -2
  137. package/dist/{middleware → packages/bunshot-auth/src/middleware}/requireMfaSetup.js +10 -7
  138. package/dist/{middleware → packages/bunshot-auth/src/middleware}/requireRole.d.ts +2 -2
  139. package/dist/{middleware → packages/bunshot-auth/src/middleware}/requireRole.js +20 -16
  140. package/dist/packages/bunshot-auth/src/middleware/requireScope.d.ts +10 -0
  141. package/dist/packages/bunshot-auth/src/middleware/requireScope.js +25 -0
  142. package/dist/packages/bunshot-auth/src/middleware/requireStepUp.d.ts +18 -0
  143. package/dist/packages/bunshot-auth/src/middleware/requireStepUp.js +30 -0
  144. package/dist/{middleware → packages/bunshot-auth/src/middleware}/requireVerifiedEmail.d.ts +2 -2
  145. package/dist/{middleware → packages/bunshot-auth/src/middleware}/requireVerifiedEmail.js +7 -6
  146. package/dist/packages/bunshot-auth/src/middleware/scimAuth.d.ts +8 -0
  147. package/dist/packages/bunshot-auth/src/middleware/scimAuth.js +29 -0
  148. package/dist/packages/bunshot-auth/src/middleware/userAuth.d.ts +3 -0
  149. package/dist/packages/bunshot-auth/src/middleware/userAuth.js +6 -0
  150. package/dist/{models → packages/bunshot-auth/src/models}/AuthUser.d.ts +19 -8
  151. package/dist/packages/bunshot-auth/src/models/AuthUser.js +53 -0
  152. package/dist/packages/bunshot-auth/src/models/Group.d.ts +19 -0
  153. package/dist/packages/bunshot-auth/src/models/Group.js +22 -0
  154. package/dist/{models → packages/bunshot-auth/src/models}/GroupMembership.d.ts +6 -8
  155. package/dist/packages/bunshot-auth/src/models/GroupMembership.js +19 -0
  156. package/dist/packages/bunshot-auth/src/models/M2MClient.d.ts +18 -0
  157. package/dist/packages/bunshot-auth/src/models/M2MClient.js +18 -0
  158. package/dist/packages/bunshot-auth/src/models/TenantRole.d.ts +13 -0
  159. package/dist/packages/bunshot-auth/src/models/TenantRole.js +17 -0
  160. package/dist/packages/bunshot-auth/src/plugin.d.ts +4 -0
  161. package/dist/packages/bunshot-auth/src/plugin.js +274 -0
  162. package/dist/packages/bunshot-auth/src/routes/auth.d.ts +15 -0
  163. package/dist/packages/bunshot-auth/src/routes/auth.js +1624 -0
  164. package/dist/packages/bunshot-auth/src/routes/groups.d.ts +4 -0
  165. package/dist/packages/bunshot-auth/src/routes/groups.js +481 -0
  166. package/dist/packages/bunshot-auth/src/routes/m2m.d.ts +2 -0
  167. package/dist/packages/bunshot-auth/src/routes/m2m.js +145 -0
  168. package/dist/packages/bunshot-auth/src/routes/mfa.d.ts +6 -0
  169. package/dist/packages/bunshot-auth/src/routes/mfa.js +991 -0
  170. package/dist/packages/bunshot-auth/src/routes/oauth.d.ts +3 -0
  171. package/dist/packages/bunshot-auth/src/routes/oauth.js +1727 -0
  172. package/dist/packages/bunshot-auth/src/routes/oidc.d.ts +2 -0
  173. package/dist/packages/bunshot-auth/src/routes/oidc.js +84 -0
  174. package/dist/packages/bunshot-auth/src/routes/organizations.d.ts +3 -0
  175. package/dist/packages/bunshot-auth/src/routes/organizations.js +741 -0
  176. package/dist/packages/bunshot-auth/src/routes/passkey.d.ts +2 -0
  177. package/dist/packages/bunshot-auth/src/routes/passkey.js +199 -0
  178. package/dist/packages/bunshot-auth/src/routes/saml.d.ts +2 -0
  179. package/dist/packages/bunshot-auth/src/routes/saml.js +226 -0
  180. package/dist/packages/bunshot-auth/src/routes/scim.d.ts +3 -0
  181. package/dist/packages/bunshot-auth/src/routes/scim.js +588 -0
  182. package/dist/packages/bunshot-auth/src/runtime.d.ts +52 -0
  183. package/dist/packages/bunshot-auth/src/runtime.js +11 -0
  184. package/dist/{schemas → packages/bunshot-auth/src/schemas}/auth.d.ts +4 -5
  185. package/dist/packages/bunshot-auth/src/schemas/auth.js +24 -0
  186. package/dist/packages/bunshot-auth/src/schemas/error.d.ts +10 -0
  187. package/dist/packages/bunshot-auth/src/schemas/error.js +10 -0
  188. package/dist/packages/bunshot-auth/src/schemas/success.d.ts +10 -0
  189. package/dist/packages/bunshot-auth/src/schemas/success.js +10 -0
  190. package/dist/packages/bunshot-auth/src/services/auth.d.ts +39 -0
  191. package/dist/packages/bunshot-auth/src/services/auth.js +378 -0
  192. package/dist/{services → packages/bunshot-auth/src/services}/mfa.d.ts +41 -17
  193. package/dist/{services → packages/bunshot-auth/src/services}/mfa.js +259 -183
  194. package/dist/packages/bunshot-auth/src/testing.d.ts +31 -0
  195. package/dist/packages/bunshot-auth/src/testing.js +23 -0
  196. package/dist/packages/bunshot-auth/src/types/adapter.d.ts +1 -0
  197. package/dist/packages/bunshot-auth/src/types/adapter.js +1 -0
  198. package/dist/packages/bunshot-auth/src/types/config.d.ts +152 -0
  199. package/dist/packages/bunshot-auth/src/types/config.js +179 -0
  200. package/dist/{routes → packages/bunshot-auth/src/types}/groups.d.ts +2 -3
  201. package/dist/packages/bunshot-auth/src/types/groups.js +1 -0
  202. package/dist/packages/bunshot-auth/src/types/oauthCode.d.ts +6 -0
  203. package/dist/packages/bunshot-auth/src/types/oauthCode.js +1 -0
  204. package/dist/packages/bunshot-auth/src/types/oauthReauth.d.ts +13 -0
  205. package/dist/packages/bunshot-auth/src/types/oauthReauth.js +1 -0
  206. package/dist/packages/bunshot-auth/src/types/redis.d.ts +1 -0
  207. package/dist/packages/bunshot-auth/src/types/redis.js +1 -0
  208. package/dist/packages/bunshot-auth/src/types/saml.d.ts +10 -0
  209. package/dist/packages/bunshot-auth/src/types/saml.js +1 -0
  210. package/dist/packages/bunshot-auth/src/types/session.d.ts +18 -0
  211. package/dist/packages/bunshot-auth/src/types/session.js +1 -0
  212. package/dist/packages/bunshot-auth/src/types/store.d.ts +1 -0
  213. package/dist/packages/bunshot-auth/src/types/store.js +1 -0
  214. package/dist/packages/bunshot-core/src/adminProvider.d.ts +95 -0
  215. package/dist/packages/bunshot-core/src/adminProvider.js +1 -0
  216. package/dist/packages/bunshot-core/src/auditLog.d.ts +34 -0
  217. package/dist/packages/bunshot-core/src/auditLog.js +1 -0
  218. package/dist/packages/bunshot-core/src/auth-adapter.d.ts +227 -0
  219. package/dist/packages/bunshot-core/src/auth-adapter.js +4 -0
  220. package/dist/packages/bunshot-core/src/authVariables.d.ts +14 -0
  221. package/dist/packages/bunshot-core/src/authVariables.js +4 -0
  222. package/dist/packages/bunshot-core/src/cache.d.ts +12 -0
  223. package/dist/packages/bunshot-core/src/cache.js +21 -0
  224. package/dist/packages/bunshot-core/src/captcha.d.ts +16 -0
  225. package/dist/packages/bunshot-core/src/captcha.js +1 -0
  226. package/dist/packages/bunshot-core/src/clearRegistry.d.ts +6 -0
  227. package/dist/packages/bunshot-core/src/clearRegistry.js +17 -0
  228. package/dist/packages/bunshot-core/src/clientIp.d.ts +3 -0
  229. package/dist/packages/bunshot-core/src/clientIp.js +45 -0
  230. package/dist/packages/bunshot-core/src/configLock.d.ts +4 -0
  231. package/dist/packages/bunshot-core/src/configLock.js +7 -0
  232. package/dist/packages/bunshot-core/src/configValidation.d.ts +22 -0
  233. package/dist/packages/bunshot-core/src/configValidation.js +39 -0
  234. package/dist/packages/bunshot-core/src/constants.js +10 -0
  235. package/dist/packages/bunshot-core/src/context/bunshotContext.d.ts +232 -0
  236. package/dist/packages/bunshot-core/src/context/bunshotContext.js +1 -0
  237. package/dist/packages/bunshot-core/src/context/contextAccess.d.ts +3 -0
  238. package/dist/packages/bunshot-core/src/context/contextAccess.js +16 -0
  239. package/dist/packages/bunshot-core/src/context/contextStore.d.ts +16 -0
  240. package/dist/packages/bunshot-core/src/context/contextStore.js +31 -0
  241. package/dist/packages/bunshot-core/src/context/frameworkConfig.d.ts +38 -0
  242. package/dist/packages/bunshot-core/src/context/frameworkConfig.js +1 -0
  243. package/dist/packages/bunshot-core/src/context/index.d.ts +4 -0
  244. package/dist/packages/bunshot-core/src/context/index.js +2 -0
  245. package/dist/packages/bunshot-core/src/context.d.ts +40 -0
  246. package/dist/packages/bunshot-core/src/context.js +35 -0
  247. package/dist/packages/bunshot-core/src/coreContracts.d.ts +47 -0
  248. package/dist/packages/bunshot-core/src/coreContracts.js +1 -0
  249. package/dist/packages/bunshot-core/src/coreRegistrar.d.ts +6 -0
  250. package/dist/packages/bunshot-core/src/coreRegistrar.js +42 -0
  251. package/dist/{lib → packages/bunshot-core/src}/createRoute.d.ts +4 -30
  252. package/dist/{lib → packages/bunshot-core/src}/createRoute.js +39 -88
  253. package/dist/packages/bunshot-core/src/cronRegistry.d.ts +11 -0
  254. package/dist/packages/bunshot-core/src/cronRegistry.js +1 -0
  255. package/dist/packages/bunshot-core/src/crypto.d.ts +43 -0
  256. package/dist/packages/bunshot-core/src/crypto.js +74 -0
  257. package/dist/packages/bunshot-core/src/csrf.d.ts +8 -0
  258. package/dist/packages/bunshot-core/src/csrf.js +1 -0
  259. package/dist/packages/bunshot-core/src/defaults/defaultFingerprint.d.ts +7 -0
  260. package/dist/packages/bunshot-core/src/defaults/defaultFingerprint.js +19 -0
  261. package/dist/packages/bunshot-core/src/defaults/memoryCacheAdapter.d.ts +6 -0
  262. package/dist/packages/bunshot-core/src/defaults/memoryCacheAdapter.js +40 -0
  263. package/dist/packages/bunshot-core/src/defaults/memoryRateLimit.d.ts +6 -0
  264. package/dist/packages/bunshot-core/src/defaults/memoryRateLimit.js +24 -0
  265. package/dist/packages/bunshot-core/src/emailTemplates.d.ts +5 -0
  266. package/dist/packages/bunshot-core/src/emailTemplates.js +10 -0
  267. package/dist/packages/bunshot-core/src/errors.d.ts +13 -0
  268. package/dist/packages/bunshot-core/src/errors.js +22 -0
  269. package/dist/packages/bunshot-core/src/eventBus.d.ts +270 -0
  270. package/dist/packages/bunshot-core/src/eventBus.js +143 -0
  271. package/dist/packages/bunshot-core/src/idempotency.d.ts +18 -0
  272. package/dist/packages/bunshot-core/src/idempotency.js +1 -0
  273. package/dist/packages/bunshot-core/src/index.d.ts +60 -0
  274. package/dist/packages/bunshot-core/src/index.js +34 -0
  275. package/dist/packages/bunshot-core/src/mail.d.ts +14 -0
  276. package/dist/packages/bunshot-core/src/mail.js +8 -0
  277. package/dist/packages/bunshot-core/src/memoryEviction.d.ts +24 -0
  278. package/dist/packages/bunshot-core/src/memoryEviction.js +52 -0
  279. package/dist/packages/bunshot-core/src/pagination.d.ts +45 -0
  280. package/dist/packages/bunshot-core/src/pagination.js +61 -0
  281. package/dist/packages/bunshot-core/src/permissions.d.ts +64 -0
  282. package/dist/packages/bunshot-core/src/permissions.js +27 -0
  283. package/dist/packages/bunshot-core/src/plugin.d.ts +44 -0
  284. package/dist/packages/bunshot-core/src/plugin.js +1 -0
  285. package/dist/packages/bunshot-core/src/rateLimit.d.ts +5 -0
  286. package/dist/packages/bunshot-core/src/rateLimit.js +18 -0
  287. package/dist/packages/bunshot-core/src/redis.d.ts +21 -0
  288. package/dist/packages/bunshot-core/src/redis.js +1 -0
  289. package/dist/packages/bunshot-core/src/routeAuth.d.ts +5 -0
  290. package/dist/packages/bunshot-core/src/routeAuth.js +11 -0
  291. package/dist/packages/bunshot-core/src/routeOverrides.d.ts +24 -0
  292. package/dist/packages/bunshot-core/src/routeOverrides.js +25 -0
  293. package/dist/packages/bunshot-core/src/routerAdapter.d.ts +6 -0
  294. package/dist/packages/bunshot-core/src/routerAdapter.js +56 -0
  295. package/dist/packages/bunshot-core/src/secrets.d.ts +48 -0
  296. package/dist/packages/bunshot-core/src/secrets.js +8 -0
  297. package/dist/packages/bunshot-core/src/signing.d.ts +41 -0
  298. package/dist/packages/bunshot-core/src/signing.js +1 -0
  299. package/dist/packages/bunshot-core/src/sse.d.ts +36 -0
  300. package/dist/packages/bunshot-core/src/sse.js +1 -0
  301. package/dist/packages/bunshot-core/src/storageAdapter.js +1 -0
  302. package/dist/packages/bunshot-core/src/storeInfra.d.ts +44 -0
  303. package/dist/packages/bunshot-core/src/storeInfra.js +18 -0
  304. package/dist/packages/bunshot-core/src/storeType.d.ts +7 -0
  305. package/dist/packages/bunshot-core/src/storeType.js +1 -0
  306. package/dist/packages/bunshot-core/src/testing.d.ts +1 -0
  307. package/dist/packages/bunshot-core/src/testing.js +1 -0
  308. package/dist/packages/bunshot-core/src/uploadRegistry.d.ts +23 -0
  309. package/dist/packages/bunshot-core/src/uploadRegistry.js +4 -0
  310. package/dist/packages/bunshot-core/src/userResolver.d.ts +5 -0
  311. package/dist/packages/bunshot-core/src/userResolver.js +14 -0
  312. package/dist/packages/bunshot-core/src/wsMessages.d.ts +42 -0
  313. package/dist/packages/bunshot-core/src/wsMessages.js +4 -0
  314. package/dist/packages/bunshot-permissions/src/adapters/memory.d.ts +7 -0
  315. package/dist/packages/bunshot-permissions/src/adapters/memory.js +73 -0
  316. package/dist/packages/bunshot-permissions/src/index.d.ts +10 -0
  317. package/dist/packages/bunshot-permissions/src/index.js +5 -0
  318. package/dist/packages/bunshot-permissions/src/lib/bootstrap.d.ts +7 -0
  319. package/dist/packages/bunshot-permissions/src/lib/bootstrap.js +12 -0
  320. package/dist/packages/bunshot-permissions/src/lib/evaluator.d.ts +10 -0
  321. package/dist/packages/bunshot-permissions/src/lib/evaluator.js +165 -0
  322. package/dist/packages/bunshot-permissions/src/lib/registry.d.ts +2 -0
  323. package/dist/packages/bunshot-permissions/src/lib/registry.js +31 -0
  324. package/dist/packages/bunshot-permissions/src/lib/validation.d.ts +1 -0
  325. package/dist/packages/bunshot-permissions/src/lib/validation.js +1 -0
  326. package/dist/packages/bunshot-permissions/src/types/adapter.d.ts +1 -0
  327. package/dist/packages/bunshot-permissions/src/types/adapter.js +1 -0
  328. package/dist/packages/bunshot-permissions/src/types/evaluator.d.ts +1 -0
  329. package/dist/packages/bunshot-permissions/src/types/evaluator.js +1 -0
  330. package/dist/packages/bunshot-permissions/src/types/models.d.ts +1 -0
  331. package/dist/packages/bunshot-permissions/src/types/models.js +1 -0
  332. package/dist/packages/bunshot-permissions/src/types/registry.d.ts +1 -0
  333. package/dist/packages/bunshot-permissions/src/types/registry.js +1 -0
  334. package/dist/packages/bunshot-postgres/src/adapter.d.ts +6 -0
  335. package/dist/packages/bunshot-postgres/src/adapter.js +794 -0
  336. package/dist/packages/bunshot-postgres/src/connection.d.ts +15 -0
  337. package/dist/packages/bunshot-postgres/src/connection.js +16 -0
  338. package/dist/packages/bunshot-postgres/src/index.d.ts +4 -0
  339. package/dist/packages/bunshot-postgres/src/index.js +2 -0
  340. package/dist/packages/bunshot-postgres/src/schema.d.ts +997 -0
  341. package/dist/packages/bunshot-postgres/src/schema.js +105 -0
  342. package/dist/src/app.d.ts +230 -0
  343. package/dist/src/app.js +182 -0
  344. package/dist/src/cli/commands/init.d.ts +10 -0
  345. package/dist/src/cli/commands/init.js +709 -0
  346. package/dist/src/cli/index.d.ts +1 -0
  347. package/dist/src/cli/index.js +3 -0
  348. package/dist/src/entrypoints/mongo.d.ts +6 -0
  349. package/dist/src/entrypoints/mongo.js +4 -0
  350. package/dist/src/entrypoints/queue.d.ts +2 -0
  351. package/dist/src/entrypoints/queue.js +1 -0
  352. package/dist/src/entrypoints/redis.d.ts +1 -0
  353. package/dist/src/entrypoints/redis.js +1 -0
  354. package/dist/{adapters → src/framework/adapters}/localStorage.d.ts +1 -1
  355. package/dist/{adapters → src/framework/adapters}/localStorage.js +23 -8
  356. package/dist/src/framework/adapters/memoryStorage.d.ts +2 -0
  357. package/dist/src/framework/adapters/memoryStorage.js +45 -0
  358. package/dist/{adapters → src/framework/adapters}/s3Storage.d.ts +1 -1
  359. package/dist/{adapters → src/framework/adapters}/s3Storage.js +12 -12
  360. package/dist/src/framework/admin/bunshotAccess.d.ts +2 -0
  361. package/dist/src/framework/admin/bunshotAccess.js +23 -0
  362. package/dist/src/framework/admin/bunshotUsers.d.ts +2 -0
  363. package/dist/src/framework/admin/bunshotUsers.js +103 -0
  364. package/dist/src/framework/admin/index.d.ts +7 -0
  365. package/dist/src/framework/admin/index.js +21 -0
  366. package/dist/src/framework/boundaryAdapters/cacheFactories.d.ts +13 -0
  367. package/dist/src/framework/boundaryAdapters/cacheFactories.js +86 -0
  368. package/dist/src/framework/boundaryAdapters/index.d.ts +2 -0
  369. package/dist/src/framework/boundaryAdapters/index.js +1 -0
  370. package/dist/src/framework/boundaryAdapters.d.ts +17 -0
  371. package/dist/src/framework/boundaryAdapters.js +62 -0
  372. package/dist/src/framework/buildContext.d.ts +33 -0
  373. package/dist/src/framework/buildContext.js +119 -0
  374. package/dist/src/framework/config/schema.d.ts +447 -0
  375. package/dist/src/framework/config/schema.js +528 -0
  376. package/dist/src/framework/createInfrastructure.d.ts +76 -0
  377. package/dist/src/framework/createInfrastructure.js +221 -0
  378. package/dist/src/framework/lib/auditLog.d.ts +23 -0
  379. package/dist/src/framework/lib/auditLog.js +416 -0
  380. package/dist/src/framework/lib/captcha.d.ts +11 -0
  381. package/dist/src/framework/lib/captcha.js +40 -0
  382. package/dist/{lib → src/framework/lib}/createDtoMapper.js +4 -4
  383. package/dist/src/framework/lib/createRoute.d.ts +1 -0
  384. package/dist/src/framework/lib/createRoute.js +2 -0
  385. package/dist/{lib → src/framework/lib}/idempotency.d.ts +2 -6
  386. package/dist/src/framework/lib/idempotency.js +74 -0
  387. package/dist/src/framework/lib/logger.d.ts +3 -0
  388. package/dist/src/framework/lib/logger.js +14 -0
  389. package/dist/src/framework/lib/metrics.d.ts +34 -0
  390. package/dist/{lib → src/framework/lib}/metrics.js +49 -57
  391. package/dist/src/framework/lib/pagination.d.ts +42 -0
  392. package/dist/src/framework/lib/pagination.js +51 -0
  393. package/dist/src/framework/lib/redisTransport.d.ts +38 -0
  394. package/dist/src/framework/lib/redisTransport.js +107 -0
  395. package/dist/src/framework/lib/resolveUserId.d.ts +2 -0
  396. package/dist/src/framework/lib/resolveUserId.js +5 -0
  397. package/dist/src/framework/lib/sseCollision.d.ts +6 -0
  398. package/dist/src/framework/lib/sseCollision.js +26 -0
  399. package/dist/src/framework/lib/storageAdapter.d.ts +1 -0
  400. package/dist/src/framework/lib/storageAdapter.js +1 -0
  401. package/dist/{lib → src/framework/lib}/stripUnreferencedSchemas.js +4 -4
  402. package/dist/src/framework/lib/tenant.d.ts +21 -0
  403. package/dist/src/framework/lib/tenant.js +70 -0
  404. package/dist/{lib → src/framework/lib}/upload.d.ts +14 -9
  405. package/dist/src/framework/lib/upload.js +132 -0
  406. package/dist/src/framework/lib/uploadRegistry.d.ts +23 -0
  407. package/dist/src/framework/lib/uploadRegistry.js +34 -0
  408. package/dist/{lib → src/framework/lib}/validate.d.ts +1 -1
  409. package/dist/{lib → src/framework/lib}/validate.js +2 -2
  410. package/dist/src/framework/lib/ws.d.ts +19 -0
  411. package/dist/src/framework/lib/ws.js +130 -0
  412. package/dist/src/framework/lib/wsHeartbeat.d.ts +12 -0
  413. package/dist/src/framework/lib/wsHeartbeat.js +53 -0
  414. package/dist/src/framework/lib/wsMessages.d.ts +25 -0
  415. package/dist/src/framework/lib/wsMessages.js +45 -0
  416. package/dist/src/framework/lib/wsNamespace.d.ts +17 -0
  417. package/dist/src/framework/lib/wsNamespace.js +19 -0
  418. package/dist/src/framework/lib/wsPresence.d.ts +17 -0
  419. package/dist/src/framework/lib/wsPresence.js +84 -0
  420. package/dist/src/framework/lib/wsTransport.d.ts +38 -0
  421. package/dist/src/framework/lib/wsTransport.js +9 -0
  422. package/dist/{lib → src/framework/lib}/zodToMongoose.d.ts +1 -1
  423. package/dist/{lib → src/framework/lib}/zodToMongoose.js +11 -11
  424. package/dist/{middleware → src/framework/middleware}/auditLog.d.ts +4 -3
  425. package/dist/src/framework/middleware/auditLog.js +42 -0
  426. package/dist/{middleware → src/framework/middleware}/botProtection.d.ts +2 -2
  427. package/dist/{middleware → src/framework/middleware}/botProtection.js +8 -9
  428. package/dist/src/framework/middleware/cacheResponse.d.ts +35 -0
  429. package/dist/src/framework/middleware/cacheResponse.js +126 -0
  430. package/dist/src/framework/middleware/captcha.d.ts +9 -0
  431. package/dist/src/framework/middleware/captcha.js +37 -0
  432. package/dist/{middleware → src/framework/middleware}/errorHandler.d.ts +1 -1
  433. package/dist/src/framework/middleware/errorHandler.js +16 -0
  434. package/dist/src/framework/middleware/index.js +1 -0
  435. package/dist/{middleware → src/framework/middleware}/logger.d.ts +1 -1
  436. package/dist/src/framework/middleware/metrics.d.ts +12 -0
  437. package/dist/src/framework/middleware/metrics.js +26 -0
  438. package/dist/{middleware → src/framework/middleware}/rateLimit.d.ts +2 -2
  439. package/dist/src/framework/middleware/rateLimit.js +22 -0
  440. package/dist/src/framework/middleware/requestId.d.ts +3 -0
  441. package/dist/{middleware → src/framework/middleware}/requestId.js +2 -2
  442. package/dist/{middleware → src/framework/middleware}/requestLogger.d.ts +3 -3
  443. package/dist/{middleware → src/framework/middleware}/requestLogger.js +17 -12
  444. package/dist/{middleware → src/framework/middleware}/requestSigning.d.ts +2 -2
  445. package/dist/{middleware → src/framework/middleware}/requestSigning.js +18 -19
  446. package/dist/src/framework/middleware/tenant.d.ts +14 -0
  447. package/dist/{middleware → src/framework/middleware}/tenant.js +31 -27
  448. package/dist/src/framework/middleware/upload.d.ts +5 -0
  449. package/dist/{middleware → src/framework/middleware}/upload.js +4 -4
  450. package/dist/{middleware → src/framework/middleware}/webhookAuth.d.ts +3 -3
  451. package/dist/{middleware → src/framework/middleware}/webhookAuth.js +11 -11
  452. package/dist/src/framework/models/AuditLog.d.ts +21 -0
  453. package/dist/src/framework/models/AuditLog.js +31 -0
  454. package/dist/src/framework/mountMiddleware.d.ts +91 -0
  455. package/dist/src/framework/mountMiddleware.js +128 -0
  456. package/dist/src/framework/mountOptionalEndpoints.d.ts +103 -0
  457. package/dist/src/framework/mountOptionalEndpoints.js +47 -0
  458. package/dist/src/framework/mountRoutes.d.ts +21 -0
  459. package/dist/src/framework/mountRoutes.js +144 -0
  460. package/dist/src/framework/persistence/cronRegistry.d.ts +28 -0
  461. package/dist/src/framework/persistence/cronRegistry.js +139 -0
  462. package/dist/src/framework/persistence/idempotency.d.ts +26 -0
  463. package/dist/src/framework/persistence/idempotency.js +178 -0
  464. package/dist/src/framework/persistence/index.d.ts +6 -0
  465. package/dist/src/framework/persistence/index.js +8 -0
  466. package/dist/src/framework/persistence/storeInfra.d.ts +9 -0
  467. package/dist/src/framework/persistence/storeInfra.js +1 -0
  468. package/dist/src/framework/persistence/uploadRegistry.d.ts +35 -0
  469. package/dist/src/framework/persistence/uploadRegistry.js +235 -0
  470. package/dist/src/framework/persistence/wsMessages.d.ts +22 -0
  471. package/dist/src/framework/persistence/wsMessages.js +296 -0
  472. package/dist/src/framework/preloadSchemas.d.ts +24 -0
  473. package/dist/src/framework/preloadSchemas.js +42 -0
  474. package/dist/src/framework/registerBoundaryAdapters.d.ts +23 -0
  475. package/dist/src/framework/registerBoundaryAdapters.js +46 -0
  476. package/dist/src/framework/routes/admin.d.ts +9 -0
  477. package/dist/src/framework/routes/admin.js +361 -0
  478. package/dist/src/framework/routes/health.d.ts +1 -0
  479. package/dist/src/framework/routes/health.js +21 -0
  480. package/dist/src/framework/routes/home.d.ts +1 -0
  481. package/dist/src/framework/routes/home.js +18 -0
  482. package/dist/src/framework/routes/jobs.d.ts +3 -0
  483. package/dist/src/framework/routes/jobs.js +315 -0
  484. package/dist/src/framework/routes/metrics.d.ts +10 -0
  485. package/dist/src/framework/routes/metrics.js +57 -0
  486. package/dist/src/framework/routes/uploads.d.ts +14 -0
  487. package/dist/src/framework/routes/uploads.js +262 -0
  488. package/dist/src/framework/runPluginLifecycle.d.ts +27 -0
  489. package/dist/src/framework/runPluginLifecycle.js +121 -0
  490. package/dist/src/framework/secrets/frameworkSecretSchema.d.ts +58 -0
  491. package/dist/src/framework/secrets/frameworkSecretSchema.js +20 -0
  492. package/dist/src/framework/secrets/index.d.ts +9 -0
  493. package/dist/src/framework/secrets/index.js +7 -0
  494. package/dist/src/framework/secrets/providers/envProvider.d.ts +15 -0
  495. package/dist/src/framework/secrets/providers/envProvider.js +18 -0
  496. package/dist/src/framework/secrets/providers/fileProvider.d.ts +8 -0
  497. package/dist/src/framework/secrets/providers/fileProvider.js +82 -0
  498. package/dist/src/framework/secrets/providers/ssmProvider.d.ts +20 -0
  499. package/dist/src/framework/secrets/providers/ssmProvider.js +127 -0
  500. package/dist/src/framework/secrets/resolveSecretBundle.d.ts +53 -0
  501. package/dist/src/framework/secrets/resolveSecretBundle.js +84 -0
  502. package/dist/src/framework/secrets/resolveSecrets.d.ts +18 -0
  503. package/dist/src/framework/secrets/resolveSecrets.js +34 -0
  504. package/dist/src/framework/sse/index.d.ts +21 -0
  505. package/dist/src/framework/sse/index.js +109 -0
  506. package/dist/src/framework/ws/index.d.ts +11 -0
  507. package/dist/src/framework/ws/index.js +8 -0
  508. package/dist/src/index.d.ts +87 -0
  509. package/dist/src/index.js +58 -0
  510. package/dist/src/lib/appConfig.d.ts +7 -0
  511. package/dist/src/lib/appConfig.js +27 -0
  512. package/dist/src/lib/appMeta.d.ts +7 -0
  513. package/dist/src/lib/appMeta.js +3 -0
  514. package/dist/src/lib/authConfig.d.ts +532 -0
  515. package/dist/src/lib/authConfig.js +179 -0
  516. package/dist/{lib → src/lib}/context.d.ts +6 -7
  517. package/dist/{lib → src/lib}/context.js +5 -5
  518. package/dist/src/lib/logger.d.ts +1 -0
  519. package/dist/src/lib/logger.js +1 -0
  520. package/dist/src/lib/mongo.d.ts +58 -0
  521. package/dist/src/lib/mongo.js +96 -0
  522. package/dist/src/lib/queue.d.ts +72 -0
  523. package/dist/src/lib/queue.js +152 -0
  524. package/dist/src/lib/redis.d.ts +28 -0
  525. package/dist/src/lib/redis.js +72 -0
  526. package/dist/{lib → src/lib}/signing.d.ts +2 -2
  527. package/dist/src/lib/signing.js +210 -0
  528. package/dist/src/lib/signingConfig.d.ts +40 -0
  529. package/dist/src/lib/signingConfig.js +28 -0
  530. package/dist/src/server.d.ts +146 -0
  531. package/dist/src/server.js +469 -0
  532. package/dist/src/shared/lib/HttpError.d.ts +1 -0
  533. package/dist/src/shared/lib/HttpError.js +2 -0
  534. package/dist/src/shared/lib/constants.d.ts +10 -0
  535. package/dist/src/shared/lib/crypto.d.ts +43 -0
  536. package/dist/src/shared/lib/crypto.js +74 -0
  537. package/dist/src/shared/lib/signing.d.ts +52 -0
  538. package/dist/{lib → src/shared/lib}/signing.js +40 -10
  539. package/dist/src/testing.d.ts +34 -0
  540. package/dist/src/testing.js +93 -0
  541. package/package.json +62 -25
  542. package/dist/adapters/memoryAuth.d.ts +0 -46
  543. package/dist/adapters/memoryAuth.js +0 -634
  544. package/dist/adapters/memoryStorage.d.ts +0 -3
  545. package/dist/adapters/memoryStorage.js +0 -44
  546. package/dist/adapters/mongoAuth.d.ts +0 -2
  547. package/dist/adapters/mongoAuth.js +0 -307
  548. package/dist/adapters/sqliteAuth.d.ts +0 -49
  549. package/dist/adapters/sqliteAuth.js +0 -707
  550. package/dist/app.d.ts +0 -456
  551. package/dist/app.js +0 -548
  552. package/dist/entrypoints/mongo.d.ts +0 -5
  553. package/dist/entrypoints/mongo.js +0 -4
  554. package/dist/entrypoints/queue.d.ts +0 -2
  555. package/dist/entrypoints/queue.js +0 -1
  556. package/dist/entrypoints/redis.d.ts +0 -1
  557. package/dist/entrypoints/redis.js +0 -1
  558. package/dist/index.d.ts +0 -98
  559. package/dist/index.js +0 -77
  560. package/dist/lib/HttpError.d.ts +0 -9
  561. package/dist/lib/HttpError.js +0 -14
  562. package/dist/lib/appConfig.d.ts +0 -162
  563. package/dist/lib/appConfig.js +0 -83
  564. package/dist/lib/auditLog.d.ts +0 -52
  565. package/dist/lib/auditLog.js +0 -201
  566. package/dist/lib/authAdapter.d.ts +0 -176
  567. package/dist/lib/authAdapter.js +0 -7
  568. package/dist/lib/authRateLimit.d.ts +0 -13
  569. package/dist/lib/authRateLimit.js +0 -81
  570. package/dist/lib/clientIp.d.ts +0 -14
  571. package/dist/lib/crypto.d.ts +0 -11
  572. package/dist/lib/crypto.js +0 -22
  573. package/dist/lib/deletionCancelToken.d.ts +0 -12
  574. package/dist/lib/deletionCancelToken.js +0 -88
  575. package/dist/lib/emailVerification.d.ts +0 -13
  576. package/dist/lib/emailVerification.js +0 -86
  577. package/dist/lib/fingerprint.js +0 -36
  578. package/dist/lib/idempotency.js +0 -182
  579. package/dist/lib/jwt.d.ts +0 -2
  580. package/dist/lib/jwt.js +0 -24
  581. package/dist/lib/logger.d.ts +0 -1
  582. package/dist/lib/logger.js +0 -7
  583. package/dist/lib/metrics.d.ts +0 -14
  584. package/dist/lib/mfaChallenge.d.ts +0 -42
  585. package/dist/lib/mfaChallenge.js +0 -293
  586. package/dist/lib/mongo.d.ts +0 -39
  587. package/dist/lib/mongo.js +0 -124
  588. package/dist/lib/oauth.d.ts +0 -40
  589. package/dist/lib/oauth.js +0 -101
  590. package/dist/lib/oauthCode.d.ts +0 -15
  591. package/dist/lib/oauthCode.js +0 -90
  592. package/dist/lib/pagination.d.ts +0 -119
  593. package/dist/lib/pagination.js +0 -166
  594. package/dist/lib/queue.d.ts +0 -37
  595. package/dist/lib/queue.js +0 -117
  596. package/dist/lib/redis.d.ts +0 -9
  597. package/dist/lib/redis.js +0 -61
  598. package/dist/lib/resetPassword.d.ts +0 -12
  599. package/dist/lib/resetPassword.js +0 -91
  600. package/dist/lib/roles.d.ts +0 -7
  601. package/dist/lib/roles.js +0 -49
  602. package/dist/lib/session.d.ts +0 -39
  603. package/dist/lib/session.js +0 -535
  604. package/dist/lib/tenant.d.ts +0 -15
  605. package/dist/lib/tenant.js +0 -65
  606. package/dist/lib/upload.js +0 -87
  607. package/dist/lib/ws.d.ts +0 -22
  608. package/dist/lib/ws.js +0 -89
  609. package/dist/lib/wsHeartbeat.d.ts +0 -12
  610. package/dist/lib/wsHeartbeat.js +0 -57
  611. package/dist/lib/wsMessages.d.ts +0 -40
  612. package/dist/lib/wsMessages.js +0 -330
  613. package/dist/lib/wsPresence.d.ts +0 -25
  614. package/dist/lib/wsPresence.js +0 -99
  615. package/dist/middleware/auditLog.js +0 -39
  616. package/dist/middleware/bearerAuth.d.ts +0 -2
  617. package/dist/middleware/bearerAuth.js +0 -11
  618. package/dist/middleware/cacheResponse.d.ts +0 -15
  619. package/dist/middleware/cacheResponse.js +0 -178
  620. package/dist/middleware/csrf.js +0 -125
  621. package/dist/middleware/errorHandler.js +0 -13
  622. package/dist/middleware/identify.d.ts +0 -3
  623. package/dist/middleware/identify.js +0 -95
  624. package/dist/middleware/index.js +0 -1
  625. package/dist/middleware/metrics.d.ts +0 -9
  626. package/dist/middleware/metrics.js +0 -26
  627. package/dist/middleware/rateLimit.js +0 -22
  628. package/dist/middleware/requestId.d.ts +0 -3
  629. package/dist/middleware/tenant.d.ts +0 -5
  630. package/dist/middleware/upload.d.ts +0 -5
  631. package/dist/middleware/userAuth.d.ts +0 -3
  632. package/dist/middleware/userAuth.js +0 -6
  633. package/dist/models/AuditLog.d.ts +0 -30
  634. package/dist/models/AuditLog.js +0 -39
  635. package/dist/models/AuthUser.js +0 -48
  636. package/dist/models/Group.d.ts +0 -21
  637. package/dist/models/Group.js +0 -28
  638. package/dist/models/GroupMembership.js +0 -25
  639. package/dist/models/TenantRole.d.ts +0 -15
  640. package/dist/models/TenantRole.js +0 -23
  641. package/dist/routes/auth.d.ts +0 -11
  642. package/dist/routes/auth.js +0 -605
  643. package/dist/routes/groups.js +0 -346
  644. package/dist/routes/health.d.ts +0 -1
  645. package/dist/routes/health.js +0 -22
  646. package/dist/routes/home.d.ts +0 -1
  647. package/dist/routes/home.js +0 -16
  648. package/dist/routes/jobs.d.ts +0 -2
  649. package/dist/routes/jobs.js +0 -272
  650. package/dist/routes/metrics.d.ts +0 -7
  651. package/dist/routes/metrics.js +0 -52
  652. package/dist/routes/mfa.d.ts +0 -5
  653. package/dist/routes/mfa.js +0 -620
  654. package/dist/routes/oauth.d.ts +0 -2
  655. package/dist/routes/oauth.js +0 -514
  656. package/dist/routes/uploads.d.ts +0 -2
  657. package/dist/routes/uploads.js +0 -135
  658. package/dist/schemas/auth.js +0 -30
  659. package/dist/server.d.ts +0 -57
  660. package/dist/server.js +0 -112
  661. package/dist/services/auth.d.ts +0 -27
  662. package/dist/services/auth.js +0 -159
  663. package/dist/ws/index.d.ts +0 -10
  664. package/dist/ws/index.js +0 -38
  665. package/docs/sections/adding-middleware/full.md +0 -35
  666. package/docs/sections/adding-models/full.md +0 -125
  667. package/docs/sections/adding-models/overview.md +0 -13
  668. package/docs/sections/adding-routes/full.md +0 -182
  669. package/docs/sections/adding-routes/overview.md +0 -23
  670. package/docs/sections/auth-flow/full.md +0 -779
  671. package/docs/sections/auth-flow/overview.md +0 -10
  672. package/docs/sections/auth-security-examples/full.md +0 -365
  673. package/docs/sections/authentication/full.md +0 -130
  674. package/docs/sections/authentication/overview.md +0 -5
  675. package/docs/sections/cli/full.md +0 -42
  676. package/docs/sections/configuration/full.md +0 -172
  677. package/docs/sections/configuration/overview.md +0 -18
  678. package/docs/sections/configuration-example/full.md +0 -117
  679. package/docs/sections/configuration-example/overview.md +0 -30
  680. package/docs/sections/documentation/full.md +0 -171
  681. package/docs/sections/environment-variables/full.md +0 -55
  682. package/docs/sections/exports/full.md +0 -123
  683. package/docs/sections/extending-context/full.md +0 -59
  684. package/docs/sections/header.md +0 -3
  685. package/docs/sections/installation/full.md +0 -6
  686. package/docs/sections/jobs/full.md +0 -140
  687. package/docs/sections/jobs/overview.md +0 -15
  688. package/docs/sections/logging/full.md +0 -83
  689. package/docs/sections/metrics/full.md +0 -127
  690. package/docs/sections/mongodb-connections/full.md +0 -45
  691. package/docs/sections/mongodb-connections/overview.md +0 -7
  692. package/docs/sections/multi-tenancy/full.md +0 -66
  693. package/docs/sections/multi-tenancy/overview.md +0 -15
  694. package/docs/sections/oauth/full.md +0 -189
  695. package/docs/sections/oauth/overview.md +0 -16
  696. package/docs/sections/package-development/full.md +0 -7
  697. package/docs/sections/pagination/full.md +0 -93
  698. package/docs/sections/peer-dependencies/full.md +0 -47
  699. package/docs/sections/quick-start/full.md +0 -43
  700. package/docs/sections/response-caching/full.md +0 -117
  701. package/docs/sections/response-caching/overview.md +0 -13
  702. package/docs/sections/roles/full.md +0 -225
  703. package/docs/sections/roles/overview.md +0 -14
  704. package/docs/sections/running-without-redis/full.md +0 -16
  705. package/docs/sections/running-without-redis-or-mongodb/full.md +0 -60
  706. package/docs/sections/signing/full.md +0 -203
  707. package/docs/sections/stack/full.md +0 -10
  708. package/docs/sections/uploads/full.md +0 -199
  709. package/docs/sections/versioning/full.md +0 -85
  710. package/docs/sections/webhook-auth/full.md +0 -100
  711. package/docs/sections/websocket/full.md +0 -184
  712. package/docs/sections/websocket/overview.md +0 -5
  713. package/docs/sections/websocket-rooms/full.md +0 -102
  714. package/docs/sections/websocket-rooms/overview.md +0 -5
  715. /package/dist/{lib/storageAdapter.js → packages/bunshot-admin/src/types/env.js} +0 -0
  716. /package/dist/{lib → packages/bunshot-auth/src/lib}/fingerprint.d.ts +0 -0
  717. /package/dist/{lib → packages/bunshot-core/src}/constants.d.ts +0 -0
  718. /package/dist/{lib → packages/bunshot-core/src}/storageAdapter.d.ts +0 -0
  719. /package/dist/{lib → src/framework/lib}/createDtoMapper.d.ts +0 -0
  720. /package/dist/{lib → src/framework/lib}/stripUnreferencedSchemas.d.ts +0 -0
  721. /package/dist/{middleware → src/framework/middleware}/cors.d.ts +0 -0
  722. /package/dist/{middleware → src/framework/middleware}/cors.js +0 -0
  723. /package/dist/{middleware → src/framework/middleware}/index.d.ts +0 -0
  724. /package/dist/{middleware → src/framework/middleware}/logger.js +0 -0
  725. /package/dist/{lib → src/shared/lib}/constants.js +0 -0
@@ -0,0 +1,255 @@
1
+ import { DEFAULT_MAX_ENTRIES, evictExpired, evictOldest, sha256 } from '../../../bunshot-core/src/index.js';
2
+ export function createMemoryOAuthReauthRepository() {
3
+ const states = new Map();
4
+ const confirmations = new Map();
5
+ return {
6
+ async storeState(hash, data, ttl) {
7
+ evictExpired(states);
8
+ evictOldest(states, DEFAULT_MAX_ENTRIES);
9
+ states.set(hash, { data, expiresAt: Date.now() + ttl * 1000 });
10
+ },
11
+ async consumeState(hash) {
12
+ const entry = states.get(hash);
13
+ if (!entry || entry.expiresAt <= Date.now()) {
14
+ states.delete(hash);
15
+ return null;
16
+ }
17
+ states.delete(hash);
18
+ return entry.data;
19
+ },
20
+ async storeConfirmation(hash, data, ttl) {
21
+ evictExpired(confirmations);
22
+ evictOldest(confirmations, DEFAULT_MAX_ENTRIES);
23
+ confirmations.set(hash, { data, expiresAt: Date.now() + ttl * 1000 });
24
+ },
25
+ async consumeConfirmation(hash) {
26
+ const entry = confirmations.get(hash);
27
+ if (!entry || entry.expiresAt <= Date.now()) {
28
+ confirmations.delete(hash);
29
+ return null;
30
+ }
31
+ confirmations.delete(hash);
32
+ return entry.data;
33
+ },
34
+ };
35
+ }
36
+ // ---------------------------------------------------------------------------
37
+ // SQLite repository factory
38
+ // ---------------------------------------------------------------------------
39
+ export function createSqliteOAuthReauthRepository(db) {
40
+ let initialized = false;
41
+ function init() {
42
+ if (initialized)
43
+ return;
44
+ db.run(`CREATE TABLE IF NOT EXISTS auth_oauth_reauth_states (
45
+ tokenHash TEXT PRIMARY KEY,
46
+ data TEXT NOT NULL,
47
+ expiresAt INTEGER NOT NULL
48
+ )`);
49
+ db.run('CREATE INDEX IF NOT EXISTS idx_auth_oauth_reauth_states_expiresAt ON auth_oauth_reauth_states(expiresAt)');
50
+ db.run(`CREATE TABLE IF NOT EXISTS auth_oauth_reauth_confirmations (
51
+ codeHash TEXT PRIMARY KEY,
52
+ data TEXT NOT NULL,
53
+ expiresAt INTEGER NOT NULL
54
+ )`);
55
+ db.run('CREATE INDEX IF NOT EXISTS idx_auth_oauth_reauth_confirmations_expiresAt ON auth_oauth_reauth_confirmations(expiresAt)');
56
+ initialized = true;
57
+ }
58
+ return {
59
+ async storeState(hash, data, ttl) {
60
+ init();
61
+ const expiresAt = Date.now() + ttl * 1000;
62
+ db.run(`INSERT INTO auth_oauth_reauth_states (tokenHash, data, expiresAt)
63
+ VALUES (?, ?, ?)
64
+ ON CONFLICT(tokenHash) DO UPDATE SET data = excluded.data, expiresAt = excluded.expiresAt`, [hash, JSON.stringify(data), expiresAt]);
65
+ },
66
+ async consumeState(hash) {
67
+ init();
68
+ const now = Date.now();
69
+ const row = db
70
+ .query('SELECT data FROM auth_oauth_reauth_states WHERE tokenHash = ? AND expiresAt > ?')
71
+ .get(hash, now);
72
+ db.run('DELETE FROM auth_oauth_reauth_states WHERE tokenHash = ?', [hash]);
73
+ if (!row)
74
+ return null;
75
+ return JSON.parse(row.data);
76
+ },
77
+ async storeConfirmation(hash, data, ttl) {
78
+ init();
79
+ const expiresAt = Date.now() + ttl * 1000;
80
+ db.run(`INSERT INTO auth_oauth_reauth_confirmations (codeHash, data, expiresAt)
81
+ VALUES (?, ?, ?)
82
+ ON CONFLICT(codeHash) DO UPDATE SET data = excluded.data, expiresAt = excluded.expiresAt`, [hash, JSON.stringify(data), expiresAt]);
83
+ },
84
+ async consumeConfirmation(hash) {
85
+ init();
86
+ const now = Date.now();
87
+ const row = db
88
+ .query('SELECT data FROM auth_oauth_reauth_confirmations WHERE codeHash = ? AND expiresAt > ?')
89
+ .get(hash, now);
90
+ db.run('DELETE FROM auth_oauth_reauth_confirmations WHERE codeHash = ?', [hash]);
91
+ if (!row)
92
+ return null;
93
+ return JSON.parse(row.data);
94
+ },
95
+ };
96
+ }
97
+ // ---------------------------------------------------------------------------
98
+ // Redis helpers
99
+ // ---------------------------------------------------------------------------
100
+ /** Atomically GET+DEL a key. Uses native GETDEL (Redis >= 6.2) with a Lua fallback. */
101
+ async function redisGetDel(redis, key) {
102
+ if (typeof redis.getdel === 'function') {
103
+ try {
104
+ return await redis.getdel(key);
105
+ }
106
+ catch (err) {
107
+ const msg = err?.message ?? '';
108
+ if (!/unknown command|ERR unknown command/i.test(msg))
109
+ throw err;
110
+ }
111
+ }
112
+ 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);
113
+ return result ?? null;
114
+ }
115
+ // ---------------------------------------------------------------------------
116
+ // Redis repository factory
117
+ // ---------------------------------------------------------------------------
118
+ export function createRedisOAuthReauthRepository(getRedis, appName) {
119
+ return {
120
+ async storeState(hash, data, ttl) {
121
+ await getRedis().set(`oauthreauth:${appName}:${hash}`, JSON.stringify(data), 'EX', ttl);
122
+ },
123
+ async consumeState(hash) {
124
+ const key = `oauthreauth:${appName}:${hash}`;
125
+ const raw = await redisGetDel(getRedis(), key);
126
+ if (!raw)
127
+ return null;
128
+ return JSON.parse(raw);
129
+ },
130
+ async storeConfirmation(hash, data, ttl) {
131
+ await getRedis().set(`oauthreauthconf:${appName}:${hash}`, JSON.stringify(data), 'EX', ttl);
132
+ },
133
+ async consumeConfirmation(hash) {
134
+ const key = `oauthreauthconf:${appName}:${hash}`;
135
+ const raw = await redisGetDel(getRedis(), key);
136
+ if (!raw)
137
+ return null;
138
+ return JSON.parse(raw);
139
+ },
140
+ };
141
+ }
142
+ export function createMongoOAuthReauthRepository(conn, mg) {
143
+ function getReauthModel() {
144
+ if (conn.models['OAuthReauth'])
145
+ return conn.models['OAuthReauth'];
146
+ const { Schema } = mg;
147
+ const schema = new Schema({
148
+ tokenHash: { type: String, required: true, unique: true },
149
+ userId: { type: String, required: true },
150
+ sessionId: { type: String, required: true },
151
+ provider: { type: String, required: true },
152
+ purpose: { type: String, required: true },
153
+ returnUrl: { type: String },
154
+ expiresAt: { type: Date, required: true, index: { expireAfterSeconds: 0 } },
155
+ }, { collection: 'oauth_reauth_states' });
156
+ return conn.model('OAuthReauth', schema);
157
+ }
158
+ function getConfirmationModel() {
159
+ if (conn.models['OAuthReauthConfirmation'])
160
+ return conn.models['OAuthReauthConfirmation'];
161
+ const { Schema } = mg;
162
+ const schema = new Schema({
163
+ codeHash: { type: String, required: true, unique: true },
164
+ userId: { type: String, required: true },
165
+ purpose: { type: String, required: true },
166
+ expiresAt: { type: Date, required: true, index: { expireAfterSeconds: 0 } },
167
+ }, { collection: 'oauth_reauth_confirmations' });
168
+ return conn.model('OAuthReauthConfirmation', schema);
169
+ }
170
+ return {
171
+ async storeState(hash, data, ttl) {
172
+ await getReauthModel().create({
173
+ tokenHash: hash,
174
+ userId: data.userId,
175
+ sessionId: data.sessionId,
176
+ provider: data.provider,
177
+ purpose: data.purpose,
178
+ returnUrl: data.returnUrl,
179
+ expiresAt: new Date(Date.now() + ttl * 1000),
180
+ });
181
+ },
182
+ async consumeState(hash) {
183
+ const doc = await getReauthModel()
184
+ .findOneAndDelete({ tokenHash: hash, expiresAt: { $gt: new Date() } })
185
+ .lean();
186
+ if (!doc)
187
+ return null;
188
+ return {
189
+ userId: doc.userId,
190
+ sessionId: doc.sessionId,
191
+ provider: doc.provider,
192
+ purpose: doc.purpose,
193
+ expiresAt: doc.expiresAt.getTime(),
194
+ returnUrl: doc.returnUrl,
195
+ };
196
+ },
197
+ async storeConfirmation(hash, data, ttl) {
198
+ await getConfirmationModel().create({
199
+ codeHash: hash,
200
+ userId: data.userId,
201
+ purpose: data.purpose,
202
+ expiresAt: new Date(Date.now() + ttl * 1000),
203
+ });
204
+ },
205
+ async consumeConfirmation(hash) {
206
+ const doc = await getConfirmationModel()
207
+ .findOneAndDelete({ codeHash: hash, expiresAt: { $gt: new Date() } })
208
+ .lean();
209
+ if (!doc)
210
+ return null;
211
+ return { userId: doc.userId, purpose: doc.purpose };
212
+ },
213
+ };
214
+ }
215
+ export const oauthReauthFactories = {
216
+ memory: () => createMemoryOAuthReauthRepository(),
217
+ sqlite: infra => createSqliteOAuthReauthRepository(infra.getSqliteDb()),
218
+ redis: infra => createRedisOAuthReauthRepository(infra.getRedis, infra.appName),
219
+ mongo: infra => {
220
+ const { conn, mg } = infra.getMongo();
221
+ return createMongoOAuthReauthRepository(conn, mg);
222
+ },
223
+ postgres: () => {
224
+ throw new Error('[bunshot-auth] postgres store is not yet supported for oauthReauth repository');
225
+ },
226
+ };
227
+ // ---------------------------------------------------------------------------
228
+ // Public API
229
+ // ---------------------------------------------------------------------------
230
+ const REAUTH_TTL = 300; // 5 minutes — matches OAuth state TTL
231
+ const CONFIRMATION_TTL = 300; // 5 minutes
232
+ export const createReauthState = async (repo, data) => {
233
+ const bytes = new Uint8Array(32);
234
+ crypto.getRandomValues(bytes);
235
+ const token = Buffer.from(bytes).toString('base64url');
236
+ const hash = sha256(token);
237
+ await repo.storeState(hash, data, REAUTH_TTL);
238
+ return token;
239
+ };
240
+ export const consumeReauthState = async (repo, token) => {
241
+ const hash = sha256(token);
242
+ return repo.consumeState(hash);
243
+ };
244
+ export const storeReauthConfirmation = async (repo, data) => {
245
+ const bytes = new Uint8Array(32);
246
+ crypto.getRandomValues(bytes);
247
+ const code = Buffer.from(bytes).toString('base64url');
248
+ const hash = sha256(code);
249
+ await repo.storeConfirmation(hash, data, CONFIRMATION_TTL);
250
+ return code;
251
+ };
252
+ export const consumeReauthConfirmation = async (repo, code) => {
253
+ const hash = sha256(code);
254
+ return repo.consumeConfirmation(hash);
255
+ };
@@ -0,0 +1,66 @@
1
+ export interface Organization {
2
+ id: string;
3
+ name: string;
4
+ slug: string;
5
+ tenantId?: string;
6
+ createdAt: Date;
7
+ metadata?: Record<string, unknown>;
8
+ }
9
+ export interface OrgMembership {
10
+ orgId: string;
11
+ userId: string;
12
+ roles: string[];
13
+ joinedAt: Date;
14
+ invitedBy?: string;
15
+ }
16
+ export interface OrgInvitation {
17
+ id: string;
18
+ orgId: string;
19
+ email: string;
20
+ roles: string[];
21
+ /** SHA-256 hashed token — never returned to client. The raw token is sent to the user. */
22
+ token: string;
23
+ expiresAt: Date;
24
+ invitedBy: string;
25
+ }
26
+ export interface OrganizationConfig {
27
+ enabled: boolean;
28
+ /** Role given to members added directly (not via invitation). Default: none. */
29
+ defaultMemberRole?: string;
30
+ /** Default invitation TTL in seconds. Default: 604800 (7 days). */
31
+ invitationTtlSeconds?: number;
32
+ }
33
+ export interface OrgService {
34
+ createOrg(data: {
35
+ name: string;
36
+ slug: string;
37
+ tenantId?: string;
38
+ metadata?: Record<string, unknown>;
39
+ }): Promise<Organization>;
40
+ getOrg(orgId: string): Promise<Organization | null>;
41
+ getOrgBySlug(slug: string): Promise<Organization | null>;
42
+ listOrgs(opts?: {
43
+ limit?: number;
44
+ cursor?: string;
45
+ }): Promise<{
46
+ orgs: Organization[];
47
+ nextCursor?: string;
48
+ }>;
49
+ updateOrg(orgId: string, data: Partial<Pick<Organization, 'name' | 'metadata'>>): Promise<Organization | null>;
50
+ deleteOrg(orgId: string): Promise<void>;
51
+ addOrgMember(orgId: string, userId: string, roles?: string[], invitedBy?: string): Promise<OrgMembership>;
52
+ removeOrgMember(orgId: string, userId: string): Promise<void>;
53
+ getOrgMembers(orgId: string): Promise<OrgMembership[]>;
54
+ getUserOrgs(userId: string): Promise<Organization[]>;
55
+ updateOrgMemberRoles(orgId: string, userId: string, roles: string[]): Promise<void>;
56
+ createOrgInvitation(orgId: string, email: string, roles: string[], invitedBy: string, ttlSeconds?: number): Promise<{
57
+ invitation: OrgInvitation;
58
+ token: string;
59
+ }>;
60
+ consumeOrgInvitation(token: string): Promise<OrgInvitation | null>;
61
+ listOrgInvitations(orgId: string): Promise<OrgInvitation[]>;
62
+ revokeOrgInvitation(invitationId: string): Promise<void>;
63
+ getDefaultInvitationTtl(): number;
64
+ getOrgConfig(): OrganizationConfig;
65
+ }
66
+ export declare function createOrgService(config: OrganizationConfig): OrgService;
@@ -0,0 +1,225 @@
1
+ import { randomUUID } from 'crypto';
2
+ import { DEFAULT_MAX_ENTRIES, evictOldest, sha256 } from '../../../bunshot-core/src/index.js';
3
+ // ---------------------------------------------------------------------------
4
+ // Factory
5
+ // ---------------------------------------------------------------------------
6
+ const DEFAULT_INVITATION_TTL = 7 * 24 * 60 * 60; // 7 days in seconds
7
+ export function createOrgService(config) {
8
+ const _orgs = new Map(); // orgId -> Org
9
+ const _orgBySlug = new Map(); // slug -> orgId
10
+ const _memberships = new Map(); // "orgId:userId" -> membership
11
+ const _invitations = new Map(); // invitationId -> invitation
12
+ const _tokenIndex = new Map(); // hashedToken -> invitationId
13
+ function memberKey(orgId, userId) {
14
+ return `${orgId}:${userId}`;
15
+ }
16
+ // Purge expired invitations from both _invitations and _tokenIndex together
17
+ // so the two maps stay in sync. Called before each new invitation is stored.
18
+ function sweepExpiredInvitations() {
19
+ const now = new Date();
20
+ for (const [id, inv] of _invitations) {
21
+ if (inv.expiresAt < now) {
22
+ _tokenIndex.delete(inv.token);
23
+ _invitations.delete(id);
24
+ }
25
+ }
26
+ }
27
+ // Evict the oldest invitation from both _invitations and _tokenIndex together.
28
+ function evictOldestInvitation() {
29
+ const id = _invitations.keys().next().value;
30
+ if (id === undefined)
31
+ return;
32
+ const inv = _invitations.get(id);
33
+ _tokenIndex.delete(inv.token);
34
+ _invitations.delete(id);
35
+ }
36
+ return {
37
+ async createOrg(data) {
38
+ if (_orgBySlug.has(data.slug)) {
39
+ throw new Error(`Organization with slug "${data.slug}" already exists`);
40
+ }
41
+ const org = {
42
+ id: randomUUID(),
43
+ name: data.name,
44
+ slug: data.slug,
45
+ tenantId: data.tenantId,
46
+ createdAt: new Date(),
47
+ metadata: data.metadata,
48
+ };
49
+ evictOldest(_orgs, DEFAULT_MAX_ENTRIES);
50
+ _orgs.set(org.id, org);
51
+ _orgBySlug.set(org.slug, org.id);
52
+ return org;
53
+ },
54
+ async getOrg(orgId) {
55
+ return _orgs.get(orgId) ?? null;
56
+ },
57
+ async getOrgBySlug(slug) {
58
+ const orgId = _orgBySlug.get(slug);
59
+ if (!orgId)
60
+ return null;
61
+ return _orgs.get(orgId) ?? null;
62
+ },
63
+ async listOrgs(opts) {
64
+ const all = Array.from(_orgs.values()).sort((a, b) => a.createdAt.getTime() - b.createdAt.getTime() || a.id.localeCompare(b.id));
65
+ const limit = opts?.limit ?? 50;
66
+ let filtered = all;
67
+ if (opts?.cursor) {
68
+ try {
69
+ const c = JSON.parse(atob(opts.cursor));
70
+ filtered = all.filter(o => o.createdAt.getTime() > c.createdAt ||
71
+ (o.createdAt.getTime() === c.createdAt && o.id > c.id));
72
+ }
73
+ catch {
74
+ /* invalid cursor — start from beginning */
75
+ }
76
+ }
77
+ const page = filtered.slice(0, limit);
78
+ const nextCursor = filtered.length > limit
79
+ ? btoa(JSON.stringify({
80
+ createdAt: page[page.length - 1].createdAt.getTime(),
81
+ id: page[page.length - 1].id,
82
+ }))
83
+ : undefined;
84
+ return { orgs: page, nextCursor };
85
+ },
86
+ async updateOrg(orgId, data) {
87
+ const org = _orgs.get(orgId);
88
+ if (!org)
89
+ return null;
90
+ if (data.name !== undefined)
91
+ org.name = data.name;
92
+ if (data.metadata !== undefined)
93
+ org.metadata = data.metadata;
94
+ return org;
95
+ },
96
+ async deleteOrg(orgId) {
97
+ const org = _orgs.get(orgId);
98
+ if (!org)
99
+ return;
100
+ // Cascade: remove all memberships for this org
101
+ for (const [key, m] of _memberships) {
102
+ if (m.orgId === orgId)
103
+ _memberships.delete(key);
104
+ }
105
+ // Cascade: remove all pending invitations for this org (and their token indices)
106
+ for (const [id, inv] of _invitations) {
107
+ if (inv.orgId === orgId) {
108
+ _tokenIndex.delete(inv.token);
109
+ _invitations.delete(id);
110
+ }
111
+ }
112
+ _orgBySlug.delete(org.slug);
113
+ _orgs.delete(orgId);
114
+ },
115
+ async addOrgMember(orgId, userId, roles = [], invitedBy) {
116
+ const key = memberKey(orgId, userId);
117
+ if (_memberships.has(key)) {
118
+ throw new Error(`User "${userId}" is already a member of org "${orgId}"`);
119
+ }
120
+ const membership = {
121
+ orgId,
122
+ userId,
123
+ roles,
124
+ joinedAt: new Date(),
125
+ invitedBy,
126
+ };
127
+ evictOldest(_memberships, DEFAULT_MAX_ENTRIES);
128
+ _memberships.set(key, membership);
129
+ return membership;
130
+ },
131
+ async removeOrgMember(orgId, userId) {
132
+ _memberships.delete(memberKey(orgId, userId));
133
+ },
134
+ async getOrgMembers(orgId) {
135
+ const result = [];
136
+ for (const m of _memberships.values()) {
137
+ if (m.orgId === orgId)
138
+ result.push(m);
139
+ }
140
+ return result;
141
+ },
142
+ async getUserOrgs(userId) {
143
+ const orgs = [];
144
+ for (const m of _memberships.values()) {
145
+ if (m.userId === userId) {
146
+ const org = _orgs.get(m.orgId);
147
+ if (org)
148
+ orgs.push(org);
149
+ }
150
+ }
151
+ return orgs;
152
+ },
153
+ async updateOrgMemberRoles(orgId, userId, roles) {
154
+ const key = memberKey(orgId, userId);
155
+ const m = _memberships.get(key);
156
+ if (m) {
157
+ m.roles = roles;
158
+ }
159
+ },
160
+ async createOrgInvitation(orgId, email, roles, invitedBy, ttlSeconds) {
161
+ const rawToken = randomUUID();
162
+ const hashedToken = sha256(rawToken);
163
+ const ttl = ttlSeconds ?? config.invitationTtlSeconds ?? DEFAULT_INVITATION_TTL;
164
+ const invitation = {
165
+ id: randomUUID(),
166
+ orgId,
167
+ email,
168
+ roles,
169
+ token: hashedToken,
170
+ expiresAt: new Date(Date.now() + ttl * 1000),
171
+ invitedBy,
172
+ };
173
+ sweepExpiredInvitations();
174
+ while (_invitations.size >= DEFAULT_MAX_ENTRIES) {
175
+ evictOldestInvitation();
176
+ }
177
+ _invitations.set(invitation.id, invitation);
178
+ _tokenIndex.set(hashedToken, invitation.id);
179
+ return { invitation, token: rawToken };
180
+ },
181
+ async consumeOrgInvitation(token) {
182
+ const hashedToken = sha256(token);
183
+ const invitationId = _tokenIndex.get(hashedToken);
184
+ if (!invitationId)
185
+ return null;
186
+ const invitation = _invitations.get(invitationId);
187
+ if (!invitation)
188
+ return null;
189
+ // Check expiry
190
+ if (invitation.expiresAt < new Date()) {
191
+ // Clean up expired invitation
192
+ _tokenIndex.delete(hashedToken);
193
+ _invitations.delete(invitationId);
194
+ return null;
195
+ }
196
+ // Single-use: remove from store
197
+ _tokenIndex.delete(hashedToken);
198
+ _invitations.delete(invitationId);
199
+ return invitation;
200
+ },
201
+ async listOrgInvitations(orgId) {
202
+ const result = [];
203
+ const now = new Date();
204
+ for (const inv of _invitations.values()) {
205
+ if (inv.orgId === orgId && inv.expiresAt > now) {
206
+ result.push(inv);
207
+ }
208
+ }
209
+ return result;
210
+ },
211
+ async revokeOrgInvitation(invitationId) {
212
+ const inv = _invitations.get(invitationId);
213
+ if (!inv)
214
+ return;
215
+ _tokenIndex.delete(inv.token);
216
+ _invitations.delete(invitationId);
217
+ },
218
+ getDefaultInvitationTtl() {
219
+ return config.invitationTtlSeconds ?? DEFAULT_INVITATION_TTL;
220
+ },
221
+ getOrgConfig() {
222
+ return config;
223
+ },
224
+ };
225
+ }
@@ -0,0 +1,12 @@
1
+ import type { AuthAdapter } from '../lib/authAdapter';
2
+ /**
3
+ * Check whether a plaintext password matches any of the stored history hashes.
4
+ * Returns true if the password is NOT reused (safe to use), false if it was found in history.
5
+ * Skips the check if the adapter does not implement getPasswordHistory.
6
+ */
7
+ export declare function checkPasswordNotReused(adapter: AuthAdapter, userId: string, newPasswordPlaintext: string, maxCount: number): Promise<boolean>;
8
+ /**
9
+ * Record a newly-set password hash into the user's password history.
10
+ * No-op if the adapter does not implement addPasswordToHistory.
11
+ */
12
+ export declare function recordPasswordChange(adapter: AuthAdapter, userId: string, newHash: string, maxCount: number): Promise<void>;
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Check whether a plaintext password matches any of the stored history hashes.
3
+ * Returns true if the password is NOT reused (safe to use), false if it was found in history.
4
+ * Skips the check if the adapter does not implement getPasswordHistory.
5
+ */
6
+ export async function checkPasswordNotReused(adapter, userId, newPasswordPlaintext, maxCount) {
7
+ if (maxCount <= 0)
8
+ return true;
9
+ if (!adapter.getPasswordHistory)
10
+ return true;
11
+ const history = await adapter.getPasswordHistory(userId);
12
+ if (history.length === 0)
13
+ return true;
14
+ for (const hash of history) {
15
+ if (await Bun.password.verify(newPasswordPlaintext, hash)) {
16
+ return false; // reused
17
+ }
18
+ }
19
+ return true; // not reused
20
+ }
21
+ /**
22
+ * Record a newly-set password hash into the user's password history.
23
+ * No-op if the adapter does not implement addPasswordToHistory.
24
+ */
25
+ export async function recordPasswordChange(adapter, userId, newHash, maxCount) {
26
+ if (maxCount <= 0)
27
+ return;
28
+ if (!adapter.addPasswordToHistory)
29
+ return;
30
+ await adapter.addPasswordToHistory(userId, newHash, maxCount);
31
+ }
@@ -0,0 +1,20 @@
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 interface IResetTokenRepository {
5
+ create(hash: string, userId: string, email: string, ttl: number): Promise<void>;
6
+ consume(hash: string): Promise<{
7
+ userId: string;
8
+ email: string;
9
+ } | null>;
10
+ }
11
+ export declare function createMemoryResetTokenRepository(): IResetTokenRepository;
12
+ export declare function createSqliteResetTokenRepository(db: import('bun:sqlite').Database): IResetTokenRepository;
13
+ export declare function createRedisResetTokenRepository(getRedis: () => RedisLike, appName: string): IResetTokenRepository;
14
+ export declare function createMongoResetTokenRepository(conn: import('mongoose').Connection, mg: typeof import('mongoose')): IResetTokenRepository;
15
+ export declare const resetTokenFactories: RepoFactories<IResetTokenRepository>;
16
+ export declare const createResetToken: (repo: IResetTokenRepository, userId: string, email: string, config: AuthResolvedConfig) => Promise<string>;
17
+ export declare const consumeResetToken: (repo: IResetTokenRepository, token: string) => Promise<{
18
+ userId: string;
19
+ email: string;
20
+ } | null>;