@lastshotlabs/bunshot 0.0.27 → 0.0.28

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (742) hide show
  1. package/.oclif.manifest.json +39 -0
  2. package/README.md +8282 -2147
  3. package/dist/cli/commands/init.js +690 -0
  4. package/dist/cli/index.js +6 -0
  5. package/dist/cli.js +4 -4
  6. package/dist/packages/bunshot-admin/src/index.d.ts +15 -0
  7. package/dist/packages/bunshot-admin/src/index.js +11 -0
  8. package/dist/packages/bunshot-admin/src/lib/resourceTypes.d.ts +8 -0
  9. package/dist/packages/bunshot-admin/src/lib/resourceTypes.js +33 -0
  10. package/dist/packages/bunshot-admin/src/lib/typedRoute.d.ts +14 -0
  11. package/dist/packages/bunshot-admin/src/lib/typedRoute.js +17 -0
  12. package/dist/packages/bunshot-admin/src/plugin.d.ts +4 -0
  13. package/dist/packages/bunshot-admin/src/plugin.js +46 -0
  14. package/dist/packages/bunshot-admin/src/providers/auth0Access.d.ts +6 -0
  15. package/dist/packages/bunshot-admin/src/providers/auth0Access.js +32 -0
  16. package/dist/packages/bunshot-admin/src/routes/admin.d.ts +10 -0
  17. package/dist/packages/bunshot-admin/src/routes/admin.js +923 -0
  18. package/dist/packages/bunshot-admin/src/routes/mail.d.ts +6 -0
  19. package/dist/packages/bunshot-admin/src/routes/mail.js +114 -0
  20. package/dist/packages/bunshot-admin/src/routes/permissions.d.ts +8 -0
  21. package/dist/packages/bunshot-admin/src/routes/permissions.js +315 -0
  22. package/dist/packages/bunshot-admin/src/types/config.d.ts +16 -0
  23. package/dist/packages/bunshot-admin/src/types/config.js +37 -0
  24. package/dist/packages/bunshot-admin/src/types/env.d.ts +14 -0
  25. package/dist/packages/bunshot-admin/src/types/provider.d.ts +1 -0
  26. package/dist/packages/bunshot-admin/src/types/provider.js +4 -0
  27. package/dist/packages/bunshot-auth/src/adapters/memoryAuth.d.ts +66 -0
  28. package/dist/packages/bunshot-auth/src/adapters/memoryAuth.js +1063 -0
  29. package/dist/packages/bunshot-auth/src/adapters/mongoAuth.d.ts +2 -0
  30. package/dist/packages/bunshot-auth/src/adapters/mongoAuth.js +536 -0
  31. package/dist/packages/bunshot-auth/src/adapters/sqliteAuth.d.ts +88 -0
  32. package/dist/packages/bunshot-auth/src/adapters/sqliteAuth.js +1366 -0
  33. package/dist/packages/bunshot-auth/src/admin/bunshotAccess.d.ts +2 -0
  34. package/dist/packages/bunshot-auth/src/admin/bunshotAccess.js +23 -0
  35. package/dist/packages/bunshot-auth/src/admin/bunshotUsers.d.ts +5 -0
  36. package/dist/packages/bunshot-auth/src/admin/bunshotUsers.js +131 -0
  37. package/dist/packages/bunshot-auth/src/bootstrap.d.ts +38 -0
  38. package/dist/packages/bunshot-auth/src/bootstrap.js +384 -0
  39. package/dist/packages/bunshot-auth/src/config/appConfig.d.ts +3 -0
  40. package/dist/packages/bunshot-auth/src/config/appConfig.js +4 -0
  41. package/dist/packages/bunshot-auth/src/config/authConfig.d.ts +478 -0
  42. package/dist/packages/bunshot-auth/src/config/authConfig.js +46 -0
  43. package/dist/packages/bunshot-auth/src/config/configLock.d.ts +2 -0
  44. package/dist/packages/bunshot-auth/src/config/configLock.js +10 -0
  45. package/dist/packages/bunshot-auth/src/index.d.ts +25 -0
  46. package/dist/packages/bunshot-auth/src/index.js +23 -0
  47. package/dist/packages/bunshot-auth/src/infra/mongo.d.ts +15 -0
  48. package/dist/packages/bunshot-auth/src/infra/mongo.js +44 -0
  49. package/dist/packages/bunshot-auth/src/infra/queue.d.ts +14 -0
  50. package/dist/packages/bunshot-auth/src/infra/queue.js +27 -0
  51. package/dist/packages/bunshot-auth/src/infra/redis.d.ts +5 -0
  52. package/dist/packages/bunshot-auth/src/infra/redis.js +15 -0
  53. package/dist/packages/bunshot-auth/src/infra/signing.d.ts +7 -0
  54. package/dist/packages/bunshot-auth/src/infra/signing.js +8 -0
  55. package/dist/packages/bunshot-auth/src/lib/accountLockout.d.ts +34 -0
  56. package/dist/packages/bunshot-auth/src/lib/accountLockout.js +244 -0
  57. package/dist/packages/bunshot-auth/src/lib/adapterTiers.d.ts +1 -0
  58. package/dist/packages/bunshot-auth/src/lib/adapterTiers.js +1 -0
  59. package/dist/packages/bunshot-auth/src/lib/authAdapter.d.ts +1 -0
  60. package/dist/packages/bunshot-auth/src/lib/authAdapter.js +1 -0
  61. package/dist/packages/bunshot-auth/src/lib/authContext.d.ts +15 -0
  62. package/dist/packages/bunshot-auth/src/lib/authContext.js +1 -0
  63. package/dist/packages/bunshot-auth/src/lib/authEventBus.d.ts +4 -0
  64. package/dist/packages/bunshot-auth/src/lib/authEventBus.js +15 -0
  65. package/dist/packages/bunshot-auth/src/lib/authRateLimit.d.ts +28 -0
  66. package/dist/packages/bunshot-auth/src/lib/authRateLimit.js +205 -0
  67. package/dist/{lib → packages/bunshot-auth/src/lib}/breachedPassword.d.ts +8 -2
  68. package/dist/{lib → packages/bunshot-auth/src/lib}/breachedPassword.js +22 -9
  69. package/dist/packages/bunshot-auth/src/lib/cache.d.ts +12 -0
  70. package/dist/packages/bunshot-auth/src/lib/cache.js +120 -0
  71. package/dist/packages/bunshot-auth/src/lib/clientIp.d.ts +4 -0
  72. package/dist/{lib → packages/bunshot-auth/src/lib}/clientIp.js +14 -7
  73. package/dist/packages/bunshot-auth/src/lib/cookieOptions.d.ts +27 -0
  74. package/dist/packages/bunshot-auth/src/lib/cookieOptions.js +33 -0
  75. package/dist/packages/bunshot-auth/src/lib/credentialStuffing.d.ts +40 -0
  76. package/dist/packages/bunshot-auth/src/lib/credentialStuffing.js +221 -0
  77. package/dist/packages/bunshot-auth/src/lib/deletionCancelToken.d.ts +19 -0
  78. package/dist/packages/bunshot-auth/src/lib/deletionCancelToken.js +148 -0
  79. package/dist/packages/bunshot-auth/src/lib/emailTemplates.d.ts +23 -0
  80. package/dist/packages/bunshot-auth/src/lib/emailTemplates.js +265 -0
  81. package/dist/packages/bunshot-auth/src/lib/emailVerification.d.ts +30 -0
  82. package/dist/packages/bunshot-auth/src/lib/emailVerification.js +200 -0
  83. package/dist/packages/bunshot-auth/src/lib/env.d.ts +1 -0
  84. package/dist/packages/bunshot-auth/src/lib/env.js +3 -0
  85. package/dist/packages/bunshot-auth/src/lib/fingerprint.js +36 -0
  86. package/dist/{lib → packages/bunshot-auth/src/lib}/groups.d.ts +15 -16
  87. package/dist/{lib → packages/bunshot-auth/src/lib}/groups.js +22 -34
  88. package/dist/packages/bunshot-auth/src/lib/jwks.d.ts +28 -0
  89. package/dist/packages/bunshot-auth/src/lib/jwks.js +79 -0
  90. package/dist/packages/bunshot-auth/src/lib/jwt.d.ts +12 -0
  91. package/dist/packages/bunshot-auth/src/lib/jwt.js +86 -0
  92. package/dist/{lib → packages/bunshot-auth/src/lib}/logger.js +3 -3
  93. package/dist/{lib → packages/bunshot-auth/src/lib}/m2m.d.ts +5 -4
  94. package/dist/{lib → packages/bunshot-auth/src/lib}/m2m.js +6 -10
  95. package/dist/packages/bunshot-auth/src/lib/magicLink.d.ts +13 -0
  96. package/dist/packages/bunshot-auth/src/lib/magicLink.js +145 -0
  97. package/dist/packages/bunshot-auth/src/lib/mfaChallenge.d.ts +60 -0
  98. package/dist/packages/bunshot-auth/src/lib/mfaChallenge.js +419 -0
  99. package/dist/packages/bunshot-auth/src/lib/oauth.d.ts +82 -0
  100. package/dist/packages/bunshot-auth/src/lib/oauth.js +177 -0
  101. package/dist/packages/bunshot-auth/src/lib/oauthCode.d.ts +19 -0
  102. package/dist/packages/bunshot-auth/src/lib/oauthCode.js +182 -0
  103. package/dist/packages/bunshot-auth/src/lib/oauthReauth.d.ts +19 -0
  104. package/dist/packages/bunshot-auth/src/lib/oauthReauth.js +255 -0
  105. package/dist/packages/bunshot-auth/src/lib/organization.d.ts +66 -0
  106. package/dist/packages/bunshot-auth/src/lib/organization.js +225 -0
  107. package/dist/packages/bunshot-auth/src/lib/passwordHistory.d.ts +12 -0
  108. package/dist/packages/bunshot-auth/src/lib/passwordHistory.js +31 -0
  109. package/dist/packages/bunshot-auth/src/lib/resetPassword.d.ts +20 -0
  110. package/dist/packages/bunshot-auth/src/lib/resetPassword.js +148 -0
  111. package/dist/packages/bunshot-auth/src/lib/roles.d.ts +9 -0
  112. package/dist/packages/bunshot-auth/src/lib/roles.js +93 -0
  113. package/dist/packages/bunshot-auth/src/lib/saml.d.ts +29 -0
  114. package/dist/packages/bunshot-auth/src/lib/saml.js +73 -0
  115. package/dist/packages/bunshot-auth/src/lib/samlRequestId.d.ts +13 -0
  116. package/dist/packages/bunshot-auth/src/lib/samlRequestId.js +129 -0
  117. package/dist/{lib → packages/bunshot-auth/src/lib}/scim.d.ts +7 -7
  118. package/dist/{lib → packages/bunshot-auth/src/lib}/scim.js +15 -13
  119. package/dist/packages/bunshot-auth/src/lib/securityEventWiring.d.ts +22 -0
  120. package/dist/packages/bunshot-auth/src/lib/securityEventWiring.js +65 -0
  121. package/dist/packages/bunshot-auth/src/lib/session.d.ts +45 -0
  122. package/dist/packages/bunshot-auth/src/lib/session.js +1211 -0
  123. package/dist/packages/bunshot-auth/src/lib/storeInfra.d.ts +26 -0
  124. package/dist/packages/bunshot-auth/src/lib/storeInfra.js +18 -0
  125. package/dist/{lib → packages/bunshot-auth/src/lib}/suspension.d.ts +3 -2
  126. package/dist/{lib → packages/bunshot-auth/src/lib}/suspension.js +2 -5
  127. package/dist/packages/bunshot-auth/src/lib/validateAdapter.d.ts +16 -0
  128. package/dist/packages/bunshot-auth/src/lib/validateAdapter.js +161 -0
  129. package/dist/packages/bunshot-auth/src/middleware/bearerAuth.d.ts +13 -0
  130. package/dist/packages/bunshot-auth/src/middleware/bearerAuth.js +58 -0
  131. package/dist/{middleware → packages/bunshot-auth/src/middleware}/csrf.d.ts +5 -4
  132. package/dist/packages/bunshot-auth/src/middleware/csrf.js +138 -0
  133. package/dist/packages/bunshot-auth/src/middleware/identify.d.ts +4 -0
  134. package/dist/packages/bunshot-auth/src/middleware/identify.js +124 -0
  135. package/dist/{middleware → packages/bunshot-auth/src/middleware}/requireMfaSetup.d.ts +2 -2
  136. package/dist/{middleware → packages/bunshot-auth/src/middleware}/requireMfaSetup.js +10 -8
  137. package/dist/{middleware → packages/bunshot-auth/src/middleware}/requireRole.d.ts +2 -2
  138. package/dist/{middleware → packages/bunshot-auth/src/middleware}/requireRole.js +20 -16
  139. package/dist/{middleware → packages/bunshot-auth/src/middleware}/requireScope.d.ts +2 -2
  140. package/dist/{middleware → packages/bunshot-auth/src/middleware}/requireScope.js +6 -6
  141. package/dist/{middleware → packages/bunshot-auth/src/middleware}/requireStepUp.d.ts +2 -2
  142. package/dist/{middleware → packages/bunshot-auth/src/middleware}/requireStepUp.js +8 -7
  143. package/dist/{middleware → packages/bunshot-auth/src/middleware}/requireVerifiedEmail.d.ts +2 -2
  144. package/dist/{middleware → packages/bunshot-auth/src/middleware}/requireVerifiedEmail.js +7 -6
  145. package/dist/packages/bunshot-auth/src/middleware/scimAuth.d.ts +8 -0
  146. package/dist/packages/bunshot-auth/src/middleware/scimAuth.js +29 -0
  147. package/dist/packages/bunshot-auth/src/middleware/userAuth.d.ts +3 -0
  148. package/dist/packages/bunshot-auth/src/middleware/userAuth.js +6 -0
  149. package/dist/{models → packages/bunshot-auth/src/models}/AuthUser.d.ts +12 -8
  150. package/dist/packages/bunshot-auth/src/models/AuthUser.js +53 -0
  151. package/dist/packages/bunshot-auth/src/models/Group.d.ts +19 -0
  152. package/dist/packages/bunshot-auth/src/models/Group.js +22 -0
  153. package/dist/{models → packages/bunshot-auth/src/models}/GroupMembership.d.ts +6 -8
  154. package/dist/packages/bunshot-auth/src/models/GroupMembership.js +19 -0
  155. package/dist/{models → packages/bunshot-auth/src/models}/M2MClient.d.ts +1 -1
  156. package/dist/{models → packages/bunshot-auth/src/models}/M2MClient.js +5 -5
  157. package/dist/packages/bunshot-auth/src/models/TenantRole.d.ts +13 -0
  158. package/dist/packages/bunshot-auth/src/models/TenantRole.js +17 -0
  159. package/dist/packages/bunshot-auth/src/plugin.d.ts +4 -0
  160. package/dist/packages/bunshot-auth/src/plugin.js +274 -0
  161. package/dist/packages/bunshot-auth/src/routes/auth.d.ts +15 -0
  162. package/dist/packages/bunshot-auth/src/routes/auth.js +1624 -0
  163. package/dist/packages/bunshot-auth/src/routes/groups.d.ts +4 -0
  164. package/dist/packages/bunshot-auth/src/routes/groups.js +481 -0
  165. package/dist/packages/bunshot-auth/src/routes/m2m.d.ts +2 -0
  166. package/dist/packages/bunshot-auth/src/routes/m2m.js +145 -0
  167. package/dist/packages/bunshot-auth/src/routes/mfa.d.ts +6 -0
  168. package/dist/packages/bunshot-auth/src/routes/mfa.js +991 -0
  169. package/dist/packages/bunshot-auth/src/routes/oauth.d.ts +3 -0
  170. package/dist/packages/bunshot-auth/src/routes/oauth.js +1727 -0
  171. package/dist/packages/bunshot-auth/src/routes/oidc.d.ts +2 -0
  172. package/dist/packages/bunshot-auth/src/routes/oidc.js +84 -0
  173. package/dist/packages/bunshot-auth/src/routes/organizations.d.ts +3 -0
  174. package/dist/packages/bunshot-auth/src/routes/organizations.js +741 -0
  175. package/dist/packages/bunshot-auth/src/routes/passkey.d.ts +2 -0
  176. package/dist/packages/bunshot-auth/src/routes/passkey.js +199 -0
  177. package/dist/packages/bunshot-auth/src/routes/saml.d.ts +2 -0
  178. package/dist/packages/bunshot-auth/src/routes/saml.js +226 -0
  179. package/dist/packages/bunshot-auth/src/routes/scim.d.ts +3 -0
  180. package/dist/packages/bunshot-auth/src/routes/scim.js +588 -0
  181. package/dist/packages/bunshot-auth/src/runtime.d.ts +52 -0
  182. package/dist/packages/bunshot-auth/src/runtime.js +11 -0
  183. package/dist/{schemas → packages/bunshot-auth/src/schemas}/auth.d.ts +4 -5
  184. package/dist/packages/bunshot-auth/src/schemas/auth.js +24 -0
  185. package/dist/packages/bunshot-auth/src/schemas/error.d.ts +10 -0
  186. package/dist/packages/bunshot-auth/src/schemas/error.js +10 -0
  187. package/dist/packages/bunshot-auth/src/schemas/success.d.ts +10 -0
  188. package/dist/packages/bunshot-auth/src/schemas/success.js +10 -0
  189. package/dist/packages/bunshot-auth/src/services/auth.d.ts +39 -0
  190. package/dist/packages/bunshot-auth/src/services/auth.js +378 -0
  191. package/dist/{services → packages/bunshot-auth/src/services}/mfa.d.ts +41 -17
  192. package/dist/{services → packages/bunshot-auth/src/services}/mfa.js +259 -183
  193. package/dist/packages/bunshot-auth/src/testing.d.ts +31 -0
  194. package/dist/packages/bunshot-auth/src/testing.js +23 -0
  195. package/dist/packages/bunshot-auth/src/types/adapter.d.ts +1 -0
  196. package/dist/packages/bunshot-auth/src/types/adapter.js +1 -0
  197. package/dist/packages/bunshot-auth/src/types/config.d.ts +152 -0
  198. package/dist/packages/bunshot-auth/src/types/config.js +179 -0
  199. package/dist/{routes → packages/bunshot-auth/src/types}/groups.d.ts +2 -3
  200. package/dist/packages/bunshot-auth/src/types/groups.js +1 -0
  201. package/dist/packages/bunshot-auth/src/types/oauthCode.d.ts +6 -0
  202. package/dist/packages/bunshot-auth/src/types/oauthCode.js +1 -0
  203. package/dist/packages/bunshot-auth/src/types/oauthReauth.d.ts +13 -0
  204. package/dist/packages/bunshot-auth/src/types/oauthReauth.js +1 -0
  205. package/dist/packages/bunshot-auth/src/types/redis.d.ts +1 -0
  206. package/dist/packages/bunshot-auth/src/types/redis.js +1 -0
  207. package/dist/packages/bunshot-auth/src/types/saml.d.ts +10 -0
  208. package/dist/packages/bunshot-auth/src/types/saml.js +1 -0
  209. package/dist/packages/bunshot-auth/src/types/session.d.ts +18 -0
  210. package/dist/packages/bunshot-auth/src/types/session.js +1 -0
  211. package/dist/packages/bunshot-auth/src/types/store.d.ts +1 -0
  212. package/dist/packages/bunshot-auth/src/types/store.js +1 -0
  213. package/dist/packages/bunshot-core/src/adminProvider.d.ts +95 -0
  214. package/dist/packages/bunshot-core/src/adminProvider.js +1 -0
  215. package/dist/packages/bunshot-core/src/auditLog.d.ts +34 -0
  216. package/dist/packages/bunshot-core/src/auditLog.js +1 -0
  217. package/dist/packages/bunshot-core/src/auth-adapter.d.ts +227 -0
  218. package/dist/packages/bunshot-core/src/auth-adapter.js +4 -0
  219. package/dist/packages/bunshot-core/src/authVariables.d.ts +14 -0
  220. package/dist/packages/bunshot-core/src/authVariables.js +4 -0
  221. package/dist/packages/bunshot-core/src/cache.d.ts +12 -0
  222. package/dist/packages/bunshot-core/src/cache.js +21 -0
  223. package/dist/{lib → packages/bunshot-core/src}/captcha.d.ts +1 -10
  224. package/dist/packages/bunshot-core/src/captcha.js +1 -0
  225. package/dist/packages/bunshot-core/src/clearRegistry.d.ts +6 -0
  226. package/dist/packages/bunshot-core/src/clearRegistry.js +17 -0
  227. package/dist/packages/bunshot-core/src/clientIp.d.ts +3 -0
  228. package/dist/packages/bunshot-core/src/clientIp.js +45 -0
  229. package/dist/packages/bunshot-core/src/configLock.d.ts +4 -0
  230. package/dist/packages/bunshot-core/src/configLock.js +7 -0
  231. package/dist/packages/bunshot-core/src/configValidation.d.ts +22 -0
  232. package/dist/packages/bunshot-core/src/configValidation.js +39 -0
  233. package/dist/packages/bunshot-core/src/constants.js +10 -0
  234. package/dist/packages/bunshot-core/src/context/bunshotContext.d.ts +232 -0
  235. package/dist/packages/bunshot-core/src/context/bunshotContext.js +1 -0
  236. package/dist/packages/bunshot-core/src/context/contextAccess.d.ts +3 -0
  237. package/dist/packages/bunshot-core/src/context/contextAccess.js +16 -0
  238. package/dist/packages/bunshot-core/src/context/contextStore.d.ts +16 -0
  239. package/dist/packages/bunshot-core/src/context/contextStore.js +31 -0
  240. package/dist/packages/bunshot-core/src/context/frameworkConfig.d.ts +38 -0
  241. package/dist/packages/bunshot-core/src/context/frameworkConfig.js +1 -0
  242. package/dist/packages/bunshot-core/src/context/index.d.ts +4 -0
  243. package/dist/packages/bunshot-core/src/context/index.js +2 -0
  244. package/dist/packages/bunshot-core/src/context.d.ts +40 -0
  245. package/dist/packages/bunshot-core/src/context.js +35 -0
  246. package/dist/packages/bunshot-core/src/coreContracts.d.ts +47 -0
  247. package/dist/packages/bunshot-core/src/coreContracts.js +1 -0
  248. package/dist/packages/bunshot-core/src/coreRegistrar.d.ts +6 -0
  249. package/dist/packages/bunshot-core/src/coreRegistrar.js +42 -0
  250. package/dist/{lib → packages/bunshot-core/src}/createRoute.d.ts +4 -30
  251. package/dist/{lib → packages/bunshot-core/src}/createRoute.js +39 -88
  252. package/dist/packages/bunshot-core/src/cronRegistry.d.ts +11 -0
  253. package/dist/packages/bunshot-core/src/cronRegistry.js +1 -0
  254. package/dist/packages/bunshot-core/src/crypto.d.ts +43 -0
  255. package/dist/packages/bunshot-core/src/crypto.js +74 -0
  256. package/dist/packages/bunshot-core/src/csrf.d.ts +8 -0
  257. package/dist/packages/bunshot-core/src/csrf.js +1 -0
  258. package/dist/packages/bunshot-core/src/defaults/defaultFingerprint.d.ts +7 -0
  259. package/dist/packages/bunshot-core/src/defaults/defaultFingerprint.js +19 -0
  260. package/dist/packages/bunshot-core/src/defaults/memoryCacheAdapter.d.ts +6 -0
  261. package/dist/packages/bunshot-core/src/defaults/memoryCacheAdapter.js +40 -0
  262. package/dist/packages/bunshot-core/src/defaults/memoryRateLimit.d.ts +6 -0
  263. package/dist/packages/bunshot-core/src/defaults/memoryRateLimit.js +24 -0
  264. package/dist/packages/bunshot-core/src/emailTemplates.d.ts +5 -0
  265. package/dist/packages/bunshot-core/src/emailTemplates.js +10 -0
  266. package/dist/{lib/HttpError.d.ts → packages/bunshot-core/src/errors.d.ts} +4 -1
  267. package/dist/{lib/HttpError.js → packages/bunshot-core/src/errors.js} +7 -1
  268. package/dist/packages/bunshot-core/src/eventBus.d.ts +270 -0
  269. package/dist/packages/bunshot-core/src/eventBus.js +143 -0
  270. package/dist/packages/bunshot-core/src/idempotency.d.ts +18 -0
  271. package/dist/packages/bunshot-core/src/idempotency.js +1 -0
  272. package/dist/packages/bunshot-core/src/index.d.ts +60 -0
  273. package/dist/packages/bunshot-core/src/index.js +34 -0
  274. package/dist/packages/bunshot-core/src/mail.d.ts +14 -0
  275. package/dist/packages/bunshot-core/src/mail.js +8 -0
  276. package/dist/packages/bunshot-core/src/memoryEviction.d.ts +24 -0
  277. package/dist/packages/bunshot-core/src/memoryEviction.js +52 -0
  278. package/dist/packages/bunshot-core/src/pagination.d.ts +45 -0
  279. package/dist/packages/bunshot-core/src/pagination.js +61 -0
  280. package/dist/packages/bunshot-core/src/permissions.d.ts +64 -0
  281. package/dist/packages/bunshot-core/src/permissions.js +27 -0
  282. package/dist/packages/bunshot-core/src/plugin.d.ts +44 -0
  283. package/dist/packages/bunshot-core/src/plugin.js +1 -0
  284. package/dist/packages/bunshot-core/src/rateLimit.d.ts +5 -0
  285. package/dist/packages/bunshot-core/src/rateLimit.js +18 -0
  286. package/dist/packages/bunshot-core/src/redis.d.ts +21 -0
  287. package/dist/packages/bunshot-core/src/redis.js +1 -0
  288. package/dist/packages/bunshot-core/src/routeAuth.d.ts +5 -0
  289. package/dist/packages/bunshot-core/src/routeAuth.js +11 -0
  290. package/dist/packages/bunshot-core/src/routeOverrides.d.ts +24 -0
  291. package/dist/packages/bunshot-core/src/routeOverrides.js +25 -0
  292. package/dist/packages/bunshot-core/src/routerAdapter.d.ts +6 -0
  293. package/dist/packages/bunshot-core/src/routerAdapter.js +56 -0
  294. package/dist/packages/bunshot-core/src/secrets.d.ts +48 -0
  295. package/dist/packages/bunshot-core/src/secrets.js +8 -0
  296. package/dist/packages/bunshot-core/src/signing.d.ts +41 -0
  297. package/dist/packages/bunshot-core/src/signing.js +1 -0
  298. package/dist/packages/bunshot-core/src/sse.d.ts +36 -0
  299. package/dist/packages/bunshot-core/src/sse.js +1 -0
  300. package/dist/packages/bunshot-core/src/storageAdapter.js +1 -0
  301. package/dist/packages/bunshot-core/src/storeInfra.d.ts +44 -0
  302. package/dist/packages/bunshot-core/src/storeInfra.js +18 -0
  303. package/dist/packages/bunshot-core/src/storeType.d.ts +7 -0
  304. package/dist/packages/bunshot-core/src/storeType.js +1 -0
  305. package/dist/packages/bunshot-core/src/testing.d.ts +1 -0
  306. package/dist/packages/bunshot-core/src/testing.js +1 -0
  307. package/dist/packages/bunshot-core/src/uploadRegistry.d.ts +23 -0
  308. package/dist/packages/bunshot-core/src/uploadRegistry.js +4 -0
  309. package/dist/packages/bunshot-core/src/userResolver.d.ts +5 -0
  310. package/dist/packages/bunshot-core/src/userResolver.js +14 -0
  311. package/dist/packages/bunshot-core/src/wsMessages.d.ts +42 -0
  312. package/dist/packages/bunshot-core/src/wsMessages.js +4 -0
  313. package/dist/packages/bunshot-permissions/src/adapters/memory.d.ts +7 -0
  314. package/dist/packages/bunshot-permissions/src/adapters/memory.js +73 -0
  315. package/dist/packages/bunshot-permissions/src/index.d.ts +10 -0
  316. package/dist/packages/bunshot-permissions/src/index.js +5 -0
  317. package/dist/packages/bunshot-permissions/src/lib/bootstrap.d.ts +7 -0
  318. package/dist/packages/bunshot-permissions/src/lib/bootstrap.js +12 -0
  319. package/dist/packages/bunshot-permissions/src/lib/evaluator.d.ts +10 -0
  320. package/dist/packages/bunshot-permissions/src/lib/evaluator.js +165 -0
  321. package/dist/packages/bunshot-permissions/src/lib/registry.d.ts +2 -0
  322. package/dist/packages/bunshot-permissions/src/lib/registry.js +31 -0
  323. package/dist/packages/bunshot-permissions/src/lib/validation.d.ts +1 -0
  324. package/dist/packages/bunshot-permissions/src/lib/validation.js +1 -0
  325. package/dist/packages/bunshot-permissions/src/types/adapter.d.ts +1 -0
  326. package/dist/packages/bunshot-permissions/src/types/adapter.js +1 -0
  327. package/dist/packages/bunshot-permissions/src/types/evaluator.d.ts +1 -0
  328. package/dist/packages/bunshot-permissions/src/types/evaluator.js +1 -0
  329. package/dist/packages/bunshot-permissions/src/types/models.d.ts +1 -0
  330. package/dist/packages/bunshot-permissions/src/types/models.js +1 -0
  331. package/dist/packages/bunshot-permissions/src/types/registry.d.ts +1 -0
  332. package/dist/packages/bunshot-permissions/src/types/registry.js +1 -0
  333. package/dist/packages/bunshot-postgres/src/adapter.d.ts +6 -0
  334. package/dist/packages/bunshot-postgres/src/adapter.js +794 -0
  335. package/dist/packages/bunshot-postgres/src/connection.d.ts +15 -0
  336. package/dist/packages/bunshot-postgres/src/connection.js +16 -0
  337. package/dist/packages/bunshot-postgres/src/index.d.ts +4 -0
  338. package/dist/packages/bunshot-postgres/src/index.js +2 -0
  339. package/dist/packages/bunshot-postgres/src/schema.d.ts +997 -0
  340. package/dist/packages/bunshot-postgres/src/schema.js +105 -0
  341. package/dist/src/app.d.ts +230 -0
  342. package/dist/src/app.js +182 -0
  343. package/dist/src/cli/commands/init.d.ts +10 -0
  344. package/dist/src/cli/commands/init.js +709 -0
  345. package/dist/src/cli/index.d.ts +1 -0
  346. package/dist/src/cli/index.js +3 -0
  347. package/dist/src/entrypoints/mongo.d.ts +6 -0
  348. package/dist/src/entrypoints/mongo.js +4 -0
  349. package/dist/src/entrypoints/queue.d.ts +2 -0
  350. package/dist/src/entrypoints/queue.js +1 -0
  351. package/dist/src/entrypoints/redis.d.ts +1 -0
  352. package/dist/src/entrypoints/redis.js +1 -0
  353. package/dist/{adapters → src/framework/adapters}/localStorage.d.ts +1 -1
  354. package/dist/{adapters → src/framework/adapters}/localStorage.js +10 -10
  355. package/dist/src/framework/adapters/memoryStorage.d.ts +2 -0
  356. package/dist/src/framework/adapters/memoryStorage.js +45 -0
  357. package/dist/{adapters → src/framework/adapters}/s3Storage.d.ts +1 -1
  358. package/dist/{adapters → src/framework/adapters}/s3Storage.js +12 -12
  359. package/dist/src/framework/admin/bunshotAccess.d.ts +2 -0
  360. package/dist/src/framework/admin/bunshotAccess.js +23 -0
  361. package/dist/src/framework/admin/bunshotUsers.d.ts +2 -0
  362. package/dist/src/framework/admin/bunshotUsers.js +103 -0
  363. package/dist/src/framework/admin/index.d.ts +7 -0
  364. package/dist/src/framework/admin/index.js +21 -0
  365. package/dist/src/framework/boundaryAdapters/cacheFactories.d.ts +13 -0
  366. package/dist/src/framework/boundaryAdapters/cacheFactories.js +86 -0
  367. package/dist/src/framework/boundaryAdapters/index.d.ts +2 -0
  368. package/dist/src/framework/boundaryAdapters/index.js +1 -0
  369. package/dist/src/framework/boundaryAdapters.d.ts +17 -0
  370. package/dist/src/framework/boundaryAdapters.js +62 -0
  371. package/dist/src/framework/buildContext.d.ts +33 -0
  372. package/dist/src/framework/buildContext.js +119 -0
  373. package/dist/src/framework/config/schema.d.ts +447 -0
  374. package/dist/src/framework/config/schema.js +528 -0
  375. package/dist/src/framework/createInfrastructure.d.ts +76 -0
  376. package/dist/src/framework/createInfrastructure.js +221 -0
  377. package/dist/src/framework/lib/auditLog.d.ts +23 -0
  378. package/dist/src/framework/lib/auditLog.js +416 -0
  379. package/dist/src/framework/lib/captcha.d.ts +11 -0
  380. package/dist/{lib → src/framework/lib}/captcha.js +13 -10
  381. package/dist/{lib → src/framework/lib}/createDtoMapper.js +4 -4
  382. package/dist/src/framework/lib/createRoute.d.ts +1 -0
  383. package/dist/src/framework/lib/createRoute.js +2 -0
  384. package/dist/{lib → src/framework/lib}/idempotency.d.ts +2 -6
  385. package/dist/src/framework/lib/idempotency.js +74 -0
  386. package/dist/src/framework/lib/logger.d.ts +3 -0
  387. package/dist/src/framework/lib/logger.js +14 -0
  388. package/dist/src/framework/lib/metrics.d.ts +34 -0
  389. package/dist/{lib → src/framework/lib}/metrics.js +49 -57
  390. package/dist/src/framework/lib/pagination.d.ts +42 -0
  391. package/dist/src/framework/lib/pagination.js +51 -0
  392. package/dist/src/framework/lib/redisTransport.d.ts +38 -0
  393. package/dist/src/framework/lib/redisTransport.js +107 -0
  394. package/dist/src/framework/lib/resolveUserId.d.ts +2 -0
  395. package/dist/src/framework/lib/resolveUserId.js +5 -0
  396. package/dist/src/framework/lib/sseCollision.d.ts +6 -0
  397. package/dist/src/framework/lib/sseCollision.js +26 -0
  398. package/dist/src/framework/lib/storageAdapter.d.ts +1 -0
  399. package/dist/src/framework/lib/storageAdapter.js +1 -0
  400. package/dist/{lib → src/framework/lib}/stripUnreferencedSchemas.js +4 -4
  401. package/dist/src/framework/lib/tenant.d.ts +21 -0
  402. package/dist/src/framework/lib/tenant.js +70 -0
  403. package/dist/{lib → src/framework/lib}/upload.d.ts +11 -10
  404. package/dist/src/framework/lib/upload.js +132 -0
  405. package/dist/src/framework/lib/uploadRegistry.d.ts +23 -0
  406. package/dist/src/framework/lib/uploadRegistry.js +34 -0
  407. package/dist/{lib → src/framework/lib}/validate.d.ts +1 -1
  408. package/dist/{lib → src/framework/lib}/validate.js +2 -2
  409. package/dist/src/framework/lib/ws.d.ts +19 -0
  410. package/dist/src/framework/lib/ws.js +130 -0
  411. package/dist/src/framework/lib/wsHeartbeat.d.ts +12 -0
  412. package/dist/src/framework/lib/wsHeartbeat.js +53 -0
  413. package/dist/src/framework/lib/wsMessages.d.ts +25 -0
  414. package/dist/src/framework/lib/wsMessages.js +45 -0
  415. package/dist/src/framework/lib/wsNamespace.d.ts +17 -0
  416. package/dist/src/framework/lib/wsNamespace.js +19 -0
  417. package/dist/src/framework/lib/wsPresence.d.ts +17 -0
  418. package/dist/src/framework/lib/wsPresence.js +84 -0
  419. package/dist/src/framework/lib/wsTransport.d.ts +38 -0
  420. package/dist/src/framework/lib/wsTransport.js +9 -0
  421. package/dist/{lib → src/framework/lib}/zodToMongoose.d.ts +1 -1
  422. package/dist/{lib → src/framework/lib}/zodToMongoose.js +11 -11
  423. package/dist/{middleware → src/framework/middleware}/auditLog.d.ts +4 -3
  424. package/dist/src/framework/middleware/auditLog.js +42 -0
  425. package/dist/{middleware → src/framework/middleware}/botProtection.d.ts +2 -2
  426. package/dist/{middleware → src/framework/middleware}/botProtection.js +8 -9
  427. package/dist/src/framework/middleware/cacheResponse.d.ts +35 -0
  428. package/dist/src/framework/middleware/cacheResponse.js +126 -0
  429. package/dist/{middleware → src/framework/middleware}/captcha.d.ts +2 -3
  430. package/dist/src/framework/middleware/captcha.js +37 -0
  431. package/dist/{middleware → src/framework/middleware}/errorHandler.d.ts +1 -1
  432. package/dist/{middleware → src/framework/middleware}/errorHandler.js +2 -2
  433. package/dist/src/framework/middleware/index.js +1 -0
  434. package/dist/{middleware → src/framework/middleware}/logger.d.ts +1 -1
  435. package/dist/src/framework/middleware/metrics.d.ts +12 -0
  436. package/dist/src/framework/middleware/metrics.js +26 -0
  437. package/dist/{middleware → src/framework/middleware}/rateLimit.d.ts +2 -2
  438. package/dist/src/framework/middleware/rateLimit.js +22 -0
  439. package/dist/src/framework/middleware/requestId.d.ts +3 -0
  440. package/dist/{middleware → src/framework/middleware}/requestId.js +2 -2
  441. package/dist/{middleware → src/framework/middleware}/requestLogger.d.ts +3 -3
  442. package/dist/{middleware → src/framework/middleware}/requestLogger.js +17 -12
  443. package/dist/{middleware → src/framework/middleware}/requestSigning.d.ts +2 -2
  444. package/dist/{middleware → src/framework/middleware}/requestSigning.js +18 -20
  445. package/dist/src/framework/middleware/tenant.d.ts +14 -0
  446. package/dist/{middleware → src/framework/middleware}/tenant.js +31 -27
  447. package/dist/src/framework/middleware/upload.d.ts +5 -0
  448. package/dist/{middleware → src/framework/middleware}/upload.js +4 -4
  449. package/dist/{middleware → src/framework/middleware}/webhookAuth.d.ts +3 -3
  450. package/dist/{middleware → src/framework/middleware}/webhookAuth.js +11 -12
  451. package/dist/src/framework/models/AuditLog.d.ts +21 -0
  452. package/dist/src/framework/models/AuditLog.js +31 -0
  453. package/dist/src/framework/mountMiddleware.d.ts +91 -0
  454. package/dist/src/framework/mountMiddleware.js +128 -0
  455. package/dist/src/framework/mountOptionalEndpoints.d.ts +103 -0
  456. package/dist/src/framework/mountOptionalEndpoints.js +47 -0
  457. package/dist/src/framework/mountRoutes.d.ts +21 -0
  458. package/dist/src/framework/mountRoutes.js +144 -0
  459. package/dist/src/framework/persistence/cronRegistry.d.ts +28 -0
  460. package/dist/src/framework/persistence/cronRegistry.js +139 -0
  461. package/dist/src/framework/persistence/idempotency.d.ts +26 -0
  462. package/dist/src/framework/persistence/idempotency.js +178 -0
  463. package/dist/src/framework/persistence/index.d.ts +6 -0
  464. package/dist/src/framework/persistence/index.js +8 -0
  465. package/dist/src/framework/persistence/storeInfra.d.ts +9 -0
  466. package/dist/src/framework/persistence/storeInfra.js +1 -0
  467. package/dist/src/framework/persistence/uploadRegistry.d.ts +35 -0
  468. package/dist/src/framework/persistence/uploadRegistry.js +235 -0
  469. package/dist/src/framework/persistence/wsMessages.d.ts +22 -0
  470. package/dist/src/framework/persistence/wsMessages.js +296 -0
  471. package/dist/src/framework/preloadSchemas.d.ts +24 -0
  472. package/dist/src/framework/preloadSchemas.js +42 -0
  473. package/dist/src/framework/registerBoundaryAdapters.d.ts +23 -0
  474. package/dist/src/framework/registerBoundaryAdapters.js +46 -0
  475. package/dist/src/framework/routes/admin.d.ts +9 -0
  476. package/dist/src/framework/routes/admin.js +361 -0
  477. package/dist/src/framework/routes/health.d.ts +1 -0
  478. package/dist/src/framework/routes/health.js +21 -0
  479. package/dist/src/framework/routes/home.d.ts +1 -0
  480. package/dist/src/framework/routes/home.js +18 -0
  481. package/dist/src/framework/routes/jobs.d.ts +3 -0
  482. package/dist/{routes → src/framework/routes}/jobs.js +128 -103
  483. package/dist/src/framework/routes/metrics.d.ts +10 -0
  484. package/dist/src/framework/routes/metrics.js +57 -0
  485. package/dist/{routes → src/framework/routes}/uploads.d.ts +3 -3
  486. package/dist/src/framework/routes/uploads.js +262 -0
  487. package/dist/src/framework/runPluginLifecycle.d.ts +27 -0
  488. package/dist/src/framework/runPluginLifecycle.js +121 -0
  489. package/dist/src/framework/secrets/frameworkSecretSchema.d.ts +58 -0
  490. package/dist/src/framework/secrets/frameworkSecretSchema.js +20 -0
  491. package/dist/src/framework/secrets/index.d.ts +9 -0
  492. package/dist/src/framework/secrets/index.js +7 -0
  493. package/dist/src/framework/secrets/providers/envProvider.d.ts +15 -0
  494. package/dist/src/framework/secrets/providers/envProvider.js +18 -0
  495. package/dist/src/framework/secrets/providers/fileProvider.d.ts +8 -0
  496. package/dist/src/framework/secrets/providers/fileProvider.js +82 -0
  497. package/dist/src/framework/secrets/providers/ssmProvider.d.ts +20 -0
  498. package/dist/src/framework/secrets/providers/ssmProvider.js +127 -0
  499. package/dist/src/framework/secrets/resolveSecretBundle.d.ts +53 -0
  500. package/dist/src/framework/secrets/resolveSecretBundle.js +84 -0
  501. package/dist/src/framework/secrets/resolveSecrets.d.ts +18 -0
  502. package/dist/src/framework/secrets/resolveSecrets.js +34 -0
  503. package/dist/src/framework/sse/index.d.ts +21 -0
  504. package/dist/src/framework/sse/index.js +109 -0
  505. package/dist/src/framework/ws/index.d.ts +11 -0
  506. package/dist/src/framework/ws/index.js +8 -0
  507. package/dist/src/index.d.ts +87 -0
  508. package/dist/src/index.js +58 -0
  509. package/dist/src/lib/appConfig.d.ts +7 -0
  510. package/dist/src/lib/appConfig.js +27 -0
  511. package/dist/src/lib/appMeta.d.ts +7 -0
  512. package/dist/src/lib/appMeta.js +3 -0
  513. package/dist/src/lib/authConfig.d.ts +532 -0
  514. package/dist/{lib/appConfig.js → src/lib/authConfig.js} +75 -17
  515. package/dist/{lib → src/lib}/context.d.ts +6 -12
  516. package/dist/{lib → src/lib}/context.js +5 -5
  517. package/dist/src/lib/logger.d.ts +1 -0
  518. package/dist/src/lib/logger.js +1 -0
  519. package/dist/src/lib/mongo.d.ts +58 -0
  520. package/dist/src/lib/mongo.js +96 -0
  521. package/dist/src/lib/queue.d.ts +72 -0
  522. package/dist/src/lib/queue.js +152 -0
  523. package/dist/src/lib/redis.d.ts +28 -0
  524. package/dist/src/lib/redis.js +72 -0
  525. package/dist/{lib → src/lib}/signing.d.ts +2 -2
  526. package/dist/src/lib/signing.js +210 -0
  527. package/dist/src/lib/signingConfig.d.ts +40 -0
  528. package/dist/src/lib/signingConfig.js +28 -0
  529. package/dist/src/server.d.ts +146 -0
  530. package/dist/src/server.js +469 -0
  531. package/dist/src/shared/lib/HttpError.d.ts +1 -0
  532. package/dist/src/shared/lib/HttpError.js +2 -0
  533. package/dist/src/shared/lib/constants.d.ts +10 -0
  534. package/dist/src/shared/lib/crypto.d.ts +43 -0
  535. package/dist/src/shared/lib/crypto.js +74 -0
  536. package/dist/src/shared/lib/signing.d.ts +52 -0
  537. package/dist/{lib → src/shared/lib}/signing.js +35 -8
  538. package/dist/src/testing.d.ts +34 -0
  539. package/dist/src/testing.js +93 -0
  540. package/package.json +60 -24
  541. package/dist/adapters/memoryAuth.d.ts +0 -52
  542. package/dist/adapters/memoryAuth.js +0 -749
  543. package/dist/adapters/memoryStorage.d.ts +0 -3
  544. package/dist/adapters/memoryStorage.js +0 -44
  545. package/dist/adapters/mongoAuth.d.ts +0 -2
  546. package/dist/adapters/mongoAuth.js +0 -403
  547. package/dist/adapters/sqliteAuth.d.ts +0 -72
  548. package/dist/adapters/sqliteAuth.js +0 -858
  549. package/dist/app.d.ts +0 -559
  550. package/dist/app.js +0 -651
  551. package/dist/entrypoints/mongo.d.ts +0 -5
  552. package/dist/entrypoints/mongo.js +0 -4
  553. package/dist/entrypoints/queue.d.ts +0 -2
  554. package/dist/entrypoints/queue.js +0 -1
  555. package/dist/entrypoints/redis.d.ts +0 -1
  556. package/dist/entrypoints/redis.js +0 -1
  557. package/dist/index.d.ts +0 -117
  558. package/dist/index.js +0 -88
  559. package/dist/lib/appConfig.d.ts +0 -275
  560. package/dist/lib/auditLog.d.ts +0 -58
  561. package/dist/lib/auditLog.js +0 -218
  562. package/dist/lib/authAdapter.d.ts +0 -246
  563. package/dist/lib/authAdapter.js +0 -7
  564. package/dist/lib/authRateLimit.d.ts +0 -13
  565. package/dist/lib/authRateLimit.js +0 -117
  566. package/dist/lib/clientIp.d.ts +0 -14
  567. package/dist/lib/credentialStuffing.d.ts +0 -31
  568. package/dist/lib/credentialStuffing.js +0 -77
  569. package/dist/lib/crypto.d.ts +0 -11
  570. package/dist/lib/crypto.js +0 -22
  571. package/dist/lib/deletionCancelToken.d.ts +0 -12
  572. package/dist/lib/deletionCancelToken.js +0 -88
  573. package/dist/lib/emailVerification.d.ts +0 -19
  574. package/dist/lib/emailVerification.js +0 -129
  575. package/dist/lib/fingerprint.js +0 -36
  576. package/dist/lib/idempotency.js +0 -182
  577. package/dist/lib/jwks.d.ts +0 -25
  578. package/dist/lib/jwks.js +0 -51
  579. package/dist/lib/jwt.d.ts +0 -15
  580. package/dist/lib/jwt.js +0 -111
  581. package/dist/lib/metrics.d.ts +0 -14
  582. package/dist/lib/mfaChallenge.d.ts +0 -55
  583. package/dist/lib/mfaChallenge.js +0 -398
  584. package/dist/lib/mongo.d.ts +0 -39
  585. package/dist/lib/mongo.js +0 -124
  586. package/dist/lib/oauth.d.ts +0 -40
  587. package/dist/lib/oauth.js +0 -101
  588. package/dist/lib/oauthCode.d.ts +0 -15
  589. package/dist/lib/oauthCode.js +0 -95
  590. package/dist/lib/pagination.d.ts +0 -119
  591. package/dist/lib/pagination.js +0 -166
  592. package/dist/lib/queue.d.ts +0 -37
  593. package/dist/lib/queue.js +0 -117
  594. package/dist/lib/redis.d.ts +0 -9
  595. package/dist/lib/redis.js +0 -61
  596. package/dist/lib/resetPassword.d.ts +0 -12
  597. package/dist/lib/resetPassword.js +0 -93
  598. package/dist/lib/roles.d.ts +0 -7
  599. package/dist/lib/roles.js +0 -49
  600. package/dist/lib/saml.d.ts +0 -25
  601. package/dist/lib/saml.js +0 -64
  602. package/dist/lib/securityEvents.d.ts +0 -28
  603. package/dist/lib/securityEvents.js +0 -26
  604. package/dist/lib/session.d.ts +0 -49
  605. package/dist/lib/session.js +0 -597
  606. package/dist/lib/tenant.d.ts +0 -15
  607. package/dist/lib/tenant.js +0 -65
  608. package/dist/lib/upload.js +0 -112
  609. package/dist/lib/uploadRegistry.d.ts +0 -18
  610. package/dist/lib/uploadRegistry.js +0 -83
  611. package/dist/lib/ws.d.ts +0 -22
  612. package/dist/lib/ws.js +0 -96
  613. package/dist/lib/wsHeartbeat.d.ts +0 -12
  614. package/dist/lib/wsHeartbeat.js +0 -57
  615. package/dist/lib/wsMessages.d.ts +0 -40
  616. package/dist/lib/wsMessages.js +0 -330
  617. package/dist/lib/wsPresence.d.ts +0 -25
  618. package/dist/lib/wsPresence.js +0 -99
  619. package/dist/middleware/auditLog.js +0 -39
  620. package/dist/middleware/bearerAuth.d.ts +0 -2
  621. package/dist/middleware/bearerAuth.js +0 -11
  622. package/dist/middleware/cacheResponse.d.ts +0 -15
  623. package/dist/middleware/cacheResponse.js +0 -178
  624. package/dist/middleware/captcha.js +0 -36
  625. package/dist/middleware/csrf.js +0 -129
  626. package/dist/middleware/identify.d.ts +0 -3
  627. package/dist/middleware/identify.js +0 -122
  628. package/dist/middleware/index.js +0 -1
  629. package/dist/middleware/metrics.d.ts +0 -9
  630. package/dist/middleware/metrics.js +0 -26
  631. package/dist/middleware/rateLimit.js +0 -22
  632. package/dist/middleware/requestId.d.ts +0 -3
  633. package/dist/middleware/scimAuth.d.ts +0 -8
  634. package/dist/middleware/scimAuth.js +0 -29
  635. package/dist/middleware/tenant.d.ts +0 -5
  636. package/dist/middleware/upload.d.ts +0 -5
  637. package/dist/middleware/userAuth.d.ts +0 -3
  638. package/dist/middleware/userAuth.js +0 -6
  639. package/dist/models/AuditLog.d.ts +0 -30
  640. package/dist/models/AuditLog.js +0 -39
  641. package/dist/models/AuthUser.js +0 -55
  642. package/dist/models/Group.d.ts +0 -21
  643. package/dist/models/Group.js +0 -28
  644. package/dist/models/GroupMembership.js +0 -25
  645. package/dist/models/TenantRole.d.ts +0 -15
  646. package/dist/models/TenantRole.js +0 -23
  647. package/dist/routes/auth.d.ts +0 -12
  648. package/dist/routes/auth.js +0 -744
  649. package/dist/routes/groups.js +0 -346
  650. package/dist/routes/health.d.ts +0 -1
  651. package/dist/routes/health.js +0 -22
  652. package/dist/routes/home.d.ts +0 -1
  653. package/dist/routes/home.js +0 -16
  654. package/dist/routes/jobs.d.ts +0 -2
  655. package/dist/routes/m2m.d.ts +0 -2
  656. package/dist/routes/m2m.js +0 -72
  657. package/dist/routes/metrics.d.ts +0 -8
  658. package/dist/routes/metrics.js +0 -55
  659. package/dist/routes/mfa.d.ts +0 -5
  660. package/dist/routes/mfa.js +0 -628
  661. package/dist/routes/oauth.d.ts +0 -2
  662. package/dist/routes/oauth.js +0 -520
  663. package/dist/routes/oidc.d.ts +0 -2
  664. package/dist/routes/oidc.js +0 -29
  665. package/dist/routes/passkey.d.ts +0 -1
  666. package/dist/routes/passkey.js +0 -157
  667. package/dist/routes/saml.d.ts +0 -2
  668. package/dist/routes/saml.js +0 -86
  669. package/dist/routes/scim.d.ts +0 -2
  670. package/dist/routes/scim.js +0 -255
  671. package/dist/routes/uploads.js +0 -227
  672. package/dist/schemas/auth.js +0 -30
  673. package/dist/server.d.ts +0 -57
  674. package/dist/server.js +0 -112
  675. package/dist/services/auth.d.ts +0 -29
  676. package/dist/services/auth.js +0 -238
  677. package/dist/ws/index.d.ts +0 -10
  678. package/dist/ws/index.js +0 -39
  679. package/docs/sections/adding-middleware/full.md +0 -35
  680. package/docs/sections/adding-models/full.md +0 -125
  681. package/docs/sections/adding-models/overview.md +0 -13
  682. package/docs/sections/adding-routes/full.md +0 -182
  683. package/docs/sections/adding-routes/overview.md +0 -23
  684. package/docs/sections/auth-flow/full.md +0 -790
  685. package/docs/sections/auth-flow/overview.md +0 -10
  686. package/docs/sections/auth-security-examples/full.md +0 -388
  687. package/docs/sections/authentication/full.md +0 -130
  688. package/docs/sections/authentication/overview.md +0 -5
  689. package/docs/sections/cli/full.md +0 -42
  690. package/docs/sections/configuration/full.md +0 -172
  691. package/docs/sections/configuration/overview.md +0 -18
  692. package/docs/sections/configuration-example/full.md +0 -117
  693. package/docs/sections/configuration-example/overview.md +0 -30
  694. package/docs/sections/documentation/full.md +0 -171
  695. package/docs/sections/environment-variables/full.md +0 -55
  696. package/docs/sections/exports/full.md +0 -123
  697. package/docs/sections/extending-context/full.md +0 -59
  698. package/docs/sections/header.md +0 -3
  699. package/docs/sections/installation/full.md +0 -6
  700. package/docs/sections/jobs/full.md +0 -140
  701. package/docs/sections/jobs/overview.md +0 -15
  702. package/docs/sections/logging/full.md +0 -83
  703. package/docs/sections/metrics/full.md +0 -131
  704. package/docs/sections/mongodb-connections/full.md +0 -45
  705. package/docs/sections/mongodb-connections/overview.md +0 -7
  706. package/docs/sections/multi-tenancy/full.md +0 -66
  707. package/docs/sections/multi-tenancy/overview.md +0 -15
  708. package/docs/sections/oauth/full.md +0 -189
  709. package/docs/sections/oauth/overview.md +0 -16
  710. package/docs/sections/package-development/full.md +0 -7
  711. package/docs/sections/pagination/full.md +0 -93
  712. package/docs/sections/passkey-login/full.md +0 -90
  713. package/docs/sections/passkey-login/overview.md +0 -1
  714. package/docs/sections/peer-dependencies/full.md +0 -47
  715. package/docs/sections/quick-start/full.md +0 -43
  716. package/docs/sections/response-caching/full.md +0 -117
  717. package/docs/sections/response-caching/overview.md +0 -13
  718. package/docs/sections/roles/full.md +0 -225
  719. package/docs/sections/roles/overview.md +0 -14
  720. package/docs/sections/running-without-redis/full.md +0 -16
  721. package/docs/sections/running-without-redis-or-mongodb/full.md +0 -60
  722. package/docs/sections/signing/full.md +0 -203
  723. package/docs/sections/stack/full.md +0 -10
  724. package/docs/sections/uploads/full.md +0 -208
  725. package/docs/sections/versioning/full.md +0 -85
  726. package/docs/sections/webhook-auth/full.md +0 -100
  727. package/docs/sections/websocket/full.md +0 -196
  728. package/docs/sections/websocket/overview.md +0 -5
  729. package/docs/sections/websocket-rooms/full.md +0 -102
  730. package/docs/sections/websocket-rooms/overview.md +0 -5
  731. /package/dist/{lib/storageAdapter.js → packages/bunshot-admin/src/types/env.js} +0 -0
  732. /package/dist/{lib → packages/bunshot-auth/src/lib}/fingerprint.d.ts +0 -0
  733. /package/dist/{lib → packages/bunshot-auth/src/lib}/logger.d.ts +0 -0
  734. /package/dist/{lib → packages/bunshot-core/src}/constants.d.ts +0 -0
  735. /package/dist/{lib → packages/bunshot-core/src}/storageAdapter.d.ts +0 -0
  736. /package/dist/{lib → src/framework/lib}/createDtoMapper.d.ts +0 -0
  737. /package/dist/{lib → src/framework/lib}/stripUnreferencedSchemas.d.ts +0 -0
  738. /package/dist/{middleware → src/framework/middleware}/cors.d.ts +0 -0
  739. /package/dist/{middleware → src/framework/middleware}/cors.js +0 -0
  740. /package/dist/{middleware → src/framework/middleware}/index.d.ts +0 -0
  741. /package/dist/{middleware → src/framework/middleware}/logger.js +0 -0
  742. /package/dist/{lib → src/shared/lib}/constants.js +0 -0
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Centralized store infrastructure.
3
+ *
4
+ * Add a new backing store in ONE place:
5
+ * 1. Add the type to `StoreType` in types/store.ts
6
+ * 2. Add its infra deps to `StoreInfra`
7
+ * 3. Add a factory entry in each repository's `factories` record
8
+ *
9
+ * Repos declare their factory maps as `Record<StoreType, (infra: StoreInfra) => T>`.
10
+ * `resolveRepo()` picks the right factory and calls it.
11
+ */
12
+ import type { StoreType } from '../types/store';
13
+ import type { RedisLike } from '../types/redis';
14
+ import type { Connection } from 'mongoose';
15
+ import type { Database } from 'bun:sqlite';
16
+ export interface StoreInfra {
17
+ readonly appName: string;
18
+ readonly getRedis: () => RedisLike;
19
+ readonly getMongo: () => {
20
+ conn: Connection;
21
+ mg: typeof import('mongoose');
22
+ };
23
+ readonly getSqliteDb: () => Database;
24
+ }
25
+ export type RepoFactories<T> = Record<StoreType, (infra: StoreInfra) => T>;
26
+ export declare function resolveRepo<T>(factories: RepoFactories<T>, storeType: StoreType, infra: StoreInfra): T;
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Centralized store infrastructure.
3
+ *
4
+ * Add a new backing store in ONE place:
5
+ * 1. Add the type to `StoreType` in types/store.ts
6
+ * 2. Add its infra deps to `StoreInfra`
7
+ * 3. Add a factory entry in each repository's `factories` record
8
+ *
9
+ * Repos declare their factory maps as `Record<StoreType, (infra: StoreInfra) => T>`.
10
+ * `resolveRepo()` picks the right factory and calls it.
11
+ */
12
+ export function resolveRepo(factories, storeType, infra) {
13
+ const factory = factories[storeType];
14
+ if (!factory) {
15
+ throw new Error(`[bunshot-auth] Unsupported store type: ${storeType}`);
16
+ }
17
+ return factory(infra);
18
+ }
@@ -1,13 +1,14 @@
1
+ import type { AuthAdapter } from '../lib/authAdapter';
1
2
  /**
2
3
  * Suspend or unsuspend a user.
3
4
  * No-op when the adapter does not implement setSuspended.
4
5
  */
