@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,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
+ }
@@ -0,0 +1,14 @@
1
+ import type { AuthAdapter } from '../lib/authAdapter';
2
+ /**
3
+ * Suspend or unsuspend a user.
4
+ * No-op when the adapter does not implement setSuspended.
5
+ */
6
+ export declare function setSuspended(adapter: AuthAdapter, userId: string, suspended: boolean, reason?: string): Promise<void>;
7
+ /**
8
+ * Get the suspension status of a user.
9
+ * Returns { suspended: false } when the adapter does not implement getSuspended.
10
+ */
11
+ export declare function getSuspended(adapter: AuthAdapter, userId: string): Promise<{
12
+ suspended: boolean;
13
+ suspendedReason?: string;
14
+ }>;
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Suspend or unsuspend a user.
3
+ * No-op when the adapter does not implement setSuspended.
4
+ */
5
+ export async function setSuspended(adapter, userId, suspended, reason) {
6
+ if (adapter.setSuspended) {
7
+ await adapter.setSuspended(userId, suspended, reason);
8
+ }
9
+ }
10
+ /**
11
+ * Get the suspension status of a user.
12
+ * Returns { suspended: false } when the adapter does not implement getSuspended.
13
+ */
14
+ export async function getSuspended(adapter, userId) {
15
+ if (adapter.getSuspended) {
16
+ const result = await adapter.getSuspended(userId);
17
+ return result ?? { suspended: false };
18
+ }
19
+ return { suspended: false };
20
+ }
@@ -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
  *