@lastshotlabs/bunshot 0.0.27 → 0.0.28

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (742) hide show
  1. package/.oclif.manifest.json +39 -0
  2. package/README.md +8282 -2147
  3. package/dist/cli/commands/init.js +690 -0
  4. package/dist/cli/index.js +6 -0
  5. package/dist/cli.js +4 -4
  6. package/dist/packages/bunshot-admin/src/index.d.ts +15 -0
  7. package/dist/packages/bunshot-admin/src/index.js +11 -0
  8. package/dist/packages/bunshot-admin/src/lib/resourceTypes.d.ts +8 -0
  9. package/dist/packages/bunshot-admin/src/lib/resourceTypes.js +33 -0
  10. package/dist/packages/bunshot-admin/src/lib/typedRoute.d.ts +14 -0
  11. package/dist/packages/bunshot-admin/src/lib/typedRoute.js +17 -0
  12. package/dist/packages/bunshot-admin/src/plugin.d.ts +4 -0
  13. package/dist/packages/bunshot-admin/src/plugin.js +46 -0
  14. package/dist/packages/bunshot-admin/src/providers/auth0Access.d.ts +6 -0
  15. package/dist/packages/bunshot-admin/src/providers/auth0Access.js +32 -0
  16. package/dist/packages/bunshot-admin/src/routes/admin.d.ts +10 -0
  17. package/dist/packages/bunshot-admin/src/routes/admin.js +923 -0
  18. package/dist/packages/bunshot-admin/src/routes/mail.d.ts +6 -0
  19. package/dist/packages/bunshot-admin/src/routes/mail.js +114 -0
  20. package/dist/packages/bunshot-admin/src/routes/permissions.d.ts +8 -0
  21. package/dist/packages/bunshot-admin/src/routes/permissions.js +315 -0
  22. package/dist/packages/bunshot-admin/src/types/config.d.ts +16 -0
  23. package/dist/packages/bunshot-admin/src/types/config.js +37 -0
  24. package/dist/packages/bunshot-admin/src/types/env.d.ts +14 -0
  25. package/dist/packages/bunshot-admin/src/types/provider.d.ts +1 -0
  26. package/dist/packages/bunshot-admin/src/types/provider.js +4 -0
  27. package/dist/packages/bunshot-auth/src/adapters/memoryAuth.d.ts +66 -0
  28. package/dist/packages/bunshot-auth/src/adapters/memoryAuth.js +1063 -0
  29. package/dist/packages/bunshot-auth/src/adapters/mongoAuth.d.ts +2 -0
  30. package/dist/packages/bunshot-auth/src/adapters/mongoAuth.js +536 -0
  31. package/dist/packages/bunshot-auth/src/adapters/sqliteAuth.d.ts +88 -0
  32. package/dist/packages/bunshot-auth/src/adapters/sqliteAuth.js +1366 -0
  33. package/dist/packages/bunshot-auth/src/admin/bunshotAccess.d.ts +2 -0
  34. package/dist/packages/bunshot-auth/src/admin/bunshotAccess.js +23 -0
  35. package/dist/packages/bunshot-auth/src/admin/bunshotUsers.d.ts +5 -0
  36. package/dist/packages/bunshot-auth/src/admin/bunshotUsers.js +131 -0
  37. package/dist/packages/bunshot-auth/src/bootstrap.d.ts +38 -0
  38. package/dist/packages/bunshot-auth/src/bootstrap.js +384 -0
  39. package/dist/packages/bunshot-auth/src/config/appConfig.d.ts +3 -0
  40. package/dist/packages/bunshot-auth/src/config/appConfig.js +4 -0
  41. package/dist/packages/bunshot-auth/src/config/authConfig.d.ts +478 -0
  42. package/dist/packages/bunshot-auth/src/config/authConfig.js +46 -0
  43. package/dist/packages/bunshot-auth/src/config/configLock.d.ts +2 -0
  44. package/dist/packages/bunshot-auth/src/config/configLock.js +10 -0
  45. package/dist/packages/bunshot-auth/src/index.d.ts +25 -0
  46. package/dist/packages/bunshot-auth/src/index.js +23 -0
  47. package/dist/packages/bunshot-auth/src/infra/mongo.d.ts +15 -0
  48. package/dist/packages/bunshot-auth/src/infra/mongo.js +44 -0
  49. package/dist/packages/bunshot-auth/src/infra/queue.d.ts +14 -0
  50. package/dist/packages/bunshot-auth/src/infra/queue.js +27 -0
  51. package/dist/packages/bunshot-auth/src/infra/redis.d.ts +5 -0
  52. package/dist/packages/bunshot-auth/src/infra/redis.js +15 -0
  53. package/dist/packages/bunshot-auth/src/infra/signing.d.ts +7 -0
  54. package/dist/packages/bunshot-auth/src/infra/signing.js +8 -0
  55. package/dist/packages/bunshot-auth/src/lib/accountLockout.d.ts +34 -0
  56. package/dist/packages/bunshot-auth/src/lib/accountLockout.js +244 -0
  57. package/dist/packages/bunshot-auth/src/lib/adapterTiers.d.ts +1 -0
  58. package/dist/packages/bunshot-auth/src/lib/adapterTiers.js +1 -0
  59. package/dist/packages/bunshot-auth/src/lib/authAdapter.d.ts +1 -0
  60. package/dist/packages/bunshot-auth/src/lib/authAdapter.js +1 -0
  61. package/dist/packages/bunshot-auth/src/lib/authContext.d.ts +15 -0
  62. package/dist/packages/bunshot-auth/src/lib/authContext.js +1 -0
  63. package/dist/packages/bunshot-auth/src/lib/authEventBus.d.ts +4 -0
  64. package/dist/packages/bunshot-auth/src/lib/authEventBus.js +15 -0
  65. package/dist/packages/bunshot-auth/src/lib/authRateLimit.d.ts +28 -0
  66. package/dist/packages/bunshot-auth/src/lib/authRateLimit.js +205 -0
  67. package/dist/{lib → packages/bunshot-auth/src/lib}/breachedPassword.d.ts +8 -2
  68. package/dist/{lib → packages/bunshot-auth/src/lib}/breachedPassword.js +22 -9
  69. package/dist/packages/bunshot-auth/src/lib/cache.d.ts +12 -0
  70. package/dist/packages/bunshot-auth/src/lib/cache.js +120 -0
  71. package/dist/packages/bunshot-auth/src/lib/clientIp.d.ts +4 -0
  72. package/dist/{lib → packages/bunshot-auth/src/lib}/clientIp.js +14 -7
  73. package/dist/packages/bunshot-auth/src/lib/cookieOptions.d.ts +27 -0
  74. package/dist/packages/bunshot-auth/src/lib/cookieOptions.js +33 -0
  75. package/dist/packages/bunshot-auth/src/lib/credentialStuffing.d.ts +40 -0
  76. package/dist/packages/bunshot-auth/src/lib/credentialStuffing.js +221 -0
  77. package/dist/packages/bunshot-auth/src/lib/deletionCancelToken.d.ts +19 -0
  78. package/dist/packages/bunshot-auth/src/lib/deletionCancelToken.js +148 -0
  79. package/dist/packages/bunshot-auth/src/lib/emailTemplates.d.ts +23 -0
  80. package/dist/packages/bunshot-auth/src/lib/emailTemplates.js +265 -0
  81. package/dist/packages/bunshot-auth/src/lib/emailVerification.d.ts +30 -0
  82. package/dist/packages/bunshot-auth/src/lib/emailVerification.js +200 -0
  83. package/dist/packages/bunshot-auth/src/lib/env.d.ts +1 -0
  84. package/dist/packages/bunshot-auth/src/lib/env.js +3 -0
  85. package/dist/packages/bunshot-auth/src/lib/fingerprint.js +36 -0
  86. package/dist/{lib → packages/bunshot-auth/src/lib}/groups.d.ts +15 -16
  87. package/dist/{lib → packages/bunshot-auth/src/lib}/groups.js +22 -34
  88. package/dist/packages/bunshot-auth/src/lib/jwks.d.ts +28 -0
  89. package/dist/packages/bunshot-auth/src/lib/jwks.js +79 -0
  90. package/dist/packages/bunshot-auth/src/lib/jwt.d.ts +12 -0
  91. package/dist/packages/bunshot-auth/src/lib/jwt.js +86 -0
  92. package/dist/{lib → packages/bunshot-auth/src/lib}/logger.js +3 -3
  93. package/dist/{lib → packages/bunshot-auth/src/lib}/m2m.d.ts +5 -4
  94. package/dist/{lib → packages/bunshot-auth/src/lib}/m2m.js +6 -10
  95. package/dist/packages/bunshot-auth/src/lib/magicLink.d.ts +13 -0
  96. package/dist/packages/bunshot-auth/src/lib/magicLink.js +145 -0
  97. package/dist/packages/bunshot-auth/src/lib/mfaChallenge.d.ts +60 -0
  98. package/dist/packages/bunshot-auth/src/lib/mfaChallenge.js +419 -0
  99. package/dist/packages/bunshot-auth/src/lib/oauth.d.ts +82 -0
  100. package/dist/packages/bunshot-auth/src/lib/oauth.js +177 -0
  101. package/dist/packages/bunshot-auth/src/lib/oauthCode.d.ts +19 -0
  102. package/dist/packages/bunshot-auth/src/lib/oauthCode.js +182 -0
  103. package/dist/packages/bunshot-auth/src/lib/oauthReauth.d.ts +19 -0
  104. package/dist/packages/bunshot-auth/src/lib/oauthReauth.js +255 -0
  105. package/dist/packages/bunshot-auth/src/lib/organization.d.ts +66 -0
  106. package/dist/packages/bunshot-auth/src/lib/organization.js +225 -0
  107. package/dist/packages/bunshot-auth/src/lib/passwordHistory.d.ts +12 -0
  108. package/dist/packages/bunshot-auth/src/lib/passwordHistory.js +31 -0
  109. package/dist/packages/bunshot-auth/src/lib/resetPassword.d.ts +20 -0
  110. package/dist/packages/bunshot-auth/src/lib/resetPassword.js +148 -0
  111. package/dist/packages/bunshot-auth/src/lib/roles.d.ts +9 -0
  112. package/dist/packages/bunshot-auth/src/lib/roles.js +93 -0
  113. package/dist/packages/bunshot-auth/src/lib/saml.d.ts +29 -0
  114. package/dist/packages/bunshot-auth/src/lib/saml.js +73 -0
  115. package/dist/packages/bunshot-auth/src/lib/samlRequestId.d.ts +13 -0
  116. package/dist/packages/bunshot-auth/src/lib/samlRequestId.js +129 -0
  117. package/dist/{lib → packages/bunshot-auth/src/lib}/scim.d.ts +7 -7
  118. package/dist/{lib → packages/bunshot-auth/src/lib}/scim.js +15 -13
  119. package/dist/packages/bunshot-auth/src/lib/securityEventWiring.d.ts +22 -0
  120. package/dist/packages/bunshot-auth/src/lib/securityEventWiring.js +65 -0
  121. package/dist/packages/bunshot-auth/src/lib/session.d.ts +45 -0
  122. package/dist/packages/bunshot-auth/src/lib/session.js +1211 -0
  123. package/dist/packages/bunshot-auth/src/lib/storeInfra.d.ts +26 -0
  124. package/dist/packages/bunshot-auth/src/lib/storeInfra.js +18 -0
  125. package/dist/{lib → packages/bunshot-auth/src/lib}/suspension.d.ts +3 -2
  126. package/dist/{lib → packages/bunshot-auth/src/lib}/suspension.js +2 -5
  127. package/dist/packages/bunshot-auth/src/lib/validateAdapter.d.ts +16 -0
  128. package/dist/packages/bunshot-auth/src/lib/validateAdapter.js +161 -0
  129. package/dist/packages/bunshot-auth/src/middleware/bearerAuth.d.ts +13 -0
  130. package/dist/packages/bunshot-auth/src/middleware/bearerAuth.js +58 -0
  131. package/dist/{middleware → packages/bunshot-auth/src/middleware}/csrf.d.ts +5 -4
  132. package/dist/packages/bunshot-auth/src/middleware/csrf.js +138 -0
  133. package/dist/packages/bunshot-auth/src/middleware/identify.d.ts +4 -0
  134. package/dist/packages/bunshot-auth/src/middleware/identify.js +124 -0
  135. package/dist/{middleware → packages/bunshot-auth/src/middleware}/requireMfaSetup.d.ts +2 -2
  136. package/dist/{middleware → packages/bunshot-auth/src/middleware}/requireMfaSetup.js +10 -8
  137. package/dist/{middleware → packages/bunshot-auth/src/middleware}/requireRole.d.ts +2 -2
  138. package/dist/{middleware → packages/bunshot-auth/src/middleware}/requireRole.js +20 -16
  139. package/dist/{middleware → packages/bunshot-auth/src/middleware}/requireScope.d.ts +2 -2
  140. package/dist/{middleware → packages/bunshot-auth/src/middleware}/requireScope.js +6 -6
  141. package/dist/{middleware → packages/bunshot-auth/src/middleware}/requireStepUp.d.ts +2 -2
  142. package/dist/{middleware → packages/bunshot-auth/src/middleware}/requireStepUp.js +8 -7
  143. package/dist/{middleware → packages/bunshot-auth/src/middleware}/requireVerifiedEmail.d.ts +2 -2
  144. package/dist/{middleware → packages/bunshot-auth/src/middleware}/requireVerifiedEmail.js +7 -6
  145. package/dist/packages/bunshot-auth/src/middleware/scimAuth.d.ts +8 -0
  146. package/dist/packages/bunshot-auth/src/middleware/scimAuth.js +29 -0
  147. package/dist/packages/bunshot-auth/src/middleware/userAuth.d.ts +3 -0
  148. package/dist/packages/bunshot-auth/src/middleware/userAuth.js +6 -0
  149. package/dist/{models → packages/bunshot-auth/src/models}/AuthUser.d.ts +12 -8
  150. package/dist/packages/bunshot-auth/src/models/AuthUser.js +53 -0
  151. package/dist/packages/bunshot-auth/src/models/Group.d.ts +19 -0
  152. package/dist/packages/bunshot-auth/src/models/Group.js +22 -0
  153. package/dist/{models → packages/bunshot-auth/src/models}/GroupMembership.d.ts +6 -8
  154. package/dist/packages/bunshot-auth/src/models/GroupMembership.js +19 -0
  155. package/dist/{models → packages/bunshot-auth/src/models}/M2MClient.d.ts +1 -1
  156. package/dist/{models → packages/bunshot-auth/src/models}/M2MClient.js +5 -5
  157. package/dist/packages/bunshot-auth/src/models/TenantRole.d.ts +13 -0
  158. package/dist/packages/bunshot-auth/src/models/TenantRole.js +17 -0
  159. package/dist/packages/bunshot-auth/src/plugin.d.ts +4 -0
  160. package/dist/packages/bunshot-auth/src/plugin.js +274 -0
  161. package/dist/packages/bunshot-auth/src/routes/auth.d.ts +15 -0
  162. package/dist/packages/bunshot-auth/src/routes/auth.js +1624 -0
  163. package/dist/packages/bunshot-auth/src/routes/groups.d.ts +4 -0
  164. package/dist/packages/bunshot-auth/src/routes/groups.js +481 -0
  165. package/dist/packages/bunshot-auth/src/routes/m2m.d.ts +2 -0
  166. package/dist/packages/bunshot-auth/src/routes/m2m.js +145 -0
  167. package/dist/packages/bunshot-auth/src/routes/mfa.d.ts +6 -0
  168. package/dist/packages/bunshot-auth/src/routes/mfa.js +991 -0
  169. package/dist/packages/bunshot-auth/src/routes/oauth.d.ts +3 -0
  170. package/dist/packages/bunshot-auth/src/routes/oauth.js +1727 -0
  171. package/dist/packages/bunshot-auth/src/routes/oidc.d.ts +2 -0
  172. package/dist/packages/bunshot-auth/src/routes/oidc.js +84 -0
  173. package/dist/packages/bunshot-auth/src/routes/organizations.d.ts +3 -0
  174. package/dist/packages/bunshot-auth/src/routes/organizations.js +741 -0
  175. package/dist/packages/bunshot-auth/src/routes/passkey.d.ts +2 -0
  176. package/dist/packages/bunshot-auth/src/routes/passkey.js +199 -0
  177. package/dist/packages/bunshot-auth/src/routes/saml.d.ts +2 -0
  178. package/dist/packages/bunshot-auth/src/routes/saml.js +226 -0
  179. package/dist/packages/bunshot-auth/src/routes/scim.d.ts +3 -0
  180. package/dist/packages/bunshot-auth/src/routes/scim.js +588 -0
  181. package/dist/packages/bunshot-auth/src/runtime.d.ts +52 -0
  182. package/dist/packages/bunshot-auth/src/runtime.js +11 -0
  183. package/dist/{schemas → packages/bunshot-auth/src/schemas}/auth.d.ts +4 -5
  184. package/dist/packages/bunshot-auth/src/schemas/auth.js +24 -0
  185. package/dist/packages/bunshot-auth/src/schemas/error.d.ts +10 -0
  186. package/dist/packages/bunshot-auth/src/schemas/error.js +10 -0
  187. package/dist/packages/bunshot-auth/src/schemas/success.d.ts +10 -0
  188. package/dist/packages/bunshot-auth/src/schemas/success.js +10 -0
  189. package/dist/packages/bunshot-auth/src/services/auth.d.ts +39 -0
  190. package/dist/packages/bunshot-auth/src/services/auth.js +378 -0
  191. package/dist/{services → packages/bunshot-auth/src/services}/mfa.d.ts +41 -17
  192. package/dist/{services → packages/bunshot-auth/src/services}/mfa.js +259 -183
  193. package/dist/packages/bunshot-auth/src/testing.d.ts +31 -0
  194. package/dist/packages/bunshot-auth/src/testing.js +23 -0
  195. package/dist/packages/bunshot-auth/src/types/adapter.d.ts +1 -0
  196. package/dist/packages/bunshot-auth/src/types/adapter.js +1 -0
  197. package/dist/packages/bunshot-auth/src/types/config.d.ts +152 -0
  198. package/dist/packages/bunshot-auth/src/types/config.js +179 -0
  199. package/dist/{routes → packages/bunshot-auth/src/types}/groups.d.ts +2 -3
  200. package/dist/packages/bunshot-auth/src/types/groups.js +1 -0
  201. package/dist/packages/bunshot-auth/src/types/oauthCode.d.ts +6 -0
  202. package/dist/packages/bunshot-auth/src/types/oauthCode.js +1 -0
  203. package/dist/packages/bunshot-auth/src/types/oauthReauth.d.ts +13 -0
  204. package/dist/packages/bunshot-auth/src/types/oauthReauth.js +1 -0
  205. package/dist/packages/bunshot-auth/src/types/redis.d.ts +1 -0
  206. package/dist/packages/bunshot-auth/src/types/redis.js +1 -0
  207. package/dist/packages/bunshot-auth/src/types/saml.d.ts +10 -0
  208. package/dist/packages/bunshot-auth/src/types/saml.js +1 -0
  209. package/dist/packages/bunshot-auth/src/types/session.d.ts +18 -0
  210. package/dist/packages/bunshot-auth/src/types/session.js +1 -0
  211. package/dist/packages/bunshot-auth/src/types/store.d.ts +1 -0
  212. package/dist/packages/bunshot-auth/src/types/store.js +1 -0
  213. package/dist/packages/bunshot-core/src/adminProvider.d.ts +95 -0
  214. package/dist/packages/bunshot-core/src/adminProvider.js +1 -0
  215. package/dist/packages/bunshot-core/src/auditLog.d.ts +34 -0
  216. package/dist/packages/bunshot-core/src/auditLog.js +1 -0
  217. package/dist/packages/bunshot-core/src/auth-adapter.d.ts +227 -0
  218. package/dist/packages/bunshot-core/src/auth-adapter.js +4 -0
  219. package/dist/packages/bunshot-core/src/authVariables.d.ts +14 -0
  220. package/dist/packages/bunshot-core/src/authVariables.js +4 -0
  221. package/dist/packages/bunshot-core/src/cache.d.ts +12 -0
  222. package/dist/packages/bunshot-core/src/cache.js +21 -0
  223. package/dist/{lib → packages/bunshot-core/src}/captcha.d.ts +1 -10
  224. package/dist/packages/bunshot-core/src/captcha.js +1 -0
  225. package/dist/packages/bunshot-core/src/clearRegistry.d.ts +6 -0
  226. package/dist/packages/bunshot-core/src/clearRegistry.js +17 -0
  227. package/dist/packages/bunshot-core/src/clientIp.d.ts +3 -0
  228. package/dist/packages/bunshot-core/src/clientIp.js +45 -0
  229. package/dist/packages/bunshot-core/src/configLock.d.ts +4 -0
  230. package/dist/packages/bunshot-core/src/configLock.js +7 -0
  231. package/dist/packages/bunshot-core/src/configValidation.d.ts +22 -0
  232. package/dist/packages/bunshot-core/src/configValidation.js +39 -0
  233. package/dist/packages/bunshot-core/src/constants.js +10 -0
  234. package/dist/packages/bunshot-core/src/context/bunshotContext.d.ts +232 -0
  235. package/dist/packages/bunshot-core/src/context/bunshotContext.js +1 -0
  236. package/dist/packages/bunshot-core/src/context/contextAccess.d.ts +3 -0
  237. package/dist/packages/bunshot-core/src/context/contextAccess.js +16 -0
  238. package/dist/packages/bunshot-core/src/context/contextStore.d.ts +16 -0
  239. package/dist/packages/bunshot-core/src/context/contextStore.js +31 -0
  240. package/dist/packages/bunshot-core/src/context/frameworkConfig.d.ts +38 -0
  241. package/dist/packages/bunshot-core/src/context/frameworkConfig.js +1 -0
  242. package/dist/packages/bunshot-core/src/context/index.d.ts +4 -0
  243. package/dist/packages/bunshot-core/src/context/index.js +2 -0
  244. package/dist/packages/bunshot-core/src/context.d.ts +40 -0
  245. package/dist/packages/bunshot-core/src/context.js +35 -0
  246. package/dist/packages/bunshot-core/src/coreContracts.d.ts +47 -0
  247. package/dist/packages/bunshot-core/src/coreContracts.js +1 -0
  248. package/dist/packages/bunshot-core/src/coreRegistrar.d.ts +6 -0
  249. package/dist/packages/bunshot-core/src/coreRegistrar.js +42 -0
  250. package/dist/{lib → packages/bunshot-core/src}/createRoute.d.ts +4 -30
  251. package/dist/{lib → packages/bunshot-core/src}/createRoute.js +39 -88
  252. package/dist/packages/bunshot-core/src/cronRegistry.d.ts +11 -0
  253. package/dist/packages/bunshot-core/src/cronRegistry.js +1 -0
  254. package/dist/packages/bunshot-core/src/crypto.d.ts +43 -0
  255. package/dist/packages/bunshot-core/src/crypto.js +74 -0
  256. package/dist/packages/bunshot-core/src/csrf.d.ts +8 -0
  257. package/dist/packages/bunshot-core/src/csrf.js +1 -0
  258. package/dist/packages/bunshot-core/src/defaults/defaultFingerprint.d.ts +7 -0
  259. package/dist/packages/bunshot-core/src/defaults/defaultFingerprint.js +19 -0
  260. package/dist/packages/bunshot-core/src/defaults/memoryCacheAdapter.d.ts +6 -0
  261. package/dist/packages/bunshot-core/src/defaults/memoryCacheAdapter.js +40 -0
  262. package/dist/packages/bunshot-core/src/defaults/memoryRateLimit.d.ts +6 -0
  263. package/dist/packages/bunshot-core/src/defaults/memoryRateLimit.js +24 -0
  264. package/dist/packages/bunshot-core/src/emailTemplates.d.ts +5 -0
  265. package/dist/packages/bunshot-core/src/emailTemplates.js +10 -0
  266. package/dist/{lib/HttpError.d.ts → packages/bunshot-core/src/errors.d.ts} +4 -1
  267. package/dist/{lib/HttpError.js → packages/bunshot-core/src/errors.js} +7 -1
  268. package/dist/packages/bunshot-core/src/eventBus.d.ts +270 -0
  269. package/dist/packages/bunshot-core/src/eventBus.js +143 -0
  270. package/dist/packages/bunshot-core/src/idempotency.d.ts +18 -0
  271. package/dist/packages/bunshot-core/src/idempotency.js +1 -0
  272. package/dist/packages/bunshot-core/src/index.d.ts +60 -0
  273. package/dist/packages/bunshot-core/src/index.js +34 -0
  274. package/dist/packages/bunshot-core/src/mail.d.ts +14 -0
  275. package/dist/packages/bunshot-core/src/mail.js +8 -0
  276. package/dist/packages/bunshot-core/src/memoryEviction.d.ts +24 -0
  277. package/dist/packages/bunshot-core/src/memoryEviction.js +52 -0
  278. package/dist/packages/bunshot-core/src/pagination.d.ts +45 -0
  279. package/dist/packages/bunshot-core/src/pagination.js +61 -0
  280. package/dist/packages/bunshot-core/src/permissions.d.ts +64 -0
  281. package/dist/packages/bunshot-core/src/permissions.js +27 -0
  282. package/dist/packages/bunshot-core/src/plugin.d.ts +44 -0
  283. package/dist/packages/bunshot-core/src/plugin.js +1 -0
  284. package/dist/packages/bunshot-core/src/rateLimit.d.ts +5 -0
  285. package/dist/packages/bunshot-core/src/rateLimit.js +18 -0
  286. package/dist/packages/bunshot-core/src/redis.d.ts +21 -0
  287. package/dist/packages/bunshot-core/src/redis.js +1 -0
  288. package/dist/packages/bunshot-core/src/routeAuth.d.ts +5 -0
  289. package/dist/packages/bunshot-core/src/routeAuth.js +11 -0
  290. package/dist/packages/bunshot-core/src/routeOverrides.d.ts +24 -0
  291. package/dist/packages/bunshot-core/src/routeOverrides.js +25 -0
  292. package/dist/packages/bunshot-core/src/routerAdapter.d.ts +6 -0
  293. package/dist/packages/bunshot-core/src/routerAdapter.js +56 -0
  294. package/dist/packages/bunshot-core/src/secrets.d.ts +48 -0
  295. package/dist/packages/bunshot-core/src/secrets.js +8 -0
  296. package/dist/packages/bunshot-core/src/signing.d.ts +41 -0
  297. package/dist/packages/bunshot-core/src/signing.js +1 -0
  298. package/dist/packages/bunshot-core/src/sse.d.ts +36 -0
  299. package/dist/packages/bunshot-core/src/sse.js +1 -0
  300. package/dist/packages/bunshot-core/src/storageAdapter.js +1 -0
  301. package/dist/packages/bunshot-core/src/storeInfra.d.ts +44 -0
  302. package/dist/packages/bunshot-core/src/storeInfra.js +18 -0
  303. package/dist/packages/bunshot-core/src/storeType.d.ts +7 -0
  304. package/dist/packages/bunshot-core/src/storeType.js +1 -0
  305. package/dist/packages/bunshot-core/src/testing.d.ts +1 -0
  306. package/dist/packages/bunshot-core/src/testing.js +1 -0
  307. package/dist/packages/bunshot-core/src/uploadRegistry.d.ts +23 -0
  308. package/dist/packages/bunshot-core/src/uploadRegistry.js +4 -0
  309. package/dist/packages/bunshot-core/src/userResolver.d.ts +5 -0
  310. package/dist/packages/bunshot-core/src/userResolver.js +14 -0
  311. package/dist/packages/bunshot-core/src/wsMessages.d.ts +42 -0
  312. package/dist/packages/bunshot-core/src/wsMessages.js +4 -0
  313. package/dist/packages/bunshot-permissions/src/adapters/memory.d.ts +7 -0
  314. package/dist/packages/bunshot-permissions/src/adapters/memory.js +73 -0
  315. package/dist/packages/bunshot-permissions/src/index.d.ts +10 -0
  316. package/dist/packages/bunshot-permissions/src/index.js +5 -0
  317. package/dist/packages/bunshot-permissions/src/lib/bootstrap.d.ts +7 -0
  318. package/dist/packages/bunshot-permissions/src/lib/bootstrap.js +12 -0
  319. package/dist/packages/bunshot-permissions/src/lib/evaluator.d.ts +10 -0
  320. package/dist/packages/bunshot-permissions/src/lib/evaluator.js +165 -0
  321. package/dist/packages/bunshot-permissions/src/lib/registry.d.ts +2 -0
  322. package/dist/packages/bunshot-permissions/src/lib/registry.js +31 -0
  323. package/dist/packages/bunshot-permissions/src/lib/validation.d.ts +1 -0
  324. package/dist/packages/bunshot-permissions/src/lib/validation.js +1 -0
  325. package/dist/packages/bunshot-permissions/src/types/adapter.d.ts +1 -0
  326. package/dist/packages/bunshot-permissions/src/types/adapter.js +1 -0
  327. package/dist/packages/bunshot-permissions/src/types/evaluator.d.ts +1 -0
  328. package/dist/packages/bunshot-permissions/src/types/evaluator.js +1 -0
  329. package/dist/packages/bunshot-permissions/src/types/models.d.ts +1 -0
  330. package/dist/packages/bunshot-permissions/src/types/models.js +1 -0
  331. package/dist/packages/bunshot-permissions/src/types/registry.d.ts +1 -0
  332. package/dist/packages/bunshot-permissions/src/types/registry.js +1 -0
  333. package/dist/packages/bunshot-postgres/src/adapter.d.ts +6 -0
  334. package/dist/packages/bunshot-postgres/src/adapter.js +794 -0
  335. package/dist/packages/bunshot-postgres/src/connection.d.ts +15 -0
  336. package/dist/packages/bunshot-postgres/src/connection.js +16 -0
  337. package/dist/packages/bunshot-postgres/src/index.d.ts +4 -0
  338. package/dist/packages/bunshot-postgres/src/index.js +2 -0
  339. package/dist/packages/bunshot-postgres/src/schema.d.ts +997 -0
  340. package/dist/packages/bunshot-postgres/src/schema.js +105 -0
  341. package/dist/src/app.d.ts +230 -0
  342. package/dist/src/app.js +182 -0
  343. package/dist/src/cli/commands/init.d.ts +10 -0
  344. package/dist/src/cli/commands/init.js +709 -0
  345. package/dist/src/cli/index.d.ts +1 -0
  346. package/dist/src/cli/index.js +3 -0
  347. package/dist/src/entrypoints/mongo.d.ts +6 -0
  348. package/dist/src/entrypoints/mongo.js +4 -0
  349. package/dist/src/entrypoints/queue.d.ts +2 -0
  350. package/dist/src/entrypoints/queue.js +1 -0
  351. package/dist/src/entrypoints/redis.d.ts +1 -0
  352. package/dist/src/entrypoints/redis.js +1 -0
  353. package/dist/{adapters → src/framework/adapters}/localStorage.d.ts +1 -1
  354. package/dist/{adapters → src/framework/adapters}/localStorage.js +10 -10
  355. package/dist/src/framework/adapters/memoryStorage.d.ts +2 -0
  356. package/dist/src/framework/adapters/memoryStorage.js +45 -0
  357. package/dist/{adapters → src/framework/adapters}/s3Storage.d.ts +1 -1
  358. package/dist/{adapters → src/framework/adapters}/s3Storage.js +12 -12
  359. package/dist/src/framework/admin/bunshotAccess.d.ts +2 -0
  360. package/dist/src/framework/admin/bunshotAccess.js +23 -0
  361. package/dist/src/framework/admin/bunshotUsers.d.ts +2 -0
  362. package/dist/src/framework/admin/bunshotUsers.js +103 -0
  363. package/dist/src/framework/admin/index.d.ts +7 -0
  364. package/dist/src/framework/admin/index.js +21 -0
  365. package/dist/src/framework/boundaryAdapters/cacheFactories.d.ts +13 -0
  366. package/dist/src/framework/boundaryAdapters/cacheFactories.js +86 -0
  367. package/dist/src/framework/boundaryAdapters/index.d.ts +2 -0
  368. package/dist/src/framework/boundaryAdapters/index.js +1 -0
  369. package/dist/src/framework/boundaryAdapters.d.ts +17 -0
  370. package/dist/src/framework/boundaryAdapters.js +62 -0
  371. package/dist/src/framework/buildContext.d.ts +33 -0
  372. package/dist/src/framework/buildContext.js +119 -0
  373. package/dist/src/framework/config/schema.d.ts +447 -0
  374. package/dist/src/framework/config/schema.js +528 -0
  375. package/dist/src/framework/createInfrastructure.d.ts +76 -0
  376. package/dist/src/framework/createInfrastructure.js +221 -0
  377. package/dist/src/framework/lib/auditLog.d.ts +23 -0
  378. package/dist/src/framework/lib/auditLog.js +416 -0
  379. package/dist/src/framework/lib/captcha.d.ts +11 -0
  380. package/dist/{lib → src/framework/lib}/captcha.js +13 -10
  381. package/dist/{lib → src/framework/lib}/createDtoMapper.js +4 -4
  382. package/dist/src/framework/lib/createRoute.d.ts +1 -0
  383. package/dist/src/framework/lib/createRoute.js +2 -0
  384. package/dist/{lib → src/framework/lib}/idempotency.d.ts +2 -6
  385. package/dist/src/framework/lib/idempotency.js +74 -0
  386. package/dist/src/framework/lib/logger.d.ts +3 -0
  387. package/dist/src/framework/lib/logger.js +14 -0
  388. package/dist/src/framework/lib/metrics.d.ts +34 -0
  389. package/dist/{lib → src/framework/lib}/metrics.js +49 -57
  390. package/dist/src/framework/lib/pagination.d.ts +42 -0
  391. package/dist/src/framework/lib/pagination.js +51 -0
  392. package/dist/src/framework/lib/redisTransport.d.ts +38 -0
  393. package/dist/src/framework/lib/redisTransport.js +107 -0
  394. package/dist/src/framework/lib/resolveUserId.d.ts +2 -0
  395. package/dist/src/framework/lib/resolveUserId.js +5 -0
  396. package/dist/src/framework/lib/sseCollision.d.ts +6 -0
  397. package/dist/src/framework/lib/sseCollision.js +26 -0
  398. package/dist/src/framework/lib/storageAdapter.d.ts +1 -0
  399. package/dist/src/framework/lib/storageAdapter.js +1 -0
  400. package/dist/{lib → src/framework/lib}/stripUnreferencedSchemas.js +4 -4
  401. package/dist/src/framework/lib/tenant.d.ts +21 -0
  402. package/dist/src/framework/lib/tenant.js +70 -0
  403. package/dist/{lib → src/framework/lib}/upload.d.ts +11 -10
  404. package/dist/src/framework/lib/upload.js +132 -0
  405. package/dist/src/framework/lib/uploadRegistry.d.ts +23 -0
  406. package/dist/src/framework/lib/uploadRegistry.js +34 -0
  407. package/dist/{lib → src/framework/lib}/validate.d.ts +1 -1
  408. package/dist/{lib → src/framework/lib}/validate.js +2 -2
  409. package/dist/src/framework/lib/ws.d.ts +19 -0
  410. package/dist/src/framework/lib/ws.js +130 -0
  411. package/dist/src/framework/lib/wsHeartbeat.d.ts +12 -0
  412. package/dist/src/framework/lib/wsHeartbeat.js +53 -0
  413. package/dist/src/framework/lib/wsMessages.d.ts +25 -0
  414. package/dist/src/framework/lib/wsMessages.js +45 -0
  415. package/dist/src/framework/lib/wsNamespace.d.ts +17 -0
  416. package/dist/src/framework/lib/wsNamespace.js +19 -0
  417. package/dist/src/framework/lib/wsPresence.d.ts +17 -0
  418. package/dist/src/framework/lib/wsPresence.js +84 -0
  419. package/dist/src/framework/lib/wsTransport.d.ts +38 -0
  420. package/dist/src/framework/lib/wsTransport.js +9 -0
  421. package/dist/{lib → src/framework/lib}/zodToMongoose.d.ts +1 -1
  422. package/dist/{lib → src/framework/lib}/zodToMongoose.js +11 -11
  423. package/dist/{middleware → src/framework/middleware}/auditLog.d.ts +4 -3
  424. package/dist/src/framework/middleware/auditLog.js +42 -0
  425. package/dist/{middleware → src/framework/middleware}/botProtection.d.ts +2 -2
  426. package/dist/{middleware → src/framework/middleware}/botProtection.js +8 -9
  427. package/dist/src/framework/middleware/cacheResponse.d.ts +35 -0
  428. package/dist/src/framework/middleware/cacheResponse.js +126 -0
  429. package/dist/{middleware → src/framework/middleware}/captcha.d.ts +2 -3
  430. package/dist/src/framework/middleware/captcha.js +37 -0
  431. package/dist/{middleware → src/framework/middleware}/errorHandler.d.ts +1 -1
  432. package/dist/{middleware → src/framework/middleware}/errorHandler.js +2 -2
  433. package/dist/src/framework/middleware/index.js +1 -0
  434. package/dist/{middleware → src/framework/middleware}/logger.d.ts +1 -1
  435. package/dist/src/framework/middleware/metrics.d.ts +12 -0
  436. package/dist/src/framework/middleware/metrics.js +26 -0
  437. package/dist/{middleware → src/framework/middleware}/rateLimit.d.ts +2 -2
  438. package/dist/src/framework/middleware/rateLimit.js +22 -0
  439. package/dist/src/framework/middleware/requestId.d.ts +3 -0
  440. package/dist/{middleware → src/framework/middleware}/requestId.js +2 -2
  441. package/dist/{middleware → src/framework/middleware}/requestLogger.d.ts +3 -3
  442. package/dist/{middleware → src/framework/middleware}/requestLogger.js +17 -12
  443. package/dist/{middleware → src/framework/middleware}/requestSigning.d.ts +2 -2
  444. package/dist/{middleware → src/framework/middleware}/requestSigning.js +18 -20
  445. package/dist/src/framework/middleware/tenant.d.ts +14 -0
  446. package/dist/{middleware → src/framework/middleware}/tenant.js +31 -27
  447. package/dist/src/framework/middleware/upload.d.ts +5 -0
  448. package/dist/{middleware → src/framework/middleware}/upload.js +4 -4
  449. package/dist/{middleware → src/framework/middleware}/webhookAuth.d.ts +3 -3
  450. package/dist/{middleware → src/framework/middleware}/webhookAuth.js +11 -12
  451. package/dist/src/framework/models/AuditLog.d.ts +21 -0
  452. package/dist/src/framework/models/AuditLog.js +31 -0
  453. package/dist/src/framework/mountMiddleware.d.ts +91 -0
  454. package/dist/src/framework/mountMiddleware.js +128 -0
  455. package/dist/src/framework/mountOptionalEndpoints.d.ts +103 -0
  456. package/dist/src/framework/mountOptionalEndpoints.js +47 -0
  457. package/dist/src/framework/mountRoutes.d.ts +21 -0
  458. package/dist/src/framework/mountRoutes.js +144 -0
  459. package/dist/src/framework/persistence/cronRegistry.d.ts +28 -0
  460. package/dist/src/framework/persistence/cronRegistry.js +139 -0
  461. package/dist/src/framework/persistence/idempotency.d.ts +26 -0
  462. package/dist/src/framework/persistence/idempotency.js +178 -0
  463. package/dist/src/framework/persistence/index.d.ts +6 -0
  464. package/dist/src/framework/persistence/index.js +8 -0
  465. package/dist/src/framework/persistence/storeInfra.d.ts +9 -0
  466. package/dist/src/framework/persistence/storeInfra.js +1 -0
  467. package/dist/src/framework/persistence/uploadRegistry.d.ts +35 -0
  468. package/dist/src/framework/persistence/uploadRegistry.js +235 -0
  469. package/dist/src/framework/persistence/wsMessages.d.ts +22 -0
  470. package/dist/src/framework/persistence/wsMessages.js +296 -0
  471. package/dist/src/framework/preloadSchemas.d.ts +24 -0
  472. package/dist/src/framework/preloadSchemas.js +42 -0
  473. package/dist/src/framework/registerBoundaryAdapters.d.ts +23 -0
  474. package/dist/src/framework/registerBoundaryAdapters.js +46 -0
  475. package/dist/src/framework/routes/admin.d.ts +9 -0
  476. package/dist/src/framework/routes/admin.js +361 -0
  477. package/dist/src/framework/routes/health.d.ts +1 -0
  478. package/dist/src/framework/routes/health.js +21 -0
  479. package/dist/src/framework/routes/home.d.ts +1 -0
  480. package/dist/src/framework/routes/home.js +18 -0
  481. package/dist/src/framework/routes/jobs.d.ts +3 -0
  482. package/dist/{routes → src/framework/routes}/jobs.js +128 -103
  483. package/dist/src/framework/routes/metrics.d.ts +10 -0
  484. package/dist/src/framework/routes/metrics.js +57 -0
  485. package/dist/{routes → src/framework/routes}/uploads.d.ts +3 -3
  486. package/dist/src/framework/routes/uploads.js +262 -0
  487. package/dist/src/framework/runPluginLifecycle.d.ts +27 -0
  488. package/dist/src/framework/runPluginLifecycle.js +121 -0
  489. package/dist/src/framework/secrets/frameworkSecretSchema.d.ts +58 -0
  490. package/dist/src/framework/secrets/frameworkSecretSchema.js +20 -0
  491. package/dist/src/framework/secrets/index.d.ts +9 -0
  492. package/dist/src/framework/secrets/index.js +7 -0
  493. package/dist/src/framework/secrets/providers/envProvider.d.ts +15 -0
  494. package/dist/src/framework/secrets/providers/envProvider.js +18 -0
  495. package/dist/src/framework/secrets/providers/fileProvider.d.ts +8 -0
  496. package/dist/src/framework/secrets/providers/fileProvider.js +82 -0
  497. package/dist/src/framework/secrets/providers/ssmProvider.d.ts +20 -0
  498. package/dist/src/framework/secrets/providers/ssmProvider.js +127 -0
  499. package/dist/src/framework/secrets/resolveSecretBundle.d.ts +53 -0
  500. package/dist/src/framework/secrets/resolveSecretBundle.js +84 -0
  501. package/dist/src/framework/secrets/resolveSecrets.d.ts +18 -0
  502. package/dist/src/framework/secrets/resolveSecrets.js +34 -0
  503. package/dist/src/framework/sse/index.d.ts +21 -0
  504. package/dist/src/framework/sse/index.js +109 -0
  505. package/dist/src/framework/ws/index.d.ts +11 -0
  506. package/dist/src/framework/ws/index.js +8 -0
  507. package/dist/src/index.d.ts +87 -0
  508. package/dist/src/index.js +58 -0
  509. package/dist/src/lib/appConfig.d.ts +7 -0
  510. package/dist/src/lib/appConfig.js +27 -0
  511. package/dist/src/lib/appMeta.d.ts +7 -0
  512. package/dist/src/lib/appMeta.js +3 -0
  513. package/dist/src/lib/authConfig.d.ts +532 -0
  514. package/dist/{lib/appConfig.js → src/lib/authConfig.js} +75 -17
  515. package/dist/{lib → src/lib}/context.d.ts +6 -12
  516. package/dist/{lib → src/lib}/context.js +5 -5
  517. package/dist/src/lib/logger.d.ts +1 -0
  518. package/dist/src/lib/logger.js +1 -0
  519. package/dist/src/lib/mongo.d.ts +58 -0
  520. package/dist/src/lib/mongo.js +96 -0
  521. package/dist/src/lib/queue.d.ts +72 -0
  522. package/dist/src/lib/queue.js +152 -0
  523. package/dist/src/lib/redis.d.ts +28 -0
  524. package/dist/src/lib/redis.js +72 -0
  525. package/dist/{lib → src/lib}/signing.d.ts +2 -2
  526. package/dist/src/lib/signing.js +210 -0
  527. package/dist/src/lib/signingConfig.d.ts +40 -0
  528. package/dist/src/lib/signingConfig.js +28 -0
  529. package/dist/src/server.d.ts +146 -0
  530. package/dist/src/server.js +469 -0
  531. package/dist/src/shared/lib/HttpError.d.ts +1 -0
  532. package/dist/src/shared/lib/HttpError.js +2 -0
  533. package/dist/src/shared/lib/constants.d.ts +10 -0
  534. package/dist/src/shared/lib/crypto.d.ts +43 -0
  535. package/dist/src/shared/lib/crypto.js +74 -0
  536. package/dist/src/shared/lib/signing.d.ts +52 -0
  537. package/dist/{lib → src/shared/lib}/signing.js +35 -8
  538. package/dist/src/testing.d.ts +34 -0
  539. package/dist/src/testing.js +93 -0
  540. package/package.json +60 -24
  541. package/dist/adapters/memoryAuth.d.ts +0 -52
  542. package/dist/adapters/memoryAuth.js +0 -749
  543. package/dist/adapters/memoryStorage.d.ts +0 -3
  544. package/dist/adapters/memoryStorage.js +0 -44
  545. package/dist/adapters/mongoAuth.d.ts +0 -2
  546. package/dist/adapters/mongoAuth.js +0 -403
  547. package/dist/adapters/sqliteAuth.d.ts +0 -72
  548. package/dist/adapters/sqliteAuth.js +0 -858
  549. package/dist/app.d.ts +0 -559
  550. package/dist/app.js +0 -651
  551. package/dist/entrypoints/mongo.d.ts +0 -5
  552. package/dist/entrypoints/mongo.js +0 -4
  553. package/dist/entrypoints/queue.d.ts +0 -2
  554. package/dist/entrypoints/queue.js +0 -1
  555. package/dist/entrypoints/redis.d.ts +0 -1
  556. package/dist/entrypoints/redis.js +0 -1
  557. package/dist/index.d.ts +0 -117
  558. package/dist/index.js +0 -88
  559. package/dist/lib/appConfig.d.ts +0 -275
  560. package/dist/lib/auditLog.d.ts +0 -58
  561. package/dist/lib/auditLog.js +0 -218
  562. package/dist/lib/authAdapter.d.ts +0 -246
  563. package/dist/lib/authAdapter.js +0 -7
  564. package/dist/lib/authRateLimit.d.ts +0 -13
  565. package/dist/lib/authRateLimit.js +0 -117
  566. package/dist/lib/clientIp.d.ts +0 -14
  567. package/dist/lib/credentialStuffing.d.ts +0 -31
  568. package/dist/lib/credentialStuffing.js +0 -77
  569. package/dist/lib/crypto.d.ts +0 -11
  570. package/dist/lib/crypto.js +0 -22
  571. package/dist/lib/deletionCancelToken.d.ts +0 -12
  572. package/dist/lib/deletionCancelToken.js +0 -88
  573. package/dist/lib/emailVerification.d.ts +0 -19
  574. package/dist/lib/emailVerification.js +0 -129
  575. package/dist/lib/fingerprint.js +0 -36
  576. package/dist/lib/idempotency.js +0 -182
  577. package/dist/lib/jwks.d.ts +0 -25
  578. package/dist/lib/jwks.js +0 -51
  579. package/dist/lib/jwt.d.ts +0 -15
  580. package/dist/lib/jwt.js +0 -111
  581. package/dist/lib/metrics.d.ts +0 -14
  582. package/dist/lib/mfaChallenge.d.ts +0 -55
  583. package/dist/lib/mfaChallenge.js +0 -398
  584. package/dist/lib/mongo.d.ts +0 -39
  585. package/dist/lib/mongo.js +0 -124
  586. package/dist/lib/oauth.d.ts +0 -40
  587. package/dist/lib/oauth.js +0 -101
  588. package/dist/lib/oauthCode.d.ts +0 -15
  589. package/dist/lib/oauthCode.js +0 -95
  590. package/dist/lib/pagination.d.ts +0 -119
  591. package/dist/lib/pagination.js +0 -166
  592. package/dist/lib/queue.d.ts +0 -37
  593. package/dist/lib/queue.js +0 -117
  594. package/dist/lib/redis.d.ts +0 -9
  595. package/dist/lib/redis.js +0 -61
  596. package/dist/lib/resetPassword.d.ts +0 -12
  597. package/dist/lib/resetPassword.js +0 -93
  598. package/dist/lib/roles.d.ts +0 -7
  599. package/dist/lib/roles.js +0 -49
  600. package/dist/lib/saml.d.ts +0 -25
  601. package/dist/lib/saml.js +0 -64
  602. package/dist/lib/securityEvents.d.ts +0 -28
  603. package/dist/lib/securityEvents.js +0 -26
  604. package/dist/lib/session.d.ts +0 -49
  605. package/dist/lib/session.js +0 -597
  606. package/dist/lib/tenant.d.ts +0 -15
  607. package/dist/lib/tenant.js +0 -65
  608. package/dist/lib/upload.js +0 -112
  609. package/dist/lib/uploadRegistry.d.ts +0 -18
  610. package/dist/lib/uploadRegistry.js +0 -83
  611. package/dist/lib/ws.d.ts +0 -22
  612. package/dist/lib/ws.js +0 -96
  613. package/dist/lib/wsHeartbeat.d.ts +0 -12
  614. package/dist/lib/wsHeartbeat.js +0 -57
  615. package/dist/lib/wsMessages.d.ts +0 -40
  616. package/dist/lib/wsMessages.js +0 -330
  617. package/dist/lib/wsPresence.d.ts +0 -25
  618. package/dist/lib/wsPresence.js +0 -99
  619. package/dist/middleware/auditLog.js +0 -39
  620. package/dist/middleware/bearerAuth.d.ts +0 -2
  621. package/dist/middleware/bearerAuth.js +0 -11
  622. package/dist/middleware/cacheResponse.d.ts +0 -15
  623. package/dist/middleware/cacheResponse.js +0 -178
  624. package/dist/middleware/captcha.js +0 -36
  625. package/dist/middleware/csrf.js +0 -129
  626. package/dist/middleware/identify.d.ts +0 -3
  627. package/dist/middleware/identify.js +0 -122
  628. package/dist/middleware/index.js +0 -1
  629. package/dist/middleware/metrics.d.ts +0 -9
  630. package/dist/middleware/metrics.js +0 -26
  631. package/dist/middleware/rateLimit.js +0 -22
  632. package/dist/middleware/requestId.d.ts +0 -3
  633. package/dist/middleware/scimAuth.d.ts +0 -8
  634. package/dist/middleware/scimAuth.js +0 -29
  635. package/dist/middleware/tenant.d.ts +0 -5
  636. package/dist/middleware/upload.d.ts +0 -5
  637. package/dist/middleware/userAuth.d.ts +0 -3
  638. package/dist/middleware/userAuth.js +0 -6
  639. package/dist/models/AuditLog.d.ts +0 -30
  640. package/dist/models/AuditLog.js +0 -39
  641. package/dist/models/AuthUser.js +0 -55
  642. package/dist/models/Group.d.ts +0 -21
  643. package/dist/models/Group.js +0 -28
  644. package/dist/models/GroupMembership.js +0 -25
  645. package/dist/models/TenantRole.d.ts +0 -15
  646. package/dist/models/TenantRole.js +0 -23
  647. package/dist/routes/auth.d.ts +0 -12
  648. package/dist/routes/auth.js +0 -744
  649. package/dist/routes/groups.js +0 -346
  650. package/dist/routes/health.d.ts +0 -1
  651. package/dist/routes/health.js +0 -22
  652. package/dist/routes/home.d.ts +0 -1
  653. package/dist/routes/home.js +0 -16
  654. package/dist/routes/jobs.d.ts +0 -2
  655. package/dist/routes/m2m.d.ts +0 -2
  656. package/dist/routes/m2m.js +0 -72
  657. package/dist/routes/metrics.d.ts +0 -8
  658. package/dist/routes/metrics.js +0 -55
  659. package/dist/routes/mfa.d.ts +0 -5
  660. package/dist/routes/mfa.js +0 -628
  661. package/dist/routes/oauth.d.ts +0 -2
  662. package/dist/routes/oauth.js +0 -520
  663. package/dist/routes/oidc.d.ts +0 -2
  664. package/dist/routes/oidc.js +0 -29
  665. package/dist/routes/passkey.d.ts +0 -1
  666. package/dist/routes/passkey.js +0 -157
  667. package/dist/routes/saml.d.ts +0 -2
  668. package/dist/routes/saml.js +0 -86
  669. package/dist/routes/scim.d.ts +0 -2
  670. package/dist/routes/scim.js +0 -255
  671. package/dist/routes/uploads.js +0 -227
  672. package/dist/schemas/auth.js +0 -30
  673. package/dist/server.d.ts +0 -57
  674. package/dist/server.js +0 -112
  675. package/dist/services/auth.d.ts +0 -29
  676. package/dist/services/auth.js +0 -238
  677. package/dist/ws/index.d.ts +0 -10
  678. package/dist/ws/index.js +0 -39
  679. package/docs/sections/adding-middleware/full.md +0 -35
  680. package/docs/sections/adding-models/full.md +0 -125
  681. package/docs/sections/adding-models/overview.md +0 -13
  682. package/docs/sections/adding-routes/full.md +0 -182
  683. package/docs/sections/adding-routes/overview.md +0 -23
  684. package/docs/sections/auth-flow/full.md +0 -790
  685. package/docs/sections/auth-flow/overview.md +0 -10
  686. package/docs/sections/auth-security-examples/full.md +0 -388
  687. package/docs/sections/authentication/full.md +0 -130
  688. package/docs/sections/authentication/overview.md +0 -5
  689. package/docs/sections/cli/full.md +0 -42
  690. package/docs/sections/configuration/full.md +0 -172
  691. package/docs/sections/configuration/overview.md +0 -18
  692. package/docs/sections/configuration-example/full.md +0 -117
  693. package/docs/sections/configuration-example/overview.md +0 -30
  694. package/docs/sections/documentation/full.md +0 -171
  695. package/docs/sections/environment-variables/full.md +0 -55
  696. package/docs/sections/exports/full.md +0 -123
  697. package/docs/sections/extending-context/full.md +0 -59
  698. package/docs/sections/header.md +0 -3
  699. package/docs/sections/installation/full.md +0 -6
  700. package/docs/sections/jobs/full.md +0 -140
  701. package/docs/sections/jobs/overview.md +0 -15
  702. package/docs/sections/logging/full.md +0 -83
  703. package/docs/sections/metrics/full.md +0 -131
  704. package/docs/sections/mongodb-connections/full.md +0 -45
  705. package/docs/sections/mongodb-connections/overview.md +0 -7
  706. package/docs/sections/multi-tenancy/full.md +0 -66
  707. package/docs/sections/multi-tenancy/overview.md +0 -15
  708. package/docs/sections/oauth/full.md +0 -189
  709. package/docs/sections/oauth/overview.md +0 -16
  710. package/docs/sections/package-development/full.md +0 -7
  711. package/docs/sections/pagination/full.md +0 -93
  712. package/docs/sections/passkey-login/full.md +0 -90
  713. package/docs/sections/passkey-login/overview.md +0 -1
  714. package/docs/sections/peer-dependencies/full.md +0 -47
  715. package/docs/sections/quick-start/full.md +0 -43
  716. package/docs/sections/response-caching/full.md +0 -117
  717. package/docs/sections/response-caching/overview.md +0 -13
  718. package/docs/sections/roles/full.md +0 -225
  719. package/docs/sections/roles/overview.md +0 -14
  720. package/docs/sections/running-without-redis/full.md +0 -16
  721. package/docs/sections/running-without-redis-or-mongodb/full.md +0 -60
  722. package/docs/sections/signing/full.md +0 -203
  723. package/docs/sections/stack/full.md +0 -10
  724. package/docs/sections/uploads/full.md +0 -208
  725. package/docs/sections/versioning/full.md +0 -85
  726. package/docs/sections/webhook-auth/full.md +0 -100
  727. package/docs/sections/websocket/full.md +0 -196
  728. package/docs/sections/websocket/overview.md +0 -5
  729. package/docs/sections/websocket-rooms/full.md +0 -102
  730. package/docs/sections/websocket-rooms/overview.md +0 -5
  731. /package/dist/{lib/storageAdapter.js → packages/bunshot-admin/src/types/env.js} +0 -0
  732. /package/dist/{lib → packages/bunshot-auth/src/lib}/fingerprint.d.ts +0 -0
  733. /package/dist/{lib → packages/bunshot-auth/src/lib}/logger.d.ts +0 -0
  734. /package/dist/{lib → packages/bunshot-core/src}/constants.d.ts +0 -0
  735. /package/dist/{lib → packages/bunshot-core/src}/storageAdapter.d.ts +0 -0
  736. /package/dist/{lib → src/framework/lib}/createDtoMapper.d.ts +0 -0
  737. /package/dist/{lib → src/framework/lib}/stripUnreferencedSchemas.d.ts +0 -0
  738. /package/dist/{middleware → src/framework/middleware}/cors.d.ts +0 -0
  739. /package/dist/{middleware → src/framework/middleware}/cors.js +0 -0
  740. /package/dist/{middleware → src/framework/middleware}/index.d.ts +0 -0
  741. /package/dist/{middleware → src/framework/middleware}/logger.js +0 -0
  742. /package/dist/{lib → src/shared/lib}/constants.js +0 -0