5
- export declare function setSuspended(userId: string, suspended: boolean, reason?: string): Promise<void>;
6
+ export declare function setSuspended(adapter: AuthAdapter, userId: string, suspended: boolean, reason?: string): Promise<void>;
6
7
  /**
7
8
  * Get the suspension status of a user.
8
9
  * Returns { suspended: false } when the adapter does not implement getSuspended.
9
10
  */
10
- export declare function getSuspended(userId: string): Promise<{
11
+ export declare function getSuspended(adapter: AuthAdapter, userId: string): Promise<{
11
12
  suspended: boolean;
12
13
  suspendedReason?: string;
13
14
  }>;
@@ -1,10 +1,8 @@
1
- import { getAuthAdapter } from "./authAdapter";
2
1
  /**
3
2
  * Suspend or unsuspend a user.
4
3
  * No-op when the adapter does not implement setSuspended.
5
4
  */
6
- export async function setSuspended(userId, suspended, reason) {
7
- const adapter = getAuthAdapter();
5
+ export async function setSuspended(adapter, userId, suspended, reason) {
8
6
  if (adapter.setSuspended) {
9
7
  await adapter.setSuspended(userId, suspended, reason);
10
8
  }
@@ -13,8 +11,7 @@ export async function setSuspended(userId, suspended, reason) {
13
11
  * Get the suspension status of a user.
14
12
  * Returns { suspended: false } when the adapter does not implement getSuspended.
15
13
  */
16
- export async function getSuspended(userId) {
17
- const adapter = getAuthAdapter();
14
+ export async function getSuspended(adapter, userId) {
18
15
  if (adapter.getSuspended) {
19
16
  const result = await adapter.getSuspended(userId);
20
17
  return result ?? { suspended: false };
@@ -0,0 +1,16 @@
1
+ import type { AuthAdapter } from './authAdapter';
2
+ export interface AdapterValidationConfig {
3
+ hasOAuthProviders: boolean;
4
+ hasMfa: boolean;
5
+ hasMfaWebAuthn: boolean;
6
+ hasRoles: boolean;
7
+ hasDefaultRole: boolean;
8
+ hasGroups: boolean;
9
+ hasSuspension: boolean;
10
+ hasM2m: boolean;
11
+ hasAdminApi: boolean;
12
+ hasPasswordReset: boolean;
13
+ hasPreventReuse: boolean;
14
+ hasScim: boolean;
15
+ }
16
+ export declare function validateAdapterCapabilities(adapter: AuthAdapter, cfg: AdapterValidationConfig): void;
@@ -0,0 +1,161 @@
1
+ export function validateAdapterCapabilities(adapter, cfg) {
2
+ const errors = [];
3
+ // ---------------------------------------------------------------------------
4
+ // Core — always required
5
+ // ---------------------------------------------------------------------------
6
+ if (!adapter.verifyPassword) {
7
+ errors.push('the configured auth adapter is missing the required "verifyPassword(userId, password)" method. Add verifyPassword to your adapter.');
8
+ }
9
+ if (!adapter.getIdentifier) {
10
+ errors.push('the configured auth adapter is missing the required "getIdentifier(userId)" method. Add getIdentifier to your adapter.');
11
+ }
12
+ // ---------------------------------------------------------------------------
13
+ // passwordReset — requires setPassword
14
+ // ---------------------------------------------------------------------------
15
+ if (cfg.hasPasswordReset && !adapter.setPassword) {
16
+ errors.push('"passwordReset" is configured but the auth adapter does not implement setPassword. Add setPassword to your adapter or remove passwordReset.');
17
+ }
18
+ // ---------------------------------------------------------------------------
19
+ // Tier 2 — OAuth
20
+ // ---------------------------------------------------------------------------
21
+ if (cfg.hasOAuthProviders) {
22
+ const oauthMethods = ['findOrCreateByProvider', 'linkProvider', 'unlinkProvider'];
23
+ for (const method of oauthMethods) {
24
+ if (!adapter[method]) {
25
+ errors.push(`"oauth.providers" is configured but the auth adapter does not implement ${method}. Add ${method} to your adapter.`);
26
+ }
27
+ }
28
+ }
29
+ // ---------------------------------------------------------------------------
30
+ // Tier 3 — MFA
31
+ // ---------------------------------------------------------------------------
32
+ if (cfg.hasMfa) {
33
+ const mfaMethods = [
34
+ 'setMfaSecret',
35
+ 'getMfaSecret',
36
+ 'isMfaEnabled',
37
+ 'setMfaEnabled',
38
+ 'setRecoveryCodes',
39
+ 'getRecoveryCodes',
40
+ 'removeRecoveryCode',
41
+ 'consumeRecoveryCode',
42
+ ];
43
+ for (const method of mfaMethods) {
44
+ if (!adapter[method]) {
45
+ errors.push(`"mfa" is configured but the auth adapter does not implement ${method}. Add ${method} to your adapter.`);
46
+ }
47
+ }
48
+ }
49
+ // ---------------------------------------------------------------------------
50
+ // Tier 4 — WebAuthn
51
+ // ---------------------------------------------------------------------------
52
+ if (cfg.hasMfaWebAuthn) {
53
+ const webauthnMethods = [
54
+ 'getWebAuthnCredentials',
55
+ 'addWebAuthnCredential',
56
+ 'removeWebAuthnCredential',
57
+ 'updateWebAuthnCredentialSignCount',
58
+ 'findUserByWebAuthnCredentialId',
59
+ ];
60
+ for (const method of webauthnMethods) {
61
+ if (!adapter[method]) {
62
+ errors.push(`"mfa.webauthn" is configured but the auth adapter does not implement ${method}. Add ${method} to your adapter.`);
63
+ }
64
+ }
65
+ }
66
+ // ---------------------------------------------------------------------------
67
+ // Tier 5 — Roles
68
+ // ---------------------------------------------------------------------------
69
+ if (cfg.hasRoles || cfg.hasDefaultRole) {
70
+ const roleMethods = ['getRoles', 'setRoles', 'addRole', 'removeRole'];
71
+ for (const method of roleMethods) {
72
+ if (!adapter[method]) {
73
+ // Backward-compat: the original error only checked setRoles and mentioned defaultRole
74
+ if (cfg.hasDefaultRole && method === 'setRoles' && !cfg.hasRoles) {
75
+ errors.push(`"defaultRole" is set but the auth adapter does not implement setRoles. Add setRoles to your adapter or remove defaultRole.`);
76
+ }
77
+ else {
78
+ errors.push(`roles are configured but the auth adapter does not implement ${method}. Add ${method} to your adapter.`);
79
+ }
80
+ }
81
+ }
82
+ }
83
+ // ---------------------------------------------------------------------------
84
+ // Tier 6 — Groups
85
+ // ---------------------------------------------------------------------------
86
+ if (cfg.hasGroups) {
87
+ const groupMethods = [
88
+ 'createGroup',
89
+ 'deleteGroup',
90
+ 'getGroup',
91
+ 'listGroups',
92
+ 'updateGroup',
93
+ 'addGroupMember',
94
+ 'updateGroupMembership',
95
+ 'removeGroupMember',
96
+ 'getGroupMembers',
97
+ 'getUserGroups',
98
+ 'getEffectiveRoles',
99
+ ];
100
+ for (const method of groupMethods) {
101
+ if (!adapter[method]) {
102
+ errors.push(`"groups" is configured but the auth adapter does not implement ${method}. Add ${method} to your adapter.`);
103
+ }
104
+ }
105
+ }
106
+ // ---------------------------------------------------------------------------
107
+ // Tier 7 — Suspension
108
+ // ---------------------------------------------------------------------------
109
+ if (cfg.hasSuspension) {
110
+ const suspensionMethods = ['setSuspended', 'getSuspended'];
111
+ for (const method of suspensionMethods) {
112
+ if (!adapter[method]) {
113
+ errors.push(`suspension checking is configured but the auth adapter does not implement ${method}. Add ${method} to your adapter.`);
114
+ }
115
+ }
116
+ }
117
+ // ---------------------------------------------------------------------------
118
+ // Tier 8 — Enterprise: M2M
119
+ // ---------------------------------------------------------------------------
120
+ if (cfg.hasM2m) {
121
+ const m2mMethods = [
122
+ 'getM2MClient',
123
+ 'createM2MClient',
124
+ 'deleteM2MClient',
125
+ 'listM2MClients',
126
+ ];
127
+ for (const method of m2mMethods) {
128
+ if (!adapter[method]) {
129
+ errors.push(`"auth.m2m" is configured but the auth adapter does not implement ${method}. Add ${method} to your adapter.`);
130
+ }
131
+ }
132
+ }
133
+ // ---------------------------------------------------------------------------
134
+ // Tier 8 — Enterprise: admin.api requires listUsers
135
+ // ---------------------------------------------------------------------------
136
+ if (cfg.hasAdminApi && !adapter.listUsers) {
137
+ errors.push(`"adminApi" is configured but the auth adapter does not implement listUsers. Add listUsers to your adapter.`);
138
+ }
139
+ // ---------------------------------------------------------------------------
140
+ // Tier 8 — Enterprise: password history (preventReuse)
141
+ // ---------------------------------------------------------------------------
142
+ if (cfg.hasPreventReuse) {
143
+ const historyMethods = ['getPasswordHistory', 'addPasswordToHistory'];
144
+ for (const method of historyMethods) {
145
+ if (!adapter[method]) {
146
+ errors.push(`"auth.passwordPolicy.preventReuse" is configured but the auth adapter does not implement ${method}. Add ${method} to your adapter.`);
147
+ }
148
+ }
149
+ }
150
+ // ---------------------------------------------------------------------------
151
+ // SCIM — requires getUser for RFC 7644 §3.6 DELETE 404 compliance
152
+ // ---------------------------------------------------------------------------
153
+ if (cfg.hasScim && !adapter.getUser) {
154
+ errors.push('"scim" is enabled but the auth adapter does not implement getUser. ' +
155
+ 'SCIM DELETE requires getUser to return 404 for non-existent resources (RFC 7644 §3.6). ' +
156
+ 'Add getUser to your adapter or disable SCIM.');
157
+ }
158
+ if (errors.length > 0) {
159
+ throw new Error(`createApp: Adapter capability validation failed:\n${errors.map(e => ` - ${e}`).join('\n')}`);
160
+ }
161
+ }
@@ -0,0 +1,13 @@
1
+ import type { MiddlewareHandler } from 'hono';
2
+ import type { BearerAuthConfig } from '../config/authConfig';
3
+ /**
4
+ * Build a bearerAuth middleware from the given config.
5
+ *
6
+ * Supports three forms:
7
+ * - string: single token; no clientId
8
+ * - string[]: multiple tokens, any match allows; no clientId
9
+ * - BearerAuthClient[]: named clients with per-entry revocation; matched clientId set on context
10
+ *
11
+ * Config is required — there is no env var fallback.
12
+ */
13
+ export declare function createBearerAuth(config: BearerAuthConfig): MiddlewareHandler;
@@ -0,0 +1,58 @@
1
+ import { timingSafeEqual } from '../../../bunshot-core/src/index.js';
2
+ /**
3
+ * Build a bearerAuth middleware from the given config.
4
+ *
5
+ * Supports three forms:
6
+ * - string: single token; no clientId
7
+ * - string[]: multiple tokens, any match allows; no clientId
8
+ * - BearerAuthClient[]: named clients with per-entry revocation; matched clientId set on context
9
+ *
10
+ * Config is required — there is no env var fallback.
11
+ */
12
+ export function createBearerAuth(config) {
13
+ return async (c, next) => {
14
+ const header = c.req.header('Authorization');
15
+ const token = header?.startsWith('Bearer ') ? header.slice(7) : null;
16
+ if (!token) {
17
+ return c.json({ error: 'Unauthorized' }, 401);
18
+ }
19
+ if (typeof config === 'string') {
20
+ // Single string — direct comparison
21
+ if (!timingSafeEqual(token, config)) {
22
+ return c.json({ error: 'Unauthorized' }, 401);
23
+ }
24
+ await next();
25
+ return;
26
+ }
27
+ if (config.length === 0) {
28
+ return c.json({ error: 'Unauthorized' }, 401);
29
+ }
30
+ // Determine if this is string[] or BearerAuthClient[]
31
+ if (typeof config[0] === 'string') {
32
+ // string[] — check all tokens
33
+ const tokens = config;
34
+ const matched = tokens.some(t => timingSafeEqual(token, t));
35
+ if (!matched) {
36
+ return c.json({ error: 'Unauthorized' }, 401);
37
+ }
38
+ await next();
39
+ return;
40
+ }
41
+ // BearerAuthClient[] — check non-revoked clients
42
+ const clients = config;
43
+ let matchedClient = null;
44
+ for (const client of clients) {
45
+ if (client.revoked)
46
+ continue;
47
+ if (timingSafeEqual(token, client.token)) {
48
+ matchedClient = client;
49
+ break;
50
+ }
51
+ }
52
+ if (!matchedClient) {
53
+ return c.json({ error: 'Unauthorized' }, 401);
54
+ }
55
+ c.set('bearerClientId', matchedClient.clientId);
56
+ await next();
57
+ };
58
+ }
@@ -1,16 +1,17 @@
1
- import type { MiddlewareHandler } from "hono";
2
- import { setCookie, deleteCookie } from "hono/cookie";
3
- import type { AppEnv } from "../lib/context";
1
+ import type { MiddlewareHandler } from 'hono';
2
+ import { deleteCookie, setCookie } from 'hono/cookie';
3
+ import type { AppEnv, SigningConfig } from '../../../bunshot-core/src/index.js';
4
4
  export interface CsrfMiddlewareOptions {
5
5
  exemptPaths?: string[];
6
6
  checkOrigin?: boolean;
7
7
  allowedOrigins?: string | string[];
8
+ signing?: SigningConfig | null;
8
9
  }
9
10
  /**
10
11
  * Refreshes the CSRF token cookie — call on login/register to prevent
11
12
  * session fixation-adjacent attacks.
12
13
  */
13
- export declare function refreshCsrfToken(c: Parameters<typeof setCookie>[0]): void;
14
+ export declare function refreshCsrfToken(c: Parameters<typeof setCookie>[0], signing?: SigningConfig | null): void;
14
15
  /**
15
16
  * Clears the CSRF token cookie — call on logout.
16
17
  */
@@ -0,0 +1,138 @@
1
+ import { getCsrfCookieOptions } from '../lib/cookieOptions';
2
+ import { isProd } from '../lib/env';
3
+ import { createHmac, randomBytes } from 'crypto';
4
+ import { deleteCookie, getCookie, setCookie } from 'hono/cookie';
5
+ import { COOKIE_CSRF_TOKEN, COOKIE_TOKEN, HEADER_CSRF_TOKEN, timingSafeEqual, } from '../../../bunshot-core/src/index.js';
6
+ import { getSigningSecret } from '../infra/signing';
7
+ import { getAuthRuntimeFromRequest } from '../runtime';
8
+ const STATE_CHANGING_METHODS = new Set(['POST', 'PUT', 'PATCH', 'DELETE']);
9
+ function getCsrfSecret(c, signing) {
10
+ const ctxSigning = c?.get?.('bunshotCtx');
11
+ const raw = getSigningSecret(ctxSigning?.signing ?? signing);
12
+ if (!raw)
13
+ throw new Error('[bunshot] CSRF middleware: no signing secret configured. Set JWT_SECRET or inject a signing config via createServer({ security: { signing: ... } }).');
14
+ return Array.isArray(raw) ? raw[0] : raw;
15
+ }
16
+ function generateCsrfToken(secret) {
17
+ const token = randomBytes(32).toString('hex');
18
+ const sig = createHmac('sha256', secret).update(token).digest('hex');
19
+ return `${token}.${sig}`;
20
+ }
21
+ function verifyCsrfSignature(cookieValue, secret) {
22
+ const dotIdx = cookieValue.indexOf('.');
23
+ if (dotIdx === -1)
24
+ return false;
25
+ const token = cookieValue.substring(0, dotIdx);
26
+ const sig = cookieValue.substring(dotIdx + 1);
27
+ const expected = createHmac('sha256', secret).update(token).digest('hex');
28
+ return timingSafeEqual(sig, expected);
29
+ }
30
+ /**
31
+ * Refreshes the CSRF token cookie — call on login/register to prevent
32
+ * session fixation-adjacent attacks.
33
+ */
34
+ export function refreshCsrfToken(c, signing) {
35
+ const secret = getCsrfSecret(c, signing);
36
+ const token = generateCsrfToken(secret);
37
+ const authRuntime = getAuthRuntimeFromRequest(c);
38
+ setCookie(c, COOKIE_CSRF_TOKEN, token, getCsrfCookieOptions(isProd(), authRuntime.config));
39
+ }
40
+ /**
41
+ * Clears the CSRF token cookie — call on logout.
42
+ */
43
+ export function clearCsrfToken(c) {
44
+ deleteCookie(c, COOKIE_CSRF_TOKEN, { path: '/' });
45
+ }
46
+ export const csrfProtection = (options = {}) => {
47
+ const { exemptPaths = [], checkOrigin = true, allowedOrigins, signing } = options;
48
+ // Normalize allowed origins for origin validation
49
+ const originSet = new Set();
50
+ if (allowedOrigins) {
51
+ const origins = Array.isArray(allowedOrigins) ? allowedOrigins : [allowedOrigins];
52
+ for (const o of origins) {
53
+ // "*" is intentionally excluded: validating against a wildcard would accept any origin,
54
+ // defeating the check. When CORS is open, origin validation is meaningless.
55
+ if (o !== '*')
56
+ originSet.add(o.replace(/\/$/, ''));
57
+ }
58
+ }
59
+ if (checkOrigin && originSet.size === 0) {
60
+ // Warn in all environments — this is a one-time startup message, not per-request noise,
61
+ // and a misconfigured production deployment should surface it.
62
+ console.warn('[bunshot] csrfProtection: checkOrigin is enabled but no specific allowed origins are ' +
63
+ 'configured (CORS is "*" or allowedOrigins is unset). Origin validation is disabled — ' +
64
+ 'only the HMAC double-submit cookie check is active. Set security.cors to specific ' +
65
+ 'origins to enable origin validation.');
66
+ }
67
+ return async (c, next) => {
68
+ const secret = getCsrfSecret(c, signing);
69
+ // Set CSRF cookie on every response if not already present
70
+ const existingCsrf = getCookie(c, COOKIE_CSRF_TOKEN);
71
+ if (!existingCsrf) {
72
+ const token = generateCsrfToken(secret);
73
+ setCookie(c, COOKIE_CSRF_TOKEN, token, getCsrfCookieOptions(isProd(), getAuthRuntimeFromRequest(c).config));
74
+ }
75
+ // Only validate state-changing methods
76
+ if (!STATE_CHANGING_METHODS.has(c.req.method)) {
77
+ return next();
78
+ }
79
+ // Skip if no auth cookie present — not vulnerable to CSRF
80
+ const authCookie = getCookie(c, COOKIE_TOKEN);
81
+ if (!authCookie) {
82
+ return next();
83
+ }
84
+ // Skip exempt paths
85
+ const path = c.req.path;
86
+ for (const exempt of exemptPaths) {
87
+ if (exempt.endsWith('*')) {
88
+ if (path.startsWith(exempt.slice(0, -1)))
89
+ return next();
90
+ }
91
+ else {
92
+ if (path === exempt)
93
+ return next();
94
+ }
95
+ }
96
+ // Origin validation (secondary layer)
97
+ if (checkOrigin && originSet.size > 0) {
98
+ const origin = c.req.header('origin');
99
+ if (origin) {
100
+ const normalized = origin.replace(/\/$/, '');
101
+ if (!originSet.has(normalized)) {
102
+ getAuthRuntimeFromRequest(c).eventBus.emit('security.csrf.failed', {
103
+ path: c.req.path,
104
+ meta: { method: c.req.method, reason: 'origin_mismatch' },
105
+ });
106
+ return c.json({ error: 'CSRF origin mismatch' }, 403);
107
+ }
108
+ }
109
+ }
110
+ // Double submit cookie validation
111
+ const csrfCookie = getCookie(c, COOKIE_CSRF_TOKEN);
112
+ const csrfHeader = c.req.header(HEADER_CSRF_TOKEN);
113
+ if (!csrfCookie || !csrfHeader) {
114
+ getAuthRuntimeFromRequest(c).eventBus.emit('security.csrf.failed', {
115
+ path: c.req.path,
116
+ meta: { method: c.req.method, reason: 'token_missing' },
117
+ });
118
+ return c.json({ error: 'CSRF token missing' }, 403);
119
+ }
120
+ // Verify the cookie's HMAC signature (prevents cookie injection)
121
+ if (!verifyCsrfSignature(csrfCookie, secret)) {
122
+ getAuthRuntimeFromRequest(c).eventBus.emit('security.csrf.failed', {
123
+ path: c.req.path,
124
+ meta: { method: c.req.method, reason: 'token_invalid' },
125
+ });
126
+ return c.json({ error: 'CSRF token invalid' }, 403);
127
+ }
128
+ // Compare header value to cookie value
129
+ if (!timingSafeEqual(csrfHeader, csrfCookie)) {
130
+ getAuthRuntimeFromRequest(c).eventBus.emit('security.csrf.failed', {
131
+ path: c.req.path,
132
+ meta: { method: c.req.method, reason: 'token_mismatch' },
133
+ });
134
+ return c.json({ error: 'CSRF token mismatch' }, 403);
135
+ }
136
+ return next();
137
+ };
138
+ };
@@ -0,0 +1,4 @@
1
+ import type { MiddlewareHandler } from 'hono';
2
+ import type { AppEnv } from '../../../bunshot-core/src/index.js';
3
+ import type { AuthRuntimeContext } from '../runtime';
4
+ export declare const createIdentifyMiddleware: (authRuntime: AuthRuntimeContext) => MiddlewareHandler<AppEnv>;
@@ -0,0 +1,124 @@
1
+ import { verifyToken } from '../lib/jwt';
2
+ import { authTrace, log } from '../lib/logger';
3
+ import { getSuspended } from '../lib/suspension';
4
+ import { getCookie } from 'hono/cookie';
5
+ import { COOKIE_TOKEN, HEADER_USER_TOKEN, HttpError, sha256, timingSafeEqual, } from '../../../bunshot-core/src/index.js';
6
+ import { getClientIp } from '../../../bunshot-core/src/index.js';
7
+ function computeFingerprint(c, fields) {
8
+ const parts = fields.map(f => {
9
+ if (f === 'ip')
10
+ return getClientIp(c) ?? '';
11
+ if (f === 'ua')
12
+ return c.req.header('user-agent') ?? '';
13
+ return c.req.header('accept-language') ?? '';
14
+ });
15
+ return sha256(parts.join(':'));
16
+ }
17
+ export const createIdentifyMiddleware = (authRuntime) => async (c, next) => {
18
+ const authConfig = authRuntime.config;
19
+ const sessionRepo = authRuntime.repos.session;
20
+ c.set('authUserId', null);
21
+ c.set('roles', null);
22
+ c.set('sessionId', null);
23
+ c.set('authClientId', null);
24
+ c.set('tokenPayload', null);
25
+ // cookie for browsers, x-user-token header for non-browser clients
26
+ const token = getCookie(c, COOKIE_TOKEN) ?? c.req.header(HEADER_USER_TOKEN) ?? null;
27
+ log(`[identify] token=${token ? 'present' : 'absent'}`);
28
+ if (token) {
29
+ try {
30
+ const payload = await verifyToken(token, authConfig, authRuntime?.signing ?? c.get('bunshotCtx')?.signing ?? null);
31
+ c.set('tokenPayload', payload);
32
+ const sessionId = payload.sid;
33
+ if (!sessionId) {
34
+ // Check for M2M token (scope present, no sid)
35
+ if (payload.scope && payload.sub) {
36
+ c.set('authClientId', payload.sub);
37
+ log(`[identify] M2M token for clientId=${payload.sub}`);
38
+ }
39
+ else {
40
+ log('[identify] token missing sid claim — unauthenticated');
41
+ }
42
+ }
43
+ else {
44
+ const stored = await sessionRepo.getSession(sessionId, authConfig);
45
+ log('[identify] token verified, checking session...');
46
+ authTrace(`[identify] authUserId=${payload.sub}`);
47
+ if (timingSafeEqual(stored ?? '', token)) {
48
+ const signingCfg = authRuntime.signing ?? c.get('bunshotCtx')?.signing ?? null;
49
+ const bindingCfg = signingCfg?.sessionBinding;
50
+ if (bindingCfg) {
51
+ const bindingOpts = typeof bindingCfg === 'object' ? bindingCfg : {};
52
+ const fields = bindingOpts.fields ?? [
53
+ 'ip',
54
+ 'ua',
55
+ ];
56
+ const onMismatch = bindingOpts.onMismatch ?? 'unauthenticate';
57
+ const current = computeFingerprint(c, fields);
58
+ const storedFp = await sessionRepo.getSessionFingerprint(sessionId);
59
+ if (storedFp === null) {
60
+ // First authenticated request — store the fingerprint
61
+ sessionRepo.setSessionFingerprint(sessionId, current).catch(() => {
62
+ log('[identify] failed to store session fingerprint');
63
+ });
64
+ c.set('authUserId', payload.sub);
65
+ c.set('sessionId', sessionId);
66
+ }
67
+ else if (timingSafeEqual(storedFp, current)) {
68
+ c.set('authUserId', payload.sub);
69
+ c.set('sessionId', sessionId);
70
+ }
71
+ else {
72
+ log(`[identify] fingerprint mismatch, onMismatch=${onMismatch}`);
73
+ authTrace(`[identify] sessionId=${sessionId}`);
74
+ if (onMismatch === 'reject') {
75
+ throw new HttpError(401, 'Unauthorized', 'FINGERPRINT_MISMATCH');
76
+ }
77
+ else if (onMismatch === 'log-only') {
78
+ c.set('authUserId', payload.sub);
79
+ c.set('sessionId', sessionId);
80
+ }
81
+ // onMismatch === "unauthenticate" — leave authUserId null (already null)
82
+ }
83
+ }
84
+ else {
85
+ c.set('authUserId', payload.sub);
86
+ c.set('sessionId', sessionId);
87
+ }
88
+ if (c.get('authUserId')) {
89
+ if (authConfig.checkSuspensionOnIdentify) {
90
+ const suspensionStatus = await getSuspended(authRuntime.adapter, payload.sub).catch(() => ({ suspended: false }));
91
+ if (suspensionStatus.suspended) {
92
+ c.set('authUserId', null);
93
+ c.set('sessionId', null);
94
+ c.set('roles', null);
95
+ log(`[identify] userId=${payload.sub} is suspended — unauthenticated`);
96
+ }
97
+ }
98
+ }
99
+ if (c.get('authUserId')) {
100
+ authTrace(`[identify] authUserId=${payload.sub} sessionId=${sessionId}`);
101
+ // Auto-enable lastActiveAt tracking when idleTimeout is configured
102
+ if (authConfig.trackLastActive || authConfig.sessionPolicy.idleTimeout) {
103
+ sessionRepo.updateSessionLastActive(sessionId, authConfig).catch(() => {
104
+ log('[identify] failed to update session lastActiveAt');
105
+ });
106
+ }
107
+ }
108
+ }
109
+ else {
110
+ log('[identify] token/session mismatch — unauthenticated');
111
+ }
112
+ }
113
+ }
114
+ catch (err) {
115
+ if (err instanceof HttpError)
116
+ throw err;
117
+ log('[identify] invalid token — unauthenticated');
118
+ }
119
+ }
120
+ else {
121
+ log('[identify] no token — unauthenticated');
122
+ }
123
+ await next();
124
+ };
@@ -1,5 +1,5 @@
1
- import type { MiddlewareHandler } from "hono";
2
- import type { AppEnv } from "../lib/context";
1
+ import type { MiddlewareHandler } from 'hono';
2
+ import type { AppEnv } from '../../../bunshot-core/src/index.js';
3
3
  /**
4
4
  * Middleware that blocks authenticated users who have not completed MFA setup.
5
5
  *