@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,148 @@
1
+ import { DEFAULT_MAX_ENTRIES, evictExpired, evictOldest, sha256 as hashToken, } from '../../../bunshot-core/src/index.js';
2
+ export function createMemoryResetTokenRepository() {
3
+ const tokens = new Map();
4
+ return {
5
+ async create(hash, userId, email, ttl) {
6
+ evictExpired(tokens);
7
+ evictOldest(tokens, DEFAULT_MAX_ENTRIES);
8
+ tokens.set(hash, { userId, email, 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 { userId: entry.userId, email: entry.email };
18
+ },
19
+ };
20
+ }
21
+ // ---------------------------------------------------------------------------
22
+ // SQLite repository factory
23
+ // ---------------------------------------------------------------------------
24
+ export function createSqliteResetTokenRepository(db) {
25
+ let initialized = false;
26
+ function init() {
27
+ if (initialized)
28
+ return;
29
+ db.run(`CREATE TABLE IF NOT EXISTS auth_reset_tokens (
30
+ tokenHash TEXT PRIMARY KEY,
31
+ userId TEXT NOT NULL,
32
+ email TEXT NOT NULL,
33
+ expiresAt INTEGER NOT NULL
34
+ )`);
35
+ db.run('CREATE INDEX IF NOT EXISTS idx_auth_reset_tokens_expiresAt ON auth_reset_tokens(expiresAt)');
36
+ initialized = true;
37
+ }
38
+ return {
39
+ async create(hash, userId, email, ttl) {
40
+ init();
41
+ const expiresAt = Date.now() + ttl * 1000;
42
+ db.run(`INSERT INTO auth_reset_tokens (tokenHash, userId, email, expiresAt)
43
+ VALUES (?, ?, ?, ?)
44
+ ON CONFLICT(tokenHash) DO UPDATE SET userId = excluded.userId, email = excluded.email, expiresAt = excluded.expiresAt`, [hash, userId, email, expiresAt]);
45
+ },
46
+ async consume(hash) {
47
+ init();
48
+ const now = Date.now();
49
+ const row = db
50
+ .query('SELECT userId, email FROM auth_reset_tokens WHERE tokenHash = ? AND expiresAt > ?')
51
+ .get(hash, now);
52
+ db.run('DELETE FROM auth_reset_tokens WHERE tokenHash = ?', [hash]);
53
+ if (!row)
54
+ return null;
55
+ return { userId: row.userId, email: row.email };
56
+ },
57
+ };
58
+ }
59
+ // ---------------------------------------------------------------------------
60
+ // Redis repository factory
61
+ // ---------------------------------------------------------------------------
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 createRedisResetTokenRepository(getRedis, appName) {
77
+ return {
78
+ async create(hash, userId, email, ttl) {
79
+ await getRedis().set(`reset:${appName}:${hash}`, JSON.stringify({ userId, email }), 'EX', ttl);
80
+ },
81
+ async consume(hash) {
82
+ const raw = await redisGetDel(getRedis(), `reset:${appName}:${hash}`);
83
+ if (!raw)
84
+ return null;
85
+ return JSON.parse(raw);
86
+ },
87
+ };
88
+ }
89
+ export function createMongoResetTokenRepository(conn, mg) {
90
+ function getModel() {
91
+ if (conn.models['PasswordReset'])
92
+ return conn.models['PasswordReset'];
93
+ const { Schema } = mg;
94
+ const schema = new Schema({
95
+ token: { type: String, required: true, unique: true },
96
+ userId: { type: String, required: true },
97
+ email: { type: String, required: true },
98
+ expiresAt: { type: Date, required: true, index: { expireAfterSeconds: 0 } },
99
+ }, { collection: 'password_resets' });
100
+ return conn.model('PasswordReset', schema);
101
+ }
102
+ return {
103
+ async create(hash, userId, email, ttl) {
104
+ await getModel().create({
105
+ token: hash,
106
+ userId,
107
+ email,
108
+ expiresAt: new Date(Date.now() + ttl * 1000),
109
+ });
110
+ },
111
+ async consume(hash) {
112
+ const doc = await getModel()
113
+ .findOneAndDelete({ token: hash, expiresAt: { $gt: new Date() } })
114
+ .lean();
115
+ if (!doc)
116
+ return null;
117
+ return { userId: doc.userId, email: doc.email };
118
+ },
119
+ };
120
+ }
121
+ export const resetTokenFactories = {
122
+ memory: () => createMemoryResetTokenRepository(),
123
+ sqlite: infra => createSqliteResetTokenRepository(infra.getSqliteDb()),
124
+ redis: infra => createRedisResetTokenRepository(infra.getRedis, infra.appName),
125
+ mongo: infra => {
126
+ const { conn, mg } = infra.getMongo();
127
+ return createMongoResetTokenRepository(conn, mg);
128
+ },
129
+ postgres: () => {
130
+ throw new Error('[bunshot-auth] postgres store is not yet supported for resetToken repository');
131
+ },
132
+ };
133
+ // ---------------------------------------------------------------------------
134
+ // Public API
135
+ // ---------------------------------------------------------------------------
136
+ export const createResetToken = async (repo, userId, email, config) => {
137
+ const bytes = new Uint8Array(32);
138
+ crypto.getRandomValues(bytes);
139
+ const token = Buffer.from(bytes).toString('base64url');
140
+ const hash = hashToken(token);
141
+ const ttl = config.passwordReset?.tokenExpiry ?? 3600;
142
+ await repo.create(hash, userId, email, ttl);
143
+ return token;
144
+ };
145
+ export const consumeResetToken = async (repo, token) => {
146
+ const hash = hashToken(token);
147
+ return repo.consume(hash);
148
+ };
@@ -0,0 +1,9 @@
1
+ import type { BunshotEventBus } from '../../../bunshot-core/src/index.js';
2
+ import type { AuthAdapter } from './authAdapter';
3
+ export declare const setUserRoles: (userId: string, roles: string[], changedBy?: string, adapter?: AuthAdapter, eventBus?: BunshotEventBus) => Promise<void>;
4
+ export declare const addUserRole: (userId: string, role: string, changedBy?: string, adapter?: AuthAdapter, eventBus?: BunshotEventBus) => Promise<void>;
5
+ export declare const removeUserRole: (userId: string, role: string, changedBy?: string, adapter?: AuthAdapter, eventBus?: BunshotEventBus) => Promise<void>;
6
+ export declare const getTenantRoles: (userId: string, tenantId: string, adapter?: AuthAdapter) => Promise<string[]>;
7
+ export declare const setTenantRoles: (userId: string, tenantId: string, roles: string[], changedBy?: string, adapter?: AuthAdapter, eventBus?: BunshotEventBus) => Promise<void>;
8
+ export declare const addTenantRole: (userId: string, tenantId: string, role: string, changedBy?: string, adapter?: AuthAdapter, eventBus?: BunshotEventBus) => Promise<void>;
9
+ export declare const removeTenantRole: (userId: string, tenantId: string, role: string, changedBy?: string, adapter?: AuthAdapter, eventBus?: BunshotEventBus) => Promise<void>;
@@ -0,0 +1,93 @@
1
+ const requireMethod = (method) => {
2
+ throw new Error(`Auth adapter does not implement ${method} — add it to your adapter to manage roles`);
3
+ };
4
+ export const setUserRoles = async (userId, roles, changedBy, adapter, eventBus) => {
5
+ if (!adapter)
6
+ throw new Error('Auth adapter is required');
7
+ if (!adapter.setRoles)
8
+ requireMethod('setRoles');
9
+ await adapter.setRoles(userId, roles);
10
+ eventBus?.emit('security.admin.role.changed', {
11
+ userId,
12
+ meta: { targetUserId: userId, changedBy, scope: 'app', roles, action: 'set' },
13
+ });
14
+ };
15
+ export const addUserRole = async (userId, role, changedBy, adapter, eventBus) => {
16
+ if (!adapter)
17
+ throw new Error('Auth adapter is required');
18
+ if (!adapter.addRole)
19
+ requireMethod('addRole');
20
+ await adapter.addRole(userId, role);
21
+ eventBus?.emit('security.admin.role.changed', {
22
+ userId,
23
+ meta: { targetUserId: userId, changedBy, scope: 'app', roles: [role], action: 'add' },
24
+ });
25
+ };
26
+ export const removeUserRole = async (userId, role, changedBy, adapter, eventBus) => {
27
+ if (!adapter)
28
+ throw new Error('Auth adapter is required');
29
+ if (!adapter.removeRole)
30
+ requireMethod('removeRole');
31
+ await adapter.removeRole(userId, role);
32
+ eventBus?.emit('security.admin.role.changed', {
33
+ userId,
34
+ meta: { targetUserId: userId, changedBy, scope: 'app', roles: [role], action: 'remove' },
35
+ });
36
+ };
37
+ // ---------------------------------------------------------------------------
38
+ // Tenant-scoped role helpers
39
+ // ---------------------------------------------------------------------------
40
+ export const getTenantRoles = async (userId, tenantId, adapter) => {
41
+ if (!adapter)
42
+ throw new Error('Auth adapter is required');
43
+ if (!adapter.getTenantRoles)
44
+ requireMethod('getTenantRoles');
45
+ return adapter.getTenantRoles(userId, tenantId);
46
+ };
47
+ export const setTenantRoles = async (userId, tenantId, roles, changedBy, adapter, eventBus) => {
48
+ if (!adapter)
49
+ throw new Error('Auth adapter is required');
50
+ if (!adapter.setTenantRoles)
51
+ requireMethod('setTenantRoles');
52
+ await adapter.setTenantRoles(userId, tenantId, roles);
53
+ eventBus?.emit('security.admin.role.changed', {
54
+ userId,
55
+ meta: { targetUserId: userId, changedBy, scope: 'tenant', tenantId, roles, action: 'set' },
56
+ });
57
+ };
58
+ export const addTenantRole = async (userId, tenantId, role, changedBy, adapter, eventBus) => {
59
+ if (!adapter)
60
+ throw new Error('Auth adapter is required');
61
+ if (!adapter.addTenantRole)
62
+ requireMethod('addTenantRole');
63
+ await adapter.addTenantRole(userId, tenantId, role);
64
+ eventBus?.emit('security.admin.role.changed', {
65
+ userId,
66
+ meta: {
67
+ targetUserId: userId,
68
+ changedBy,
69
+ scope: 'tenant',
70
+ tenantId,
71
+ roles: [role],
72
+ action: 'add',
73
+ },
74
+ });
75
+ };
76
+ export const removeTenantRole = async (userId, tenantId, role, changedBy, adapter, eventBus) => {
77
+ if (!adapter)
78
+ throw new Error('Auth adapter is required');
79
+ if (!adapter.removeTenantRole)
80
+ requireMethod('removeTenantRole');
81
+ await adapter.removeTenantRole(userId, tenantId, role);
82
+ eventBus?.emit('security.admin.role.changed', {
83
+ userId,
84
+ meta: {
85
+ targetUserId: userId,
86
+ changedBy,
87
+ scope: 'tenant',
88
+ tenantId,
89
+ roles: [role],
90
+ action: 'remove',
91
+ },
92
+ });
93
+ };
@@ -0,0 +1,29 @@
1
+ import type { IdentityProfile } from '../lib/authAdapter';
2
+ export interface SamlProfile {
3
+ nameId: string;
4
+ nameIdFormat?: string;
5
+ email?: string;
6
+ firstName?: string;
7
+ lastName?: string;
8
+ displayName?: string;
9
+ groups?: string[];
10
+ attributes: Record<string, string | string[]>;
11
+ }
12
+ export interface SamlAttributeMapping {
13
+ email?: string;
14
+ firstName?: string;
15
+ lastName?: string;
16
+ groups?: string;
17
+ }
18
+ export interface SamlInstances {
19
+ sp: any;
20
+ idp: any;
21
+ }
22
+ export declare function initSaml(config: import('../config/authConfig').SamlConfig): Promise<SamlInstances>;
23
+ export declare function createAuthnRequest(sp: any, idp: any): {
24
+ redirectUrl: string;
25
+ id: string;
26
+ };
27
+ export declare function validateSamlResponse(sp: any, idp: any, body: string, config: import('../config/authConfig').SamlConfig, requestId?: string): Promise<SamlProfile>;
28
+ export declare function samlProfileToIdentityProfile(profile: SamlProfile): IdentityProfile;
29
+ export declare function getSamlSpMetadata(sp: any): string;
@@ -0,0 +1,73 @@
1
+ import { isProd } from '../lib/env';
2
+ export async function initSaml(config) {
3
+ // Guard before loading the optional peer dependency so the error/warning is
4
+ // unambiguous even if samlify's own SP constructor throws.
5
+ if (config.idpMetadata.startsWith('http://')) {
6
+ if (isProd()) {
7
+ throw new Error('SAML IdP metadata URL must use HTTPS in production');
8
+ }
9
+ console.warn('[saml] WARNING: IdP metadata over HTTP — do not use in production');
10
+ }
11
+ const samlify = await import('samlify');
12
+ const sp = samlify.ServiceProvider({
13
+ entityID: config.entityId,
14
+ assertionConsumerService: [
15
+ {
16
+ Binding: samlify.Constants.BindingNamespace.Post,
17
+ Location: config.acsUrl,
18
+ },
19
+ ],
20
+ signingCert: config.signingCert,
21
+ privateKey: config.signingKey,
22
+ allowCreate: true,
23
+ });
24
+ let idp;
25
+ // Load IdP metadata
26
+ if (config.idpMetadata.startsWith('http://') || config.idpMetadata.startsWith('https://')) {
27
+ // URL — fetch it
28
+ const res = await fetch(config.idpMetadata);
29
+ const xml = await res.text();
30
+ idp = samlify.IdentityProvider({ metadata: xml });
31
+ }
32
+ else {
33
+ // XML string
34
+ idp = samlify.IdentityProvider({ metadata: config.idpMetadata });
35
+ }
36
+ return { sp, idp };
37
+ }
38
+ export function createAuthnRequest(sp, idp) {
39
+ const { id, context, entityEndpoint } = sp.createLoginRequest(idp, 'redirect');
40
+ return { redirectUrl: entityEndpoint + '?' + context, id };
41
+ }
42
+ export async function validateSamlResponse(sp, idp, body, config, requestId) {
43
+ const parseArgs = [idp, 'post', { body: { SAMLResponse: body } }];
44
+ // When requestId is provided, samlify validates InResponseTo in the SAML response
45
+ const { extract } = requestId
46
+ ? await sp.parseLoginResponse(...parseArgs, requestId)
47
+ : await sp.parseLoginResponse(...parseArgs);
48
+ const mapping = config.attributeMapping ?? {};
49
+ const attrs = extract.attributes ?? {};
50
+ const emailKey = mapping.email ?? 'email';
51
+ const firstNameKey = mapping.firstName ?? 'firstName';
52
+ const lastNameKey = mapping.lastName ?? 'lastName';
53
+ const groupsKey = mapping.groups ?? 'groups';
54
+ const nameId = extract.nameID;
55
+ const email = attrs[emailKey] ?? nameId;
56
+ const firstName = attrs[firstNameKey];
57
+ const lastName = attrs[lastNameKey];
58
+ const displayName = firstName && lastName ? `${firstName} ${lastName}` : undefined;
59
+ const rawGroups = attrs[groupsKey];
60
+ const groups = rawGroups ? (Array.isArray(rawGroups) ? rawGroups : [rawGroups]) : undefined;
61
+ return { nameId, email, firstName, lastName, displayName, groups, attributes: attrs };
62
+ }
63
+ export function samlProfileToIdentityProfile(profile) {
64
+ return {
65
+ email: profile.email,
66
+ displayName: profile.displayName,
67
+ firstName: profile.firstName,
68
+ lastName: profile.lastName,
69
+ };
70
+ }
71
+ export function getSamlSpMetadata(sp) {
72
+ return sp.getMetadata();
73
+ }
@@ -0,0 +1,13 @@
1
+ import type { RepoFactories } from '../../../bunshot-core/src/index.js';
2
+ import type { RedisLike } from '../types/redis';
3
+ export interface ISamlRequestIdRepository {
4
+ store(hash: string, ttl: number): Promise<void>;
5
+ exists(hash: string): Promise<boolean>;
6
+ }
7
+ export declare function createMemorySamlRequestIdRepository(): ISamlRequestIdRepository;
8
+ export declare function createSqliteSamlRequestIdRepository(db: import('bun:sqlite').Database): ISamlRequestIdRepository;
9
+ export declare function createRedisSamlRequestIdRepository(getRedis: () => RedisLike, appName: string): ISamlRequestIdRepository;
10
+ export declare function createMongoSamlRequestIdRepository(conn: import('mongoose').Connection, mg: typeof import('mongoose')): ISamlRequestIdRepository;
11
+ export declare const samlRequestIdFactories: RepoFactories<ISamlRequestIdRepository>;
12
+ export declare const storeSamlRequestId: (repo: ISamlRequestIdRepository, requestId: string) => Promise<void>;
13
+ export declare const consumeSamlRequestId: (repo: ISamlRequestIdRepository, requestId: string) => Promise<boolean>;
@@ -0,0 +1,129 @@
1
+ import { DEFAULT_MAX_ENTRIES, evictOldest, sha256 } from '../../../bunshot-core/src/index.js';
2
+ // ---------------------------------------------------------------------------
3
+ // Memory repository factory
4
+ // ---------------------------------------------------------------------------
5
+ export function createMemorySamlRequestIdRepository() {
6
+ const memoryStore = new Map(); // hash -> expiresAt (epoch ms)
7
+ return {
8
+ async store(hash, ttl) {
9
+ evictOldest(memoryStore, DEFAULT_MAX_ENTRIES);
10
+ memoryStore.set(hash, Date.now() + ttl * 1000);
11
+ },
12
+ async exists(hash) {
13
+ const expiresAt = memoryStore.get(hash);
14
+ if (expiresAt === undefined)
15
+ return false;
16
+ memoryStore.delete(hash);
17
+ if (Date.now() > expiresAt)
18
+ return false;
19
+ return true;
20
+ },
21
+ };
22
+ }
23
+ // ---------------------------------------------------------------------------
24
+ // SQLite repository factory
25
+ // ---------------------------------------------------------------------------
26
+ export function createSqliteSamlRequestIdRepository(db) {
27
+ let tableCreated = false;
28
+ function ensureTable() {
29
+ if (tableCreated || !db)
30
+ return;
31
+ db.run(`
32
+ CREATE TABLE IF NOT EXISTS saml_request_ids (
33
+ hash TEXT PRIMARY KEY,
34
+ expires_at INTEGER NOT NULL
35
+ )
36
+ `);
37
+ tableCreated = true;
38
+ }
39
+ return {
40
+ async store(hash, ttl) {
41
+ if (!db)
42
+ return;
43
+ ensureTable();
44
+ const expiresAt = Math.floor(Date.now() / 1000) + ttl;
45
+ db.run('INSERT OR REPLACE INTO saml_request_ids (hash, expires_at) VALUES (?, ?)', [
46
+ hash,
47
+ expiresAt,
48
+ ]);
49
+ },
50
+ async exists(hash) {
51
+ if (!db)
52
+ return false;
53
+ ensureTable();
54
+ const now = Math.floor(Date.now() / 1000);
55
+ const row = db
56
+ .query('SELECT hash FROM saml_request_ids WHERE hash = ? AND expires_at > ?')
57
+ .get(hash, now);
58
+ if (!row)
59
+ return false;
60
+ db.run('DELETE FROM saml_request_ids WHERE hash = ?', [hash]);
61
+ return true;
62
+ },
63
+ };
64
+ }
65
+ // ---------------------------------------------------------------------------
66
+ // Redis repository factory
67
+ // ---------------------------------------------------------------------------
68
+ export function createRedisSamlRequestIdRepository(getRedis, appName) {
69
+ return {
70
+ async store(hash, ttl) {
71
+ await getRedis().set(`samlreqid:${appName}:${hash}`, '1', 'EX', ttl);
72
+ },
73
+ async exists(hash) {
74
+ const key = `samlreqid:${appName}:${hash}`;
75
+ const deleted = await getRedis().del(key);
76
+ return deleted === 1;
77
+ },
78
+ };
79
+ }
80
+ export function createMongoSamlRequestIdRepository(conn, mg) {
81
+ function getModel() {
82
+ if (conn.models['SamlRequestId'])
83
+ return conn.models['SamlRequestId'];
84
+ const { Schema } = mg;
85
+ const schema = new Schema({
86
+ hash: { type: String, required: true, unique: true },
87
+ expiresAt: { type: Date, required: true, index: { expireAfterSeconds: 0 } },
88
+ }, { collection: 'saml_request_ids' });
89
+ return conn.model('SamlRequestId', schema);
90
+ }
91
+ return {
92
+ async store(hash, ttl) {
93
+ await getModel().create({
94
+ hash,
95
+ expiresAt: new Date(Date.now() + ttl * 1000),
96
+ });
97
+ },
98
+ async exists(hash) {
99
+ const doc = await getModel()
100
+ .findOneAndDelete({ hash, expiresAt: { $gt: new Date() } })
101
+ .lean();
102
+ return doc !== null;
103
+ },
104
+ };
105
+ }
106
+ export const samlRequestIdFactories = {
107
+ memory: () => createMemorySamlRequestIdRepository(),
108
+ sqlite: infra => createSqliteSamlRequestIdRepository(infra.getSqliteDb()),
109
+ redis: infra => createRedisSamlRequestIdRepository(infra.getRedis, infra.appName),
110
+ mongo: infra => {
111
+ const { conn, mg } = infra.getMongo();
112
+ return createMongoSamlRequestIdRepository(conn, mg);
113
+ },
114
+ postgres: () => {
115
+ throw new Error('[bunshot-auth] postgres store is not yet supported for samlRequestId repository');
116
+ },
117
+ };
118
+ // ---------------------------------------------------------------------------
119
+ // Public API
120
+ // ---------------------------------------------------------------------------
121
+ const REQUEST_ID_TTL = 300; // 5 minutes
122
+ export const storeSamlRequestId = async (repo, requestId) => {
123
+ const hash = sha256(requestId);
124
+ await repo.store(hash, REQUEST_ID_TTL);
125
+ };
126
+ export const consumeSamlRequestId = async (repo, requestId) => {
127
+ const hash = sha256(requestId);
128
+ return repo.exists(hash);
129
+ };
@@ -0,0 +1,44 @@
1
+ import type { UserRecord } from '../lib/authAdapter';
2
+ export interface ScimUser {
3
+ schemas: ['urn:ietf:params:scim:schemas:core:2.0:User'];
4
+ id: string;
5
+ externalId?: string;
6
+ userName: string;
7
+ displayName?: string;
8
+ name?: {
9
+ givenName?: string;
10
+ familyName?: string;
11
+ formatted?: string;
12
+ };
13
+ emails?: Array<{
14
+ value: string;
15
+ primary: boolean;
16
+ }>;
17
+ active: boolean;
18
+ meta: {
19
+ resourceType: 'User';
20
+ created?: string;
21
+ lastModified?: string;
22
+ };
23
+ }
24
+ export interface ScimListResponse {
25
+ schemas: ['urn:ietf:params:scim:api:messages:2.0:ListResponse'];
26
+ totalResults: number;
27
+ startIndex: number;
28
+ itemsPerPage: number;
29
+ Resources: ScimUser[];
30
+ }
31
+ export interface ScimError {
32
+ schemas: ['urn:ietf:params:scim:api:messages:2.0:Error'];
33
+ status: string;
34
+ detail: string;
35
+ }
36
+ export declare function userRecordToScim(user: UserRecord, config?: {
37
+ userName?: 'email' | 'username';
38
+ }): ScimUser;
39
+ /**
40
+ * Parse a simple SCIM filter string into a UserQuery object.
41
+ * Supports: userName eq "val", email eq "val", externalId eq "val", active eq true/false
42
+ */
43
+ export declare function parseScimFilter(filter?: string): import('../lib/authAdapter').UserQuery;
44
+ export declare function scimError(status: number, detail: string): Response;
@@ -0,0 +1,56 @@
1
+ export function userRecordToScim(user, config) {
2
+ const userName = user.email ?? user.id;
3
+ return {
4
+ schemas: ['urn:ietf:params:scim:schemas:core:2.0:User'],
5
+ id: user.id,
6
+ externalId: user.externalId,
7
+ userName,
8
+ displayName: user.displayName,
9
+ name: user.firstName || user.lastName
10
+ ? {
11
+ givenName: user.firstName,
12
+ familyName: user.lastName,
13
+ formatted: [user.firstName, user.lastName].filter(Boolean).join(' ') || undefined,
14
+ }
15
+ : undefined,
16
+ emails: user.email ? [{ value: user.email, primary: true }] : undefined,
17
+ active: !user.suspended,
18
+ meta: { resourceType: 'User' },
19
+ };
20
+ }
21
+ /**
22
+ * Parse a simple SCIM filter string into a UserQuery object.
23
+ * Supports: userName eq "val", email eq "val", externalId eq "val", active eq true/false
24
+ */
25
+ export function parseScimFilter(filter) {
26
+ if (!filter)
27
+ return {};
28
+ const query = {};
29
+ // Simple single-clause filter: `attr op "value"`
30
+ const match = filter.trim().match(/^(\w+)\s+eq\s+"?([^"]*)"?$/i);
31
+ if (!match)
32
+ return {};
33
+ const [, attr, value] = match;
34
+ const attrLower = attr.toLowerCase();
35
+ if (attrLower === 'username' || attrLower === 'email') {
36
+ query.email = value;
37
+ }
38
+ else if (attrLower === 'externalid') {
39
+ query.externalId = value;
40
+ }
41
+ else if (attrLower === 'active') {
42
+ query.suspended = value.toLowerCase() !== 'true'; // active=true means suspended=false
43
+ }
44
+ return query;
45
+ }
46
+ export function scimError(status, detail) {
47
+ const body = {
48
+ schemas: ['urn:ietf:params:scim:api:messages:2.0:Error'],
49
+ status: String(status),
50
+ detail,
51
+ };
52
+ return new Response(JSON.stringify(body), {
53
+ status,
54
+ headers: { 'Content-Type': 'application/scim+json' },
55
+ });
56
+ }
@@ -0,0 +1,22 @@
1
+ import type { BunshotEventBus } from '../../../bunshot-core/src/index.js';
2
+ import { type SecurityEventKey } from '../../../bunshot-core/src/index.js';
3
+ export interface SecurityEventsConfig {
4
+ onEvent: (event: SecurityEvent) => void;
5
+ onEventError?: (err: unknown) => void;
6
+ include?: SecurityEventKey[];
7
+ exclude?: SecurityEventKey[];
8
+ }
9
+ export interface SecurityEvent {
10
+ eventType: SecurityEventKey;
11
+ severity: 'info' | 'warn' | 'critical';
12
+ timestamp: string;
13
+ requestId?: string;
14
+ userId?: string;
15
+ sessionId?: string;
16
+ tenantId?: string;
17
+ ip?: string;
18
+ userAgent?: string;
19
+ meta?: Record<string, unknown>;
20
+ [key: string]: unknown;
21
+ }
22
+ export declare function wireSecurityEventConfig(bus: BunshotEventBus, cfg?: SecurityEventsConfig): void;