@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,179 @@
1
+ // Auth-specific runtime configuration singletons.
2
+ // Framework-only config (appName, appRoles, corsConfig, etc.) stays in appConfig.ts.
3
+ let _primaryField = "email";
4
+ export const setPrimaryField = (field) => { _primaryField = field; };
5
+ export const getPrimaryField = () => _primaryField;
6
+ let _concealRegistrationConfig = null;
7
+ export const setConcealRegistrationConfig = (config) => { _concealRegistrationConfig = config; };
8
+ export const getConcealRegistrationConfig = () => _concealRegistrationConfig;
9
+ let _emailVerificationConfig = null;
10
+ export const setEmailVerificationConfig = (config) => { _emailVerificationConfig = config; };
11
+ export const getEmailVerificationConfig = () => _emailVerificationConfig;
12
+ const DEFAULT_TOKEN_EXPIRY = 60 * 60 * 24; // 24 hours
13
+ export const getTokenExpiry = () => _emailVerificationConfig?.tokenExpiry ?? DEFAULT_TOKEN_EXPIRY;
14
+ let _passwordResetConfig = null;
15
+ export const setPasswordResetConfig = (config) => { _passwordResetConfig = config; };
16
+ export const getPasswordResetConfig = () => _passwordResetConfig;
17
+ const DEFAULT_RESET_TOKEN_EXPIRY = 60 * 60; // 1 hour
18
+ export const getResetTokenExpiry = () => _passwordResetConfig?.tokenExpiry ?? DEFAULT_RESET_TOKEN_EXPIRY;
19
+ let _magicLinkConfig = null;
20
+ export const setMagicLinkConfig = (config) => { _magicLinkConfig = config; };
21
+ export const getMagicLinkConfig = () => _magicLinkConfig;
22
+ export const getMagicLinkTtl = () => _magicLinkConfig?.ttlSeconds ?? 900;
23
+ let _passwordPolicy = {};
24
+ export const setPasswordPolicy = (config) => { _passwordPolicy = config; };
25
+ export const getPasswordPolicy = () => _passwordPolicy;
26
+ export const getPasswordPolicyPreventReuse = () => _passwordPolicy.preventReuse ?? 0;
27
+ let _authCookieConfig = {};
28
+ let _csrfCookieConfig = {};
29
+ export function setAuthCookieConfig(c) { _authCookieConfig = c; }
30
+ export function getAuthCookieConfig() { return _authCookieConfig; }
31
+ export function setCsrfCookieConfig(c) { _csrfCookieConfig = c; }
32
+ export function getCsrfCookieConfig() { return _csrfCookieConfig; }
33
+ // ---------------------------------------------------------------------------
34
+ // Session policy
35
+ // ---------------------------------------------------------------------------
36
+ let _maxSessions = 6;
37
+ let _persistSessionMetadata = true;
38
+ let _includeInactiveSessions = false;
39
+ let _trackLastActive = false;
40
+ let _sessionPolicyConfig = {};
41
+ export const setMaxSessions = (n) => { _maxSessions = Number.isFinite(n) && n >= 1 ? Math.floor(n) : 1; };
42
+ export const getMaxSessions = () => _maxSessions;
43
+ export const setPersistSessionMetadata = (v) => { _persistSessionMetadata = v; };
44
+ export const getPersistSessionMetadata = () => _persistSessionMetadata;
45
+ export const setIncludeInactiveSessions = (v) => { _includeInactiveSessions = v; };
46
+ export const getIncludeInactiveSessions = () => _includeInactiveSessions;
47
+ export const setTrackLastActive = (v) => { _trackLastActive = v; };
48
+ export const getTrackLastActive = () => _trackLastActive;
49
+ export function setSessionPolicyConfig(p) { _sessionPolicyConfig = p; }
50
+ export function getSessionPolicyConfig() { return _sessionPolicyConfig; }
51
+ let _refreshTokenConfig = null;
52
+ export const setRefreshTokenConfig = (config) => { _refreshTokenConfig = config; };
53
+ export const getRefreshTokenConfig = () => _refreshTokenConfig;
54
+ const DEFAULT_ACCESS_TOKEN_EXPIRY = 900; // 15 min
55
+ const DEFAULT_REFRESH_TOKEN_EXPIRY = 2_592_000; // 30 days
56
+ const DEFAULT_ROTATION_GRACE_SECONDS = 30;
57
+ export const getAccessTokenExpiry = () => _refreshTokenConfig?.accessTokenExpiry ?? DEFAULT_ACCESS_TOKEN_EXPIRY;
58
+ export const getRefreshTokenExpiry = () => _refreshTokenConfig?.refreshTokenExpiry ?? DEFAULT_REFRESH_TOKEN_EXPIRY;
59
+ export const getRotationGraceSeconds = () => _refreshTokenConfig?.rotationGraceSeconds ?? DEFAULT_ROTATION_GRACE_SECONDS;
60
+ let _mfaConfig = null;
61
+ export const setMfaConfig = (config) => { _mfaConfig = config; };
62
+ export const getMfaConfig = () => _mfaConfig;
63
+ // getMfaIssuer is defined after the getAppName import below
64
+ // ---------------------------------------------------------------------------
65
+ // Forward reference: getAppName lives in appConfig.ts
66
+ // ---------------------------------------------------------------------------
67
+ import { getAppName } from "./appConfig";
68
+ export const getMfaIssuer = () => _mfaConfig?.issuer ?? getAppName();
69
+ export const getMfaAlgorithm = () => _mfaConfig?.algorithm ?? "SHA1";
70
+ export const getMfaDigits = () => _mfaConfig?.digits ?? 6;
71
+ export const getMfaPeriod = () => _mfaConfig?.period ?? 30;
72
+ export const getMfaRecoveryCodeCount = () => _mfaConfig?.recoveryCodes ?? 10;
73
+ export const getMfaChallengeTtl = () => _mfaConfig?.challengeTtlSeconds ?? 300;
74
+ export const getMfaEmailOtpConfig = () => _mfaConfig?.emailOtp ?? null;
75
+ export const getMfaEmailOtpCodeLength = () => _mfaConfig?.emailOtp?.codeLength ?? 6;
76
+ export const getMfaWebAuthnConfig = () => _mfaConfig?.webauthn ?? null;
77
+ export const getMfaRequired = () => _mfaConfig?.required ?? false;
78
+ export const getMfaWebAuthnAllowPasswordlessLogin = () => _mfaConfig?.webauthn?.allowPasswordlessLogin ?? false;
79
+ export const getMfaWebAuthnPasskeyMfaBypass = () => _mfaConfig?.webauthn?.passkeyMfaBypass ?? true;
80
+ // ---------------------------------------------------------------------------
81
+ // CSRF config
82
+ // ---------------------------------------------------------------------------
83
+ let _csrfEnabled = false;
84
+ export const setCsrfEnabled = (v) => { _csrfEnabled = v; };
85
+ export const getCsrfEnabled = () => _csrfEnabled;
86
+ let _signingConfig = null;
87
+ let _signingConfigured = false;
88
+ export const setSigningConfig = (config) => {
89
+ _signingConfig = config;
90
+ _signingConfigured = true;
91
+ };
92
+ export const getSigningConfig = () => _signingConfig;
93
+ export const isSigningConfigured = () => _signingConfigured;
94
+ /**
95
+ * Returns the active signing secret: signing.secret -> JWT_SECRET_PROD/DEV env var.
96
+ * Returns null when neither is configured - callers must handle this gracefully.
97
+ */
98
+ export const getSigningSecret = () => {
99
+ if (_signingConfig?.secret)
100
+ return _signingConfig.secret;
101
+ const isProd = process.env.NODE_ENV === "production";
102
+ const envKey = isProd ? "JWT_SECRET_PROD" : "JWT_SECRET_DEV";
103
+ const rawSecret = process.env[envKey];
104
+ return rawSecret ?? null;
105
+ };
106
+ let _jwtConfig = null;
107
+ export const setJwtConfig = (config) => { _jwtConfig = config; };
108
+ export const getJwtConfig = () => _jwtConfig;
109
+ export const getJwtIssuer = () => _jwtConfig?.issuer;
110
+ export const getJwtAudience = () => _jwtConfig?.audience;
111
+ let _breachedPasswordConfig = null;
112
+ export const setBreachedPasswordConfig = (config) => { _breachedPasswordConfig = config; };
113
+ export const getBreachedPasswordConfig = () => _breachedPasswordConfig;
114
+ let _oauthReauthConfig = null;
115
+ export const setOAuthReauthConfig = (config) => { _oauthReauthConfig = config; };
116
+ export const getOAuthReauthConfig = () => _oauthReauthConfig;
117
+ export const getOAuthReauthEnabled = () => _oauthReauthConfig?.enabled ?? false;
118
+ export const getOAuthReauthPromptType = () => _oauthReauthConfig?.promptType ?? "login";
119
+ let _stepUpConfig = null;
120
+ export const setStepUpConfig = (config) => { _stepUpConfig = config; };
121
+ export const getStepUpConfig = () => _stepUpConfig;
122
+ // ---------------------------------------------------------------------------
123
+ // Suspension config
124
+ // ---------------------------------------------------------------------------
125
+ let _checkSuspensionOnIdentify = false;
126
+ export const setCheckSuspensionOnIdentify = (v) => { _checkSuspensionOnIdentify = v; };
127
+ export const getCheckSuspensionOnIdentify = () => _checkSuspensionOnIdentify;
128
+ // ---------------------------------------------------------------------------
129
+ // CAPTCHA config
130
+ // ---------------------------------------------------------------------------
131
+ let _captchaConfig = null;
132
+ export const setCaptchaConfig = (config) => { _captchaConfig = config; };
133
+ export const getCaptchaConfig = () => _captchaConfig;
134
+ let _m2mConfig = null;
135
+ export const setM2MConfig = (config) => { _m2mConfig = config; };
136
+ export const getM2MConfig = () => _m2mConfig;
137
+ export const getM2MTokenExpiry = () => _m2mConfig?.tokenExpiry ?? 3600;
138
+ let _samlConfig = null;
139
+ export const setSamlConfig = (config) => { _samlConfig = config; };
140
+ export const getSamlConfig = () => _samlConfig;
141
+ let _oidcConfig = null;
142
+ export const setOidcConfig = (config) => { _oidcConfig = config; };
143
+ export const getOidcConfig = () => _oidcConfig;
144
+ let _scimConfig = null;
145
+ export const setScimConfig = (config) => { _scimConfig = config; };
146
+ export const getScimConfig = () => _scimConfig;
147
+ let _emailTemplatesConfig = null;
148
+ export const setEmailTemplatesConfig = (config) => { _emailTemplatesConfig = config; };
149
+ export const getEmailTemplatesConfig = () => _emailTemplatesConfig;
150
+ let _hooks = {};
151
+ export function setHooksConfig(h) { _hooks = h; }
152
+ export function getHooksConfig() { return _hooks; }
153
+ /**
154
+ * Parse data encryption keys from the BUNSHOT_DATA_ENCRYPTION_KEY env var.
155
+ * Env var format: comma-separated "keyId:base64key" pairs, first is active.
156
+ * Example: "v1:base64key1,v0:base64key0"
157
+ * Respects DEV/PROD split: BUNSHOT_DATA_ENCRYPTION_KEY_DEV / BUNSHOT_DATA_ENCRYPTION_KEY_PROD.
158
+ * Falls back to BUNSHOT_DATA_ENCRYPTION_KEY (no suffix).
159
+ * Returns [] when not set.
160
+ */
161
+ export function getDataEncryptionKeys() {
162
+ const isProd = process.env.NODE_ENV === "production";
163
+ const raw = (isProd ? process.env.BUNSHOT_DATA_ENCRYPTION_KEY_PROD : process.env.BUNSHOT_DATA_ENCRYPTION_KEY_DEV)
164
+ ?? process.env.BUNSHOT_DATA_ENCRYPTION_KEY
165
+ ?? "";
166
+ if (!raw.trim())
167
+ return [];
168
+ return raw.split(",").map((entry) => {
169
+ const colonIdx = entry.indexOf(":");
170
+ if (colonIdx === -1)
171
+ throw new Error(`getDataEncryptionKeys: invalid entry "${entry}" - expected "keyId:base64key"`);
172
+ const keyId = entry.slice(0, colonIdx).trim();
173
+ const keyBase64 = entry.slice(colonIdx + 1).trim();
174
+ const key = Buffer.from(keyBase64, "base64");
175
+ if (key.length !== 32)
176
+ throw new Error(`getDataEncryptionKeys: key "${keyId}" must be 32 bytes (got ${key.length})`);
177
+ return { keyId, key };
178
+ });
179
+ }
@@ -1,6 +1,7 @@
1
- import { OpenAPIHono, type Hook } from "@hono/zod-openapi";
2
- import type { ZodIssue } from "zod";
3
- import type { UploadResult } from "./storageAdapter";
1
+ import { OpenAPIHono, type Hook } from '@hono/zod-openapi';
2
+ import type { ZodIssue } from 'zod';
3
+ import type { UploadResult } from '../framework/lib/storageAdapter';
4
+ import type { AuthVariables } from '../../packages/bunshot-auth/src/lib/authContext';
4
5
  export interface ValidationErrorDetail {
5
6
  path: string;
6
7
  message: string;
@@ -14,9 +15,6 @@ export type ValidationErrorFormatter = (issues: ZodIssue[], requestId: string) =
14
15
  export declare const defaultValidationErrorFormatter: ValidationErrorFormatter;
15
16
  export type AppVariables = {
16
17
  requestId: string;
17
- authUserId: string | null;
18
- roles: string[] | null;
19
- sessionId: string | null;
20
18
  tenantId: string | null;
21
19
  tenantConfig: Record<string, unknown> | null;
22
20
  validationErrorFormatter: ValidationErrorFormatter;
@@ -24,7 +22,8 @@ export type AppVariables = {
24
22
  uploadBucket: string | undefined;
25
23
  };
26
24
  export type AppEnv = {
27
- Variables: AppVariables;
25
+ Variables: AppVariables & AuthVariables;
28
26
  };
29
27
  export declare const defaultHook: Hook<any, AppEnv, any, any>;
30
28
  export declare const createRouter: () => OpenAPIHono<AppEnv, {}, "/">;
29
+ export type { AuthVariables } from '../../packages/bunshot-auth/src/lib/authContext';
@@ -1,16 +1,16 @@
1
- import { OpenAPIHono } from "@hono/zod-openapi";
1
+ import { OpenAPIHono } from '@hono/zod-openapi';
2
2
  export const defaultValidationErrorFormatter = (issues, requestId) => {
3
- const error = issues.map((i) => i.message).join(", ");
3
+ const error = issues.map((i) => i.message).join(', ');
4
4
  const details = issues.map((i) => ({
5
- path: i.path.join("."),
5
+ path: i.path.join('.'),
6
6
  message: i.message,
7
7
  }));
8
8
  return { error, details, requestId };
9
9
  };
10
10
  export const defaultHook = (result, c) => {
11
11
  if (!result.success) {
12
- const requestId = c.get("requestId") ?? "unknown";
13
- const formatter = c.get("validationErrorFormatter") ?? defaultValidationErrorFormatter;
12
+ const requestId = c.get('requestId') ?? 'unknown';
13
+ const formatter = c.get('validationErrorFormatter') ?? defaultValidationErrorFormatter;
14
14
  try {
15
15
  return c.json(formatter(result.error.issues, requestId), 400);
16
16
  }
@@ -0,0 +1 @@
1
+ export { log, authTrace } from "../framework/lib/logger";
@@ -0,0 +1 @@
1
+ export { log, authTrace } from "../framework/lib/logger";
@@ -0,0 +1,58 @@
1
+ import type { Connection, Mongoose } from 'mongoose';
2
+ type MongooseModule = Mongoose;
3
+ export interface MongoCredentials {
4
+ user: string;
5
+ password: string;
6
+ host: string;
7
+ db: string;
8
+ }
9
+ export interface MongoConnections {
10
+ authConn: Connection;
11
+ appConn: Connection;
12
+ mongoose: MongooseModule;
13
+ }
14
+ /**
15
+ * Connect the auth connection to its dedicated MongoDB server.
16
+ *
17
+ * @param creds Credentials resolved by ISecretRepository. No process.env fallback.
18
+ */
19
+ export declare const connectAuthMongo: (creds: MongoCredentials) => Promise<{
20
+ authConn: Connection;
21
+ mongoose: MongooseModule;
22
+ }>;
23
+ /**
24
+ * Connect the app connection to its MongoDB server.
25
+ *
26
+ * @param creds Credentials resolved by ISecretRepository. No process.env fallback.
27
+ */
28
+ export declare const connectAppMongo: (creds: MongoCredentials) => Promise<{
29
+ appConn: Connection;
30
+ mongoose: MongooseModule;
31
+ }>;
32
+ /**
33
+ * Connect both auth and app connections to the same MongoDB server.
34
+ * Shorthand for single-DB setups.
35
+ *
36
+ * @param creds Credentials resolved by ISecretRepository. No process.env fallback.
37
+ */
38
+ export declare const connectMongo: (creds: MongoCredentials) => Promise<MongoConnections>;
39
+ /**
40
+ * Context-aware Mongo getter. Returns the instance-scoped connections from
41
+ * BunshotContext. Throws if no BunshotContext is attached to the app.
42
+ * Returns null when Mongo is not configured on the context.
43
+ */
44
+ export declare const getMongoFromApp: (app: object) => {
45
+ auth: Connection | null;
46
+ app: Connection | null;
47
+ } | null;
48
+ /**
49
+ * Close both auth and app Mongo connections.
50
+ * Accepts connections as parameters — no module-level state.
51
+ */
52
+ export declare const disconnectMongo: (authConn: Connection | null, appConn: Connection | null) => Promise<void>;
53
+ /**
54
+ * Get the mongoose module (lazy-loaded). Useful for consumers that need
55
+ * the mongoose module without a connection (e.g., Schema class access).
56
+ */
57
+ export declare const getMongooseModule: () => MongooseModule;
58
+ export {};
@@ -0,0 +1,96 @@
1
+ // MongoDB connection management — no module-level mutable state.
2
+ //
3
+ // Phase 1 singleton elimination: connect functions return their connections
4
+ // directly instead of storing them in module globals. Module-level proxy
5
+ // objects (authConnection, appConnection, mongoose) are removed.
6
+ // Use getMongoFromApp(app) for context-aware access.
7
+ import { log } from '../framework/lib/logger';
8
+ import { getContext } from '../../packages/bunshot-core/src/index.js';
9
+ /** Lazy mongoose module loader — caching a require() result, not runtime state. */
10
+ function requireMongoose() {
11
+ try {
12
+ // Bun supports require() in ESM; this defers the import to call time
13
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
14
+ const mod = require('mongoose');
15
+ return (mod.default ?? mod);
16
+ }
17
+ catch {
18
+ throw new Error('mongoose is not installed. Run: bun add mongoose');
19
+ }
20
+ }
21
+ function buildUri(user, password, host, db) {
22
+ const [hostPart, queryPart] = host.split('?');
23
+ return `mongodb+srv://${encodeURIComponent(user)}:${encodeURIComponent(password)}@${hostPart.replace(/\/$/, '')}/${db}${queryPart ? `?${queryPart}` : ''}`;
24
+ }
25
+ /**
26
+ * Connect the auth connection to its dedicated MongoDB server.
27
+ *
28
+ * @param creds Credentials resolved by ISecretRepository. No process.env fallback.
29
+ */
30
+ export const connectAuthMongo = async (creds) => {
31
+ const mg = requireMongoose();
32
+ const authConn = mg.createConnection();
33
+ const uri = buildUri(creds.user, creds.password, creds.host, creds.db);
34
+ await authConn.openUri(uri);
35
+ log(`[mongo] auth connected to ${creds.host} as ${creds.user}`);
36
+ return { authConn, mongoose: mg };
37
+ };
38
+ /**
39
+ * Connect the app connection to its MongoDB server.
40
+ *
41
+ * @param creds Credentials resolved by ISecretRepository. No process.env fallback.
42
+ */
43
+ export const connectAppMongo = async (creds) => {
44
+ const mg = requireMongoose();
45
+ const appConn = mg.createConnection();
46
+ const uri = buildUri(creds.user, creds.password, creds.host, creds.db);
47
+ await appConn.openUri(uri);
48
+ log(`[mongo] app connected to ${creds.host} as ${creds.user}`);
49
+ return { appConn, mongoose: mg };
50
+ };
51
+ /**
52
+ * Connect both auth and app connections to the same MongoDB server.
53
+ * Shorthand for single-DB setups.
54
+ *
55
+ * @param creds Credentials resolved by ISecretRepository. No process.env fallback.
56
+ */
57
+ export const connectMongo = async (creds) => {
58
+ const mg = requireMongoose();
59
+ const authConn = mg.createConnection();
60
+ const appConn = mg.createConnection();
61
+ const uri = buildUri(creds.user, creds.password, creds.host, creds.db);
62
+ await Promise.all([authConn.openUri(uri), appConn.openUri(uri)]);
63
+ log(`[mongo] connected to ${creds.host} as ${creds.user}`);
64
+ return { authConn, appConn, mongoose: mg };
65
+ };
66
+ /**
67
+ * Context-aware Mongo getter. Returns the instance-scoped connections from
68
+ * BunshotContext. Throws if no BunshotContext is attached to the app.
69
+ * Returns null when Mongo is not configured on the context.
70
+ */
71
+ export const getMongoFromApp = (app) => {
72
+ const ctx = getContext(app);
73
+ if (ctx.mongo) {
74
+ return {
75
+ auth: ctx.mongo.auth ?? null,
76
+ app: ctx.mongo.app ?? null,
77
+ };
78
+ }
79
+ return null;
80
+ };
81
+ /**
82
+ * Close both auth and app Mongo connections.
83
+ * Accepts connections as parameters — no module-level state.
84
+ */
85
+ export const disconnectMongo = async (authConn, appConn) => {
86
+ await Promise.all([
87
+ authConn && authConn.readyState !== 0 ? authConn.close() : Promise.resolve(),
88
+ appConn && appConn.readyState !== 0 ? appConn.close() : Promise.resolve(),
89
+ ]);
90
+ log('[mongo] disconnected');
91
+ };
92
+ /**
93
+ * Get the mongoose module (lazy-loaded). Useful for consumers that need
94
+ * the mongoose module without a connection (e.g., Schema class access).
95
+ */
96
+ export const getMongooseModule = () => requireMongoose();
@@ -0,0 +1,72 @@
1
+ import type { Job, Processor, QueueOptions, Queue as QueueType, WorkerOptions, Worker as WorkerType } from 'bullmq';
2
+ import { type RedisCredentials } from './redis';
3
+ export interface CronSchedule {
4
+ /** Cron expression. Mutually exclusive with `every`. */
5
+ cron?: string;
6
+ /** Interval in milliseconds. Mutually exclusive with `cron`. */
7
+ every?: number;
8
+ /** Timezone for cron expressions. */
9
+ timezone?: string;
10
+ }
11
+ export interface DLQOptions<T = unknown> {
12
+ /** Max jobs to keep in the DLQ. Default: 1000. */
13
+ maxSize?: number;
14
+ /** Called when a job is moved to the DLQ. */
15
+ onDeadLetter?: (job: Job<T>, error: Error) => Promise<void>;
16
+ /** Auto-retry delay in ms. No auto-retry by default. */
17
+ retryAfter?: number;
18
+ /** Preserve original job options on retry. Default: true. */
19
+ preserveJobOptions?: boolean;
20
+ }
21
+ export interface QueueFactory {
22
+ createQueue<T = unknown, R = unknown>(name: string, options?: Omit<QueueOptions, 'connection'>): QueueType<T, R>;
23
+ createWorker<T = unknown, R = unknown>(name: string, processor: Processor<T, R>, options?: Omit<WorkerOptions, 'connection'>): WorkerType<T, R>;
24
+ createCronWorker<T = void, R = unknown>(name: string, processor: Processor<T, R>, schedule: CronSchedule, options?: Omit<WorkerOptions, 'connection'>): {
25
+ worker: WorkerType<T, R>;
26
+ queue: QueueType<T, R>;
27
+ registeredName: string;
28
+ };
29
+ cleanupStaleSchedulers(activeNames: string[], registeredNames: ReadonlySet<string>): Promise<void>;
30
+ createDLQHandler<T = unknown>(sourceWorker: WorkerType<T>, sourceQueueName: string, options?: DLQOptions<T>): {
31
+ dlqQueue: QueueType<T>;
32
+ retryJob: (jobId: string) => Promise<void>;
33
+ };
34
+ }
35
+ export declare function createQueueFactory(credentials: RedisCredentials): QueueFactory;
36
+ export declare function createQueue<T = unknown, R = unknown>(name: string, options?: Omit<QueueOptions, 'connection'>, credentials?: RedisCredentials): QueueType<T, R>;
37
+ export declare function createWorker<T = unknown, R = unknown>(name: string, processor: Processor<T, R>, options?: Omit<WorkerOptions, 'connection'>, credentials?: RedisCredentials): WorkerType<T, R>;
38
+ export declare function createCronWorker<T = void, R = unknown>(name: string, processor: Processor<T, R>, schedule: CronSchedule, options?: Omit<WorkerOptions, 'connection'>, credentials?: RedisCredentials): {
39
+ worker: WorkerType<T, R>;
40
+ queue: QueueType<T, R>;
41
+ registeredName: string;
42
+ };
43
+ export declare function cleanupStaleSchedulers(activeNames: string[], registeredNames: ReadonlySet<string>, credentials?: RedisCredentials): Promise<void>;
44
+ export declare function createDLQHandler<T = unknown>(sourceWorker: WorkerType<T>, sourceQueueName: string, options?: DLQOptions<T>, credentials?: RedisCredentials): {
45
+ dlqQueue: QueueType<T>;
46
+ retryJob: (jobId: string) => Promise<void>;
47
+ };
48
+ /**
49
+ * Contract for worker files loaded by createServer()'s worker discovery.
50
+ *
51
+ * A worker file's default export should be a BunshotWorker. The framework
52
+ * calls it at startup with a properly-credentialed QueueFactory and collects
53
+ * the returned names for scheduler lifecycle management.
54
+ *
55
+ * @example
56
+ * ```ts
57
+ * // workers/digest.ts
58
+ * import type { BunshotWorker } from 'bunshot/queue'
59
+ *
60
+ * const worker: BunshotWorker = async (factory) => {
61
+ * const { registeredName } = factory.createCronWorker(
62
+ * 'digest-emails',
63
+ * digestProcessor,
64
+ * { cron: '0 9 * * *' },
65
+ * )
66
+ * return [registeredName]
67
+ * }
68
+ * export default worker
69
+ * ```
70
+ */
71
+ export type BunshotWorker = (factory: QueueFactory) => string[] | Promise<string[]>;
72
+ export type { Job, RedisCredentials as QueueRedisCredentials };
@@ -0,0 +1,152 @@
1
+ import { getRedisConnectionOptions } from './redis';
2
+ function requireBullMQ() {
3
+ try {
4
+ // Bun supports require() in ESM; this defers the import to call time.
5
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
6
+ return require('bullmq');
7
+ }
8
+ catch {
9
+ throw new Error('bullmq is not installed. Run: bun add bullmq');
10
+ }
11
+ }
12
+ function requireQueueRedisCredentials(credentials) {
13
+ if (!credentials?.host) {
14
+ throw new Error('Queue helpers require explicit Redis credentials. Resolve Redis secrets at startup and pass them to createQueueFactory(...) or as the final queue helper argument.');
15
+ }
16
+ return credentials;
17
+ }
18
+ function getQueueRedisConnectionOptions(credentials) {
19
+ return getRedisConnectionOptions(credentials);
20
+ }
21
+ function buildQueueHelpers(getConnectionOptions) {
22
+ return {
23
+ createQueue(name, options) {
24
+ const { Queue } = requireBullMQ();
25
+ return new Queue(name, { connection: getConnectionOptions(), ...options });
26
+ },
27
+ createWorker(name, processor, options) {
28
+ const { Worker } = requireBullMQ();
29
+ return new Worker(name, processor, {
30
+ connection: getConnectionOptions(),
31
+ ...options,
32
+ });
33
+ },
34
+ createCronWorker(name, processor, schedule, options) {
35
+ const { Queue, Worker } = requireBullMQ();
36
+ const connection = getConnectionOptions();
37
+ const queue = new Queue(name, { connection });
38
+ const worker = new Worker(name, processor, { connection, ...options });
39
+ // Use upsertJobScheduler — idempotent across restarts.
40
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any -- BullMQ's ExtractNameType<T>
41
+ // constrains the scheduler ID to match job data's `name` field, but we use a plain
42
+ // string ID. The runtime API accepts any string; the generic constraint is overly
43
+ // narrow for scheduler IDs.
44
+ const q = queue;
45
+ if (schedule.cron) {
46
+ q.upsertJobScheduler(name, { pattern: schedule.cron, tz: schedule.timezone }, { name });
47
+ }
48
+ else if (schedule.every) {
49
+ q.upsertJobScheduler(name, { every: schedule.every }, { name });
50
+ }
51
+ return { worker, queue, registeredName: name };
52
+ },
53
+ async cleanupStaleSchedulers(activeNames, registeredNames) {
54
+ const { Queue } = requireBullMQ();
55
+ const connection = getConnectionOptions();
56
+ const activeSet = new Set(activeNames);
57
+ for (const name of registeredNames) {
58
+ if (activeSet.has(name))
59
+ continue;
60
+ const queue = new Queue(name, { connection });
61
+ try {
62
+ await queue.removeJobScheduler(name);
63
+ }
64
+ catch {
65
+ /* scheduler may not exist */
66
+ }
67
+ await queue.close();
68
+ }
69
+ },
70
+ createDLQHandler(sourceWorker, sourceQueueName, options) {
71
+ const { Queue } = requireBullMQ();
72
+ const connection = getConnectionOptions();
73
+ const dlqName = `${sourceQueueName}-dlq`;
74
+ const dlqQueue = new Queue(dlqName, { connection });
75
+ const maxSize = options?.maxSize ?? 1000;
76
+ const preserveJobOptions = options?.preserveJobOptions ?? true;
77
+ sourceWorker.on('failed', async (job, error) => {
78
+ if (!job)
79
+ return;
80
+ if (job.attemptsMade < (job.opts?.attempts ?? 1))
81
+ return;
82
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any -- BullMQ's ExtractNameType<T>
83
+ // constrains job names to literal types from the data shape, but DLQ jobs use
84
+ // dynamic `dlq:` prefixed names.
85
+ await dlqQueue.add(`dlq:${job.name}`, job.data, {
86
+ ...(preserveJobOptions
87
+ ? {
88
+ delay: job.opts?.delay,
89
+ priority: job.opts?.priority,
90
+ attempts: job.opts?.attempts,
91
+ backoff: job.opts?.backoff,
92
+ }
93
+ : {}),
94
+ jobId: `dlq:${job.id}`,
95
+ });
96
+ if (options?.onDeadLetter) {
97
+ try {
98
+ await options.onDeadLetter(job, error);
99
+ }
100
+ catch (e) {
101
+ console.error(`[dlq:${sourceQueueName}] onDeadLetter callback error:`, e);
102
+ }
103
+ }
104
+ const waitingCount = await dlqQueue.getWaitingCount();
105
+ if (waitingCount > maxSize) {
106
+ const excess = waitingCount - maxSize;
107
+ const jobs = await dlqQueue.getWaiting(0, excess - 1);
108
+ for (const j of jobs) {
109
+ await j.remove();
110
+ }
111
+ }
112
+ });
113
+ const sourceQueue = new Queue(sourceQueueName, { connection });
114
+ const retryJob = async (jobId) => {
115
+ const job = await dlqQueue.getJob(jobId);
116
+ if (!job)
117
+ throw new Error(`Job ${jobId} not found in DLQ`);
118
+ const retryOptions = preserveJobOptions
119
+ ? {
120
+ delay: job.opts?.delay,
121
+ priority: job.opts?.priority,
122
+ attempts: job.opts?.attempts,
123
+ backoff: job.opts?.backoff,
124
+ }
125
+ : {};
126
+ await sourceQueue.add(job.name, job.data, retryOptions);
127
+ await job.remove();
128
+ };
129
+ return { dlqQueue, retryJob };
130
+ },
131
+ };
132
+ }
133
+ export function createQueueFactory(credentials) {
134
+ const resolvedCredentials = requireQueueRedisCredentials(credentials);
135
+ const getConnectionOptions = () => getQueueRedisConnectionOptions(resolvedCredentials);
136
+ return buildQueueHelpers(getConnectionOptions);
137
+ }
138
+ export function createQueue(name, options, credentials) {
139
+ return createQueueFactory(requireQueueRedisCredentials(credentials)).createQueue(name, options);
140
+ }
141
+ export function createWorker(name, processor, options, credentials) {
142
+ return createQueueFactory(requireQueueRedisCredentials(credentials)).createWorker(name, processor, options);
143
+ }
144
+ export function createCronWorker(name, processor, schedule, options, credentials) {
145
+ return createQueueFactory(requireQueueRedisCredentials(credentials)).createCronWorker(name, processor, schedule, options);
146
+ }
147
+ export function cleanupStaleSchedulers(activeNames, registeredNames, credentials) {
148
+ return createQueueFactory(requireQueueRedisCredentials(credentials)).cleanupStaleSchedulers(activeNames, registeredNames);
149
+ }
150
+ export function createDLQHandler(sourceWorker, sourceQueueName, options, credentials) {
151
+ return createQueueFactory(requireQueueRedisCredentials(credentials)).createDLQHandler(sourceWorker, sourceQueueName, options);
152
+ }
@@ -0,0 +1,28 @@
1
+ import type { default as RedisClass, RedisOptions } from 'ioredis';
2
+ export interface RedisCredentials {
3
+ /** Redis host:port (e.g., "localhost:6379") */
4
+ host: string;
5
+ /** Redis username */
6
+ user?: string;
7
+ /** Redis password */
8
+ password?: string;
9
+ }
10
+ export declare const getRedisConnectionOptions: (creds: RedisCredentials) => RedisOptions;
11
+ /**
12
+ * Connect to Redis and return the client.
13
+ * The caller is responsible for storing the client (e.g., on BunshotContext).
14
+ *
15
+ * @param creds Credentials resolved by ISecretRepository. No process.env fallback.
16
+ */
17
+ export declare const connectRedis: (creds: RedisCredentials) => Promise<RedisClass>;
18
+ /**
19
+ * Gracefully close the Redis connection.
20
+ * Accepts the client as parameter — no module-level state.
21
+ */
22
+ export declare const disconnectRedis: (client: RedisClass | null) => Promise<void>;
23
+ /**
24
+ * Context-aware Redis getter. Returns the instance-scoped Redis from
25
+ * BunshotContext, or null when Redis is not configured on the context.
26
+ * Throws if no BunshotContext is attached to the app.
27
+ */
28
+ export declare const getRedisFromApp: (app: object) => RedisClass | null;