@@ -1,77 +0,0 @@
1
- // In-memory store: key → BoundedSet
2
- const _store = new Map();
3
- function cleanExpired() {
4
- const now = Date.now();
5
- for (const [key, entry] of _store.entries()) {
6
- if (entry.expiresAt < now)
7
- _store.delete(key);
8
- }
9
- }
10
- function addToSet(key, member, windowMs) {
11
- cleanExpired();
12
- const now = Date.now();
13
- let entry = _store.get(key);
14
- if (!entry || entry.expiresAt < now) {
15
- entry = { members: new Set(), expiresAt: now + windowMs };
16
- _store.set(key, entry);
17
- }
18
- entry.members.add(member);
19
- return entry.members.size;
20
- }
21
- function getSetSize(key) {
22
- cleanExpired();
23
- const now = Date.now();
24
- const entry = _store.get(key);
25
- if (!entry || entry.expiresAt < now)
26
- return 0;
27
- return entry.members.size;
28
- }
29
- let _config = null;
30
- export function setCredentialStuffingConfig(config) {
31
- _config = config;
32
- }
33
- export function getCredentialStuffingConfig() {
34
- return _config;
35
- }
36
- /**
37
- * Track a failed login attempt. Call this AFTER confirming the login failed.
38
- */
39
- export function trackFailedLogin(ip, identifier) {
40
- if (!_config)
41
- return;
42
- const ipWindowMs = _config.maxAccountsPerIp?.windowMs ?? 15 * 60 * 1000;
43
- const accountWindowMs = _config.maxIpsPerAccount?.windowMs ?? 15 * 60 * 1000;
44
- addToSet(`ip:${ip}`, identifier, ipWindowMs);
45
- addToSet(`account:${identifier}`, ip, accountWindowMs);
46
- }
47
- /**
48
- * Check whether this login attempt should be blocked.
49
- * Call this BEFORE verifying credentials.
50
- */
51
- export function isStuffingBlocked(ip, identifier) {
52
- if (!_config)
53
- return false;
54
- const ipMax = _config.maxAccountsPerIp?.count ?? 5;
55
- const accountMax = _config.maxIpsPerAccount?.count ?? 10;
56
- const ipCount = getSetSize(`ip:${ip}`);
57
- if (ipCount >= ipMax) {
58
- try {
59
- _config.onDetected?.({ type: "ip", key: ip, count: ipCount });
60
- }
61
- catch { /* swallow */ }
62
- return true;
63
- }
64
- const accountCount = getSetSize(`account:${identifier}`);
65
- if (accountCount >= accountMax) {
66
- try {
67
- _config.onDetected?.({ type: "account", key: identifier, count: accountCount });
68
- }
69
- catch { /* swallow */ }
70
- return true;
71
- }
72
- return false;
73
- }
74
- /** Clear the in-memory store (for testing). */
75
- export function clearCredentialStuffingStore() {
76
- _store.clear();
77
- }
@@ -1,11 +0,0 @@
1
- /**
2
- * Constant-time string comparison to prevent timing attacks.
3
- * Returns true if both strings are equal, false otherwise.
4
- * Always compares the full length even on mismatch.
5
- */
6
- export declare function timingSafeEqual(a: string, b: string): boolean;
7
- /**
8
- * SHA-256 hash a string and return the hex digest.
9
- * Centralized to avoid duplicate implementations across modules.
10
- */
11
- export declare function sha256(input: string): string;
@@ -1,22 +0,0 @@
1
- import { createHash, timingSafeEqual as nodeTimingSafeEqual } from "crypto";
2
- /**
3
- * Constant-time string comparison to prevent timing attacks.
4
- * Returns true if both strings are equal, false otherwise.
5
- * Always compares the full length even on mismatch.
6
- */
7
- export function timingSafeEqual(a, b) {
8
- if (a.length !== b.length) {
9
- // Compare against self to burn the same time, then return false
10
- const buf = Buffer.from(a, "utf-8");
11
- nodeTimingSafeEqual(buf, buf);
12
- return false;
13
- }
14
- return nodeTimingSafeEqual(Buffer.from(a, "utf-8"), Buffer.from(b, "utf-8"));
15
- }
16
- /**
17
- * SHA-256 hash a string and return the hex digest.
18
- * Centralized to avoid duplicate implementations across modules.
19
- */
20
- export function sha256(input) {
21
- return createHash("sha256").update(input).digest("hex");
22
- }
@@ -1,12 +0,0 @@
1
- type CancelStore = "redis" | "mongo" | "sqlite" | "memory";
2
- export declare const setDeletionCancelTokenStore: (store: CancelStore) => void;
3
- /** Create a cancel token. Returns the raw token (to embed in the cancel link).
4
- * Only the SHA-256 hash is persisted. TTL is gracePeriod + a 5-minute buffer. */
5
- export declare const createDeletionCancelToken: (userId: string, jobId: string, gracePeriodSeconds: number) => Promise<string>;
6
- /** Atomically consume a cancel token — returns its payload and deletes it.
7
- * Returns null if the token is invalid, expired, or already used. */
8
- export declare const consumeDeletionCancelToken: (token: string) => Promise<{
9
- userId: string;
10
- jobId: string;
11
- } | null>;
12
- export {};
@@ -1,88 +0,0 @@
1
- import { getRedis } from "./redis";
2
- import { appConnection, mongoose } from "./mongo";
3
- import { getAppName } from "./appConfig";
4
- import { sqliteCreateDeletionCancelToken, sqliteConsumeDeletionCancelToken, } from "../adapters/sqliteAuth";
5
- import { memoryCreateDeletionCancelToken, memoryConsumeDeletionCancelToken, } from "../adapters/memoryAuth";
6
- import { sha256 as hashToken } from "./crypto";
7
- function getCancelModel() {
8
- if (appConnection.models["DeletionCancelToken"])
9
- return appConnection.models["DeletionCancelToken"];
10
- const { Schema } = mongoose;
11
- const schema = new Schema({
12
- token: { type: String, required: true, unique: true },
13
- userId: { type: String, required: true },
14
- jobId: { type: String, required: true },
15
- expiresAt: { type: Date, required: true, index: { expireAfterSeconds: 0 } },
16
- }, { collection: "deletion_cancel_tokens" });
17
- return appConnection.model("DeletionCancelToken", schema);
18
- }
19
- // ---------------------------------------------------------------------------
20
- // Redis helpers
21
- // ---------------------------------------------------------------------------
22
- async function redisGetDel(key) {
23
- const redis = getRedis();
24
- if (typeof redis.getdel === "function") {
25
- try {
26
- return await redis.getdel(key);
27
- }
28
- catch (err) {
29
- const msg = err?.message ?? "";
30
- if (!/unknown command|ERR unknown command/i.test(msg))
31
- throw err;
32
- }
33
- }
34
- const result = await redis.eval("local v = redis.call('GET', KEYS[1])\nif v then redis.call('DEL', KEYS[1]) end\nreturn v", 1, key);
35
- return result ?? null;
36
- }
37
- let _store = "redis";
38
- export const setDeletionCancelTokenStore = (store) => { _store = store; };
39
- // ---------------------------------------------------------------------------
40
- // Public API
41
- // ---------------------------------------------------------------------------
42
- /** Create a cancel token. Returns the raw token (to embed in the cancel link).
43
- * Only the SHA-256 hash is persisted. TTL is gracePeriod + a 5-minute buffer. */
44
- export const createDeletionCancelToken = async (userId, jobId, gracePeriodSeconds) => {
45
- const token = crypto.randomUUID();
46
- const hash = hashToken(token);
47
- const ttl = gracePeriodSeconds + 300; // 5-min buffer after grace period expires
48
- if (_store === "memory") {
49
- memoryCreateDeletionCancelToken(hash, userId, jobId, ttl);
50
- return token;
51
- }
52
- if (_store === "sqlite") {
53
- sqliteCreateDeletionCancelToken(hash, userId, jobId, ttl);
54
- return token;
55
- }
56
- if (_store === "mongo") {
57
- await getCancelModel().create({
58
- token: hash,
59
- userId,
60
- jobId,
61
- expiresAt: new Date(Date.now() + ttl * 1000),
62
- });
63
- return token;
64
- }
65
- await getRedis().set(`delcancel:${getAppName()}:${hash}`, JSON.stringify({ userId, jobId }), "EX", ttl);
66
- return token;
67
- };
68
- /** Atomically consume a cancel token — returns its payload and deletes it.
69
- * Returns null if the token is invalid, expired, or already used. */
70
- export const consumeDeletionCancelToken = async (token) => {
71
- const hash = hashToken(token);
72
- if (_store === "memory")
73
- return memoryConsumeDeletionCancelToken(hash);
74
- if (_store === "sqlite")
75
- return sqliteConsumeDeletionCancelToken(hash);
76
- if (_store === "mongo") {
77
- const doc = await getCancelModel()
78
- .findOneAndDelete({ token: hash, expiresAt: { $gt: new Date() } })
79
- .lean();
80
- if (!doc)
81
- return null;
82
- return { userId: doc.userId, jobId: doc.jobId };
83
- }
84
- const raw = await redisGetDel(`delcancel:${getAppName()}:${hash}`);
85
- if (!raw)
86
- return null;
87
- return JSON.parse(raw);
88
- };
@@ -1,19 +0,0 @@
1
- type VerificationStore = "redis" | "mongo" | "sqlite" | "memory";
2
- export declare const setEmailVerificationStore: (store: VerificationStore) => void;
3
- /** Create a verification token. Returns the raw token (for the email link).
4
- * Only the SHA-256 hash is persisted in the store. */
5
- export declare const createVerificationToken: (userId: string, email: string) => Promise<string>;
6
- /** Look up a verification token by its raw value. Hashes before lookup. */
7
- export declare const getVerificationToken: (token: string) => Promise<{
8
- userId: string;
9
- email: string;
10
- } | null>;
11
- /** Delete a verification token by its raw value. Hashes before lookup. */
12
- export declare const deleteVerificationToken: (token: string) => Promise<void>;
13
- /** Atomically consume a verification token — returns its payload and deletes it in one operation.
14
- * Returns null if the token is invalid, expired, or already used. */
15
- export declare const consumeVerificationToken: (token: string) => Promise<{
16
- userId: string;
17
- email: string;
18
- } | null>;
19
- export {};
@@ -1,129 +0,0 @@
1
- import { getRedis } from "./redis";
2
- import { appConnection, mongoose } from "./mongo";
3
- import { getAppName, getTokenExpiry } from "./appConfig";
4
- import { sha256 } from "./crypto";
5
- import { sqliteCreateVerificationToken, sqliteGetVerificationToken, sqliteDeleteVerificationToken, sqliteConsumeVerificationToken, } from "../adapters/sqliteAuth";
6
- import { memoryCreateVerificationToken, memoryGetVerificationToken, memoryDeleteVerificationToken, memoryConsumeVerificationToken, } from "../adapters/memoryAuth";
7
- function getVerificationModel() {
8
- if (appConnection.models["EmailVerification"])
9
- return appConnection.models["EmailVerification"];
10
- const { Schema } = mongoose;
11
- const verificationSchema = new Schema({
12
- token: { type: String, required: true, unique: true },
13
- userId: { type: String, required: true },
14
- email: { type: String, required: true },
15
- expiresAt: { type: Date, required: true, index: { expireAfterSeconds: 0 } },
16
- }, { collection: "email_verifications" });
17
- return appConnection.model("EmailVerification", verificationSchema);
18
- }
19
- // ---------------------------------------------------------------------------
20
- // Redis helpers
21
- // ---------------------------------------------------------------------------
22
- /** Atomically GET+DEL a key. Uses native GETDEL (Redis >= 6.2) with a Lua fallback. */
23
- async function redisGetDel(key) {
24
- const redis = getRedis();
25
- if (typeof redis.getdel === "function") {
26
- try {
27
- return await redis.getdel(key);
28
- }
29
- catch (err) {
30
- const msg = err?.message ?? "";
31
- if (!/unknown command|ERR unknown command/i.test(msg))
32
- throw err;
33
- }
34
- }
35
- const result = await redis.eval("local v = redis.call('GET', KEYS[1])\nif v then redis.call('DEL', KEYS[1]) end\nreturn v", 1, key);
36
- return result ?? null;
37
- }
38
- let _store = "redis";
39
- export const setEmailVerificationStore = (store) => { _store = store; };
40
- // ---------------------------------------------------------------------------
41
- // Public API
42
- // ---------------------------------------------------------------------------
43
- /** Create a verification token. Returns the raw token (for the email link).
44
- * Only the SHA-256 hash is persisted in the store. */
45
- export const createVerificationToken = async (userId, email) => {
46
- const bytes = new Uint8Array(32);
47
- crypto.getRandomValues(bytes);
48
- const token = Buffer.from(bytes).toString("base64url");
49
- const hash = sha256(token);
50
- const ttl = getTokenExpiry();
51
- if (_store === "memory") {
52
- memoryCreateVerificationToken(hash, userId, email, ttl);
53
- return token;
54
- }
55
- if (_store === "sqlite") {
56
- sqliteCreateVerificationToken(hash, userId, email, ttl);
57
- return token;
58
- }
59
- if (_store === "mongo") {
60
- await getVerificationModel().create({
61
- token: hash,
62
- userId,
63
- email,
64
- expiresAt: new Date(Date.now() + ttl * 1000),
65
- });
66
- return token;
67
- }
68
- await getRedis().set(`verify:${getAppName()}:${hash}`, JSON.stringify({ userId, email }), "EX", ttl);
69
- return token;
70
- };
71
- /** Look up a verification token by its raw value. Hashes before lookup. */
72
- export const getVerificationToken = async (token) => {
73
- const hash = sha256(token);
74
- if (_store === "memory")
75
- return memoryGetVerificationToken(hash);
76
- if (_store === "sqlite")
77
- return sqliteGetVerificationToken(hash);
78
- if (_store === "mongo") {
79
- const doc = await getVerificationModel()
80
- .findOne({ token: hash, expiresAt: { $gt: new Date() } })
81
- .lean();
82
- if (!doc)
83
- return null;
84
- return { userId: doc.userId, email: doc.email };
85
- }
86
- const raw = await getRedis().get(`verify:${getAppName()}:${hash}`);
87
- if (!raw)
88
- return null;
89
- return JSON.parse(raw);
90
- };
91
- /** Delete a verification token by its raw value. Hashes before lookup. */
92
- export const deleteVerificationToken = async (token) => {
93
- const hash = sha256(token);
94
- if (_store === "memory") {
95
- memoryDeleteVerificationToken(hash);
96
- return;
97
- }
98
- if (_store === "sqlite") {
99
- sqliteDeleteVerificationToken(hash);
100
- return;
101
- }
102
- if (_store === "mongo") {
103
- await getVerificationModel().deleteOne({ token: hash });
104
- return;
105
- }
106
- await getRedis().del(`verify:${getAppName()}:${hash}`);
107
- };
108
- /** Atomically consume a verification token — returns its payload and deletes it in one operation.
109
- * Returns null if the token is invalid, expired, or already used. */
110
- export const consumeVerificationToken = async (token) => {
111
- const hash = sha256(token);
112
- if (_store === "memory")
113
- return memoryConsumeVerificationToken(hash);
114
- if (_store === "sqlite")
115
- return sqliteConsumeVerificationToken(hash);
116
- if (_store === "mongo") {
117
- const doc = await getVerificationModel()
118
- .findOneAndDelete({ token: hash, expiresAt: { $gt: new Date() } })
119
- .lean();
120
- if (!doc)
121
- return null;
122
- return { userId: doc.userId, email: doc.email };
123
- }
124
- // Redis: atomically return and remove the key (GETDEL or Lua fallback)
125
- const raw = await redisGetDel(`verify:${getAppName()}:${hash}`);
126
- if (!raw)
127
- return null;
128
- return JSON.parse(raw);
129
- };
@@ -1,36 +0,0 @@
1
- const BROWSER_HEADERS = [
2
- "sec-fetch-site",
3
- "sec-fetch-mode",
4
- "sec-fetch-dest",
5
- "sec-ch-ua",
6
- "sec-ch-ua-mobile",
7
- "sec-ch-ua-platform",
8
- "origin",
9
- "referer",
10
- "x-requested-with",
11
- ];
12
- const encoder = new TextEncoder();
13
- /**
14
- * Builds a 12-hex-char fingerprint from stable HTTP headers.
15
- * IP-independent: bots that rotate IPs but use the same HTTP client
16
- * will produce the same fingerprint and share a rate-limit bucket.
17
- */
18
- export async function buildFingerprint(req) {
19
- const h = (name) => req.headers.get(name) ?? "";
20
- // Encode which browser-only headers are present as a bitmask string.
21
- // Real browsers send most of these; raw HTTP clients send none.
22
- const bitmap = BROWSER_HEADERS.map((name) => req.headers.has(name) ? "1" : "0").join("");
23
- const raw = [
24
- h("user-agent"),
25
- h("accept"),
26
- h("accept-language"),
27
- h("accept-encoding"),
28
- h("connection"),
29
- bitmap,
30
- ].join("|");
31
- const buf = await crypto.subtle.digest("SHA-256", encoder.encode(raw));
32
- const bytes = new Uint8Array(buf).slice(0, 6);
33
- return Array.from(bytes)
34
- .map((b) => b.toString(16).padStart(2, "0"))
35
- .join("");
36
- }
@@ -1,182 +0,0 @@
1
- import { getRedis } from "./redis";
2
- import { appConnection, mongoose } from "./mongo";
3
- import { getAppName } from "./appConfig";
4
- import { getSigningConfig, getSigningSecret } from "./appConfig";
5
- import { hmacSign } from "./signing";
6
- import { HEADER_IDEMPOTENCY_KEY } from "./constants";
7
- let _store = "redis";
8
- export const setIdempotencyStore = (store) => { _store = store; };
9
- // ---------------------------------------------------------------------------
10
- // Memory store (tests only — no TTL eviction)
11
- // ---------------------------------------------------------------------------
12
- const _memory = new Map();
13
- export const clearIdempotencyMemoryStore = () => _memory.clear();
14
- function getIdempotencyModel() {
15
- if (appConnection.models["Idempotency"])
16
- return appConnection.models["Idempotency"];
17
- const { Schema } = mongoose;
18
- const schema = new Schema({
19
- key: { type: String, required: true, unique: true },
20
- status: { type: Number, required: true },
21
- body: { type: String, required: true },
22
- createdAt: { type: Date, required: true },
23
- expiresAt: { type: Date, required: true, index: { expireAfterSeconds: 0 } },
24
- }, { collection: "idempotency" });
25
- return appConnection.model("Idempotency", schema);
26
- }
27
- // ---------------------------------------------------------------------------
28
- // SQLite helpers (lazy — only available when bun:sqlite is in use)
29
- // ---------------------------------------------------------------------------
30
- function getSqliteDb() {
31
- const { getDb } = require("../adapters/sqliteAuth");
32
- return getDb();
33
- }
34
- function sqliteEnsureTable() {
35
- const db = getSqliteDb();
36
- db.run(`CREATE TABLE IF NOT EXISTS idempotency (
37
- key TEXT PRIMARY KEY,
38
- status INTEGER NOT NULL,
39
- body TEXT NOT NULL,
40
- createdAt INTEGER NOT NULL,
41
- expiresAt INTEGER NOT NULL
42
- )`);
43
- }
44
- // ---------------------------------------------------------------------------
45
- // Key derivation
46
- // ---------------------------------------------------------------------------
47
- function deriveKey(rawKey, userId) {
48
- const prefix = userId ?? "anon";
49
- const cfg = getSigningConfig();
50
- if (cfg?.idempotencyKeys) {
51
- const secret = getSigningSecret();
52
- if (secret) {
53
- return `${prefix}:${hmacSign(rawKey, secret)}`;
54
- }
55
- }
56
- return `${prefix}:${rawKey}`;
57
- }
58
- function redisIdempotencyKey(key) {
59
- return `idempotency:${getAppName()}:${key}`;
60
- }
61
- // ---------------------------------------------------------------------------
62
- // Store operations
63
- // ---------------------------------------------------------------------------
64
- async function getRecord(key) {
65
- if (_store === "memory") {
66
- return _memory.get(key) ?? null;
67
- }
68
- if (_store === "sqlite") {
69
- sqliteEnsureTable();
70
- const row = getSqliteDb().query("SELECT status, body, createdAt FROM idempotency WHERE key = ? AND expiresAt > ?").get(key, Date.now());
71
- return row ? { status: row.status, body: row.body, createdAt: row.createdAt } : null;
72
- }
73
- if (_store === "redis") {
74
- const raw = await getRedis().get(redisIdempotencyKey(key));
75
- if (!raw)
76
- return null;
77
- return JSON.parse(raw);
78
- }
79
- // mongo
80
- const doc = await getIdempotencyModel()
81
- .findOne({ key, expiresAt: { $gt: new Date() } }, "status body createdAt")
82
- .lean();
83
- return doc ? { status: doc.status, body: doc.body, createdAt: doc.createdAt.getTime() } : null;
84
- }
85
- /**
86
- * Attempt to store a record. Returns true if stored, false if a record
87
- * already exists (write collision — treat as cache hit).
88
- */
89
- async function tryStoreRecord(key, record, ttl) {
90
- if (_store === "memory") {
91
- if (_memory.has(key))
92
- return false;
93
- _memory.set(key, record);
94
- return true;
95
- }
96
- if (_store === "sqlite") {
97
- sqliteEnsureTable();
98
- const db = getSqliteDb();
99
- const expiresAt = record.createdAt + ttl * 1000;
100
- db.run("INSERT OR IGNORE INTO idempotency (key, status, body, createdAt, expiresAt) VALUES (?, ?, ?, ?, ?)", [key, record.status, record.body, record.createdAt, expiresAt]);
101
- // SQLite INSERT OR IGNORE doesn't throw on conflict; check changes count
102
- const changes = db.query("SELECT changes() as changes").get()?.changes ?? 0;
103
- return changes > 0;
104
- }
105
- if (_store === "redis") {
106
- // SET NX: set-if-not-exists — second concurrent writer gets a no-op
107
- const value = JSON.stringify(record);
108
- const result = await getRedis().set(redisIdempotencyKey(key), value, "EX", ttl, "NX");
109
- return result === "OK";
110
- }
111
- // mongo — unique index on key; second writer catches duplicate key error
112
- try {
113
- const now = new Date(record.createdAt);
114
- await getIdempotencyModel().create({
115
- key,
116
- status: record.status,
117
- body: record.body,
118
- createdAt: now,
119
- expiresAt: new Date(now.getTime() + ttl * 1000),
120
- });
121
- return true;
122
- }
123
- catch (err) {
124
- // Duplicate key — another concurrent request already stored the result
125
- if (err?.code === 11000 || err?.code === "11000")
126
- return false;
127
- throw err;
128
- }
129
- }
130
- // ---------------------------------------------------------------------------
131
- // Middleware factory
132
- // ---------------------------------------------------------------------------
133
- /**
134
- * Idempotency middleware. Reads the `Idempotency-Key` header and returns a
135
- * cached response if one exists for this user + key combination. Otherwise
136
- * calls the next handler, stores the response, and returns it.
137
- *
138
- * On write collision (two concurrent identical requests), the second request
139
- * re-reads and returns the first-stored result.
140
- *
141
- * When `signing.idempotencyKeys: true`, keys are HMAC'd before storage to
142
- * prevent enumeration. When off, raw keys are stored (slight enumeration risk).
143
- */
144
- export const idempotent = (opts) => async (c, next) => {
145
- const rawKey = c.req.header(HEADER_IDEMPOTENCY_KEY);
146
- if (!rawKey) {
147
- await next();
148
- return;
149
- }
150
- const userId = c.get("authUserId") ?? null;
151
- const key = deriveKey(rawKey, userId);
152
- const ttl = opts?.ttl ?? 86400;
153
- // Cache hit — return stored response
154
- const cached = await getRecord(key);
155
- if (cached) {
156
- return c.json(JSON.parse(cached.body), cached.status);
157
- }
158
- // Cache miss — call handler
159
- await next();
160
- // Capture the response body by reading it
161
- const status = c.res.status;
162
- let body = "";
163
- try {
164
- body = await c.res.clone().text();
165
- }
166
- catch {
167
- // Non-text/non-json response — skip caching
168
- return;
169
- }
170
- const record = { status, body, createdAt: Date.now() };
171
- const stored = await tryStoreRecord(key, record, ttl);
172
- if (!stored) {
173
- // Write collision — return the first-stored result
174
- const winner = await getRecord(key);
175
- if (winner) {
176
- c.res = new Response(winner.body, {
177
- status: winner.status,
178
- headers: { "content-type": "application/json" },
179
- });
180
- }
181
- }
182
- };
@@ -1,25 +0,0 @@
1
- import { type JWK } from "jose";
2
- export interface JwksKeyConfig {
3
- privateKey: string;
4
- publicKey: string;
5
- kid?: string;
6
- }
7
- type KeyMaterial = CryptoKey;
8
- export declare function loadJwksKey(config: JwksKeyConfig): Promise<void>;
9
- export declare function loadPreviousKey(config: {
10
- publicKey: string;
11
- kid?: string;
12
- }): Promise<void>;
13
- export declare function generateAndLoadKeyPair(): Promise<{
14
- privateKey: string;
15
- publicKey: string;
16
- }>;
17
- export declare function getSigningPrivateKey(): KeyMaterial;
18
- export declare function getVerifyPublicKeys(): KeyMaterial[];
19
- export declare function getJwks(): {
20
- keys: JWK[];
21
- };
22
- export declare function isJwksLoaded(): boolean;
23
- /** @internal — reset for tests */
24
- export declare function _resetJwksState(): void;
25
- export {};
package/dist/lib/jwks.js DELETED
@@ -1,51 +0,0 @@
1
- import { generateKeyPair, exportJWK, importPKCS8, importSPKI } from "jose";
2
- let _primaryKey = null;
3
- let _previousKeys = [];
4
- export async function loadJwksKey(config) {
5
- const kid = config.kid ?? "key-1";
6
- const privateKey = await importPKCS8(config.privateKey, "RS256");
7
- const publicKey = await importSPKI(config.publicKey, "RS256");
8
- const jwk = await exportJWK(publicKey);
9
- _primaryKey = { privateKey, publicKey, jwk: { ...jwk, kid, alg: "RS256", use: "sig" }, kid };
10
- }
11
- export async function loadPreviousKey(config) {
12
- const kid = config.kid ?? `key-prev-${_previousKeys.length + 1}`;
13
- const publicKey = await importSPKI(config.publicKey, "RS256");
14
- const jwk = await exportJWK(publicKey);
15
- _previousKeys.push({ privateKey: null, publicKey, jwk: { ...jwk, kid, alg: "RS256", use: "sig" }, kid });
16
- }
17
- export async function generateAndLoadKeyPair() {
18
- const { privateKey: pk, publicKey: pubk } = await generateKeyPair("RS256", { modulusLength: 2048, extractable: true });
19
- const { exportSPKI, exportPKCS8 } = await import("jose");
20
- const privatePem = await exportPKCS8(pk);
21
- const publicPem = await exportSPKI(pubk);
22
- await loadJwksKey({ privateKey: privatePem, publicKey: publicPem, kid: "key-1" });
23
- return { privateKey: privatePem, publicKey: publicPem };
24
- }
25
- export function getSigningPrivateKey() {
26
- if (!_primaryKey)
27
- throw new Error("RS256 requires OIDC key configuration — call loadJwksKey() first");
28
- return _primaryKey.privateKey;
29
- }
30
- export function getVerifyPublicKeys() {
31
- const keys = [];
32
- if (_primaryKey)
33
- keys.push(_primaryKey.publicKey);
34
- keys.push(..._previousKeys.map((k) => k.publicKey));
35
- return keys;
36
- }
37
- export function getJwks() {
38
- const keys = [];
39
- if (_primaryKey)
40
- keys.push(_primaryKey.jwk);
41
- keys.push(..._previousKeys.map((k) => k.jwk));
42
- return { keys };
43
- }
44
- export function isJwksLoaded() {
45
- return _primaryKey !== null;
46
- }
47
- /** @internal — reset for tests */
48
- export function _resetJwksState() {
49
- _primaryKey = null;
50
- _previousKeys = [];
51
- }
package/dist/lib/jwt.d.ts DELETED
@@ -1,15 +0,0 @@
1
- import type { JWTPayload } from "jose";
2
- export declare function validateJwtSecrets(): void;
3
- export type TokenClaims = {
4
- sub: string;
5
- sid?: string;
6
- scope?: string;
7
- [key: string]: unknown;
8
- };
9
- export declare function signToken(claims: TokenClaims, expirySeconds?: number): Promise<string>;
10
- export declare function signToken(userId: string, sessionId: string, expirySeconds?: number): Promise<string>;
11
- export declare const verifyToken: (token: string) => Promise<JWTPayload>;
12
- /** @internal — used by Feature 8 (OIDC) to switch to RS256 once key material is loaded */
13
- export declare function _setAlgorithm(alg: string): void;
14
- /** @internal — reset for testing */
15
- export declare function _resetJwtState(): void;