@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
@@ -1,514 +0,0 @@
1
- import { createRoute, withSecurity } from "../lib/createRoute";
2
- import { createRouter } from "../lib/context";
3
- import { setCookie } from "hono/cookie";
4
- import { decodeIdToken } from "arctic";
5
- import { z } from "zod";
6
- import { getGoogle, getApple, getMicrosoft, getGitHub, storeOAuthState, consumeOAuthState, generateState, generateCodeVerifier, } from "../lib/oauth";
7
- import { getAuthAdapter } from "../lib/authAdapter";
8
- import { HttpError } from "../lib/HttpError";
9
- import { signToken } from "../lib/jwt";
10
- import { createSession, getActiveSessionCount, evictOldestSession, setRefreshToken } from "../lib/session";
11
- import { storeOAuthCode, consumeOAuthCode } from "../lib/oauthCode";
12
- import { COOKIE_TOKEN, COOKIE_REFRESH_TOKEN } from "../lib/constants";
13
- import { userAuth } from "../middleware/userAuth";
14
- import { getDefaultRole, getMaxSessions, getRefreshTokenConfig, getAccessTokenExpiry, getRefreshTokenExpiry, getCsrfEnabled } from "../lib/appConfig";
15
- import { refreshCsrfToken } from "../middleware/csrf";
16
- import { trackAttempt } from "../lib/authRateLimit";
17
- import { getClientIp } from "../lib/clientIp";
18
- const isProd = process.env.NODE_ENV === "production";
19
- const cookieOptions = (maxAge) => ({
20
- httpOnly: true,
21
- secure: isProd,
22
- sameSite: "Lax",
23
- path: "/",
24
- maxAge: maxAge ?? 60 * 60 * 24 * 7,
25
- });
26
- const tags = ["OAuth"];
27
- const OAuthErrorResponse = z.object({ error: z.string().describe("Human-readable error message.") }).openapi("OAuthErrorResponse");
28
- const finishOAuth = async (c, provider, providerId, profile, postLoginRedirect) => {
29
- const adapter = getAuthAdapter();
30
- if (!adapter.findOrCreateByProvider) {
31
- return c.json({ error: "Auth adapter does not support social login" }, 500);
32
- }
33
- let user;
34
- try {
35
- user = await adapter.findOrCreateByProvider(provider, providerId, profile);
36
- }
37
- catch (err) {
38
- const message = err instanceof HttpError ? err.message : "Authentication failed";
39
- const sep = postLoginRedirect.includes("?") ? "&" : "?";
40
- return c.redirect(`${postLoginRedirect}${sep}error=${encodeURIComponent(message)}`);
41
- }
42
- if (user.created) {
43
- const role = getDefaultRole();
44
- if (role && adapter.setRoles)
45
- await adapter.setRoles(user.id, [role]);
46
- }
47
- const sessionId = crypto.randomUUID();
48
- const rtConfig = getRefreshTokenConfig();
49
- const expirySeconds = rtConfig ? getAccessTokenExpiry() : undefined;
50
- const token = await signToken(user.id, sessionId, expirySeconds);
51
- const metadata = {
52
- ipAddress: getClientIp(c),
53
- userAgent: c.req.header("user-agent") ?? undefined,
54
- };
55
- while (await getActiveSessionCount(user.id) >= getMaxSessions()) {
56
- await evictOldestSession(user.id);
57
- }
58
- await createSession(user.id, token, sessionId, metadata);
59
- let refreshTokenValue;
60
- if (rtConfig) {
61
- refreshTokenValue = crypto.randomUUID();
62
- await setRefreshToken(sessionId, refreshTokenValue);
63
- }
64
- // Store a one-time authorization code instead of exposing the token in the redirect URL.
65
- // The client exchanges this code via POST /auth/oauth/exchange to get the session token.
66
- const code = await storeOAuthCode({
67
- token,
68
- userId: user.id,
69
- email: profile.email,
70
- refreshToken: refreshTokenValue,
71
- });
72
- try {
73
- const url = new URL(postLoginRedirect);
74
- url.searchParams.set("code", code);
75
- if (profile.email)
76
- url.searchParams.set("user", profile.email);
77
- return c.redirect(url.toString());
78
- }
79
- catch {
80
- // Relative path fallback
81
- const sep = postLoginRedirect.includes("?") ? "&" : "?";
82
- const userParam = profile.email ? `&user=${encodeURIComponent(profile.email)}` : "";
83
- return c.redirect(`${postLoginRedirect}${sep}code=${code}${userParam}`);
84
- }
85
- };
86
- export const createOAuthRouter = (providers, postLoginRedirect) => {
87
- const router = createRouter();
88
- // ─── Google ───────────────────────────────────────────────────────────────
89
- if (providers.includes("google")) {
90
- router.openapi(createRoute({
91
- method: "get",
92
- path: "/auth/google",
93
- summary: "Initiate Google OAuth",
94
- description: "Redirects the user to Google's consent screen to begin the OAuth login flow. After the user authorizes, Google redirects back to `/auth/google/callback`.",
95
- tags,
96
- responses: {
97
- 302: { description: "Redirect to Google's OAuth consent screen." },
98
- 500: { content: { "application/json": { schema: OAuthErrorResponse } }, description: "OAuth provider not configured." },
99
- },
100
- }), async (c) => {
101
- const state = generateState();
102
- const codeVerifier = generateCodeVerifier();
103
- await storeOAuthState(state, codeVerifier);
104
- const url = getGoogle().createAuthorizationURL(state, codeVerifier, ["openid", "profile", "email"]);
105
- return c.redirect(url.toString());
106
- });
107
- router.openapi(createRoute({
108
- method: "get",
109
- path: "/auth/google/callback",
110
- summary: "Google OAuth callback",
111
- description: "Handles the redirect from Google after user authorization. Validates the OAuth state and code, then creates or finds the user account. Sets a session cookie and redirects to the configured post-login URL.",
112
- tags,
113
- request: {
114
- query: z.object({
115
- code: z.string().describe("Authorization code from Google."),
116
- state: z.string().describe("OAuth state parameter for CSRF protection."),
117
- }),
118
- },
119
- responses: {
120
- 302: { description: "Redirect to the post-login URL with session token." },
121
- 400: { content: { "application/json": { schema: OAuthErrorResponse } }, description: "Invalid callback parameters or expired state." },
122
- },
123
- }), async (c) => {
124
- const { code, state } = c.req.valid("query");
125
- if (!code || !state)
126
- return c.json({ error: "Invalid callback" }, 400);
127
- const stored = await consumeOAuthState(state);
128
- if (!stored?.codeVerifier)
129
- return c.json({ error: "Invalid or expired state" }, 400);
130
- const tokens = await getGoogle().validateAuthorizationCode(code, stored.codeVerifier);
131
- const info = await fetch("https://openidconnect.googleapis.com/v1/userinfo", {
132
- headers: { Authorization: `Bearer ${tokens.accessToken()}` },
133
- }).then((r) => r.json());
134
- if (stored.linkUserId) {
135
- const adapter = getAuthAdapter();
136
- if (!adapter.linkProvider)
137
- return c.json({ error: "Auth adapter does not support linkProvider" }, 500);
138
- await adapter.linkProvider(stored.linkUserId, "google", info.sub);
139
- const sep = postLoginRedirect.includes("?") ? "&" : "?";
140
- return c.redirect(`${postLoginRedirect}${sep}linked=google`);
141
- }
142
- return finishOAuth(c, "google", info.sub, { email: info.email, name: info.name, avatarUrl: info.picture }, postLoginRedirect);
143
- });
144
- router.use("/auth/google/link", userAuth);
145
- router.openapi(withSecurity(createRoute({
146
- method: "get",
147
- path: "/auth/google/link",
148
- summary: "Link Google account",
149
- description: "Initiates an OAuth flow to link a Google account to the authenticated user. Requires a valid session. Redirects to Google's consent screen.",
150
- tags,
151
- responses: {
152
- 302: { description: "Redirect to Google's OAuth consent screen." },
153
- 401: { content: { "application/json": { schema: OAuthErrorResponse } }, description: "No valid session." },
154
- },
155
- }), { cookieAuth: [] }, { userToken: [] }), async (c) => {
156
- const state = generateState();
157
- const codeVerifier = generateCodeVerifier();
158
- await storeOAuthState(state, codeVerifier, c.get("authUserId"));
159
- const url = getGoogle().createAuthorizationURL(state, codeVerifier, ["openid", "profile", "email"]);
160
- return c.redirect(url.toString());
161
- });
162
- router.openapi(withSecurity(createRoute({
163
- method: "delete",
164
- path: "/auth/google/link",
165
- summary: "Unlink Google account",
166
- description: "Removes the linked Google OAuth account from the authenticated user. Requires a valid session.",
167
- tags,
168
- responses: {
169
- 204: { description: "Google account unlinked successfully." },
170
- 401: { content: { "application/json": { schema: OAuthErrorResponse } }, description: "No valid session." },
171
- 500: { content: { "application/json": { schema: OAuthErrorResponse } }, description: "Auth adapter does not support unlinkProvider." },
172
- },
173
- }), { cookieAuth: [] }, { userToken: [] }), async (c) => {
174
- const adapter = getAuthAdapter();
175
- if (!adapter.unlinkProvider) {
176
- return c.json({ error: "Auth adapter does not support unlinkProvider" }, 500);
177
- }
178
- await adapter.unlinkProvider(c.get("authUserId"), "google");
179
- return c.body(null, 204);
180
- });
181
- }
182
- // ─── Apple ────────────────────────────────────────────────────────────────
183
- if (providers.includes("apple")) {
184
- router.openapi(createRoute({
185
- method: "get",
186
- path: "/auth/apple",
187
- summary: "Initiate Apple OAuth",
188
- description: "Redirects the user to Apple's sign-in page to begin the OAuth login flow. After the user authorizes, Apple posts back to `/auth/apple/callback`.",
189
- tags,
190
- responses: {
191
- 302: { description: "Redirect to Apple's OAuth sign-in page." },
192
- 500: { content: { "application/json": { schema: OAuthErrorResponse } }, description: "OAuth provider not configured." },
193
- },
194
- }), async (c) => {
195
- const state = generateState();
196
- await storeOAuthState(state);
197
- const url = getApple().createAuthorizationURL(state, ["name", "email"]);
198
- return c.redirect(url.toString());
199
- });
200
- // Apple sends a POST with form data to the callback URL
201
- router.openapi(createRoute({
202
- method: "post",
203
- path: "/auth/apple/callback",
204
- summary: "Apple OAuth callback",
205
- description: "Handles the POST redirect from Apple after user authorization. Apple sends form-encoded data containing the authorization code and state. Validates the OAuth state, exchanges the code for tokens, then creates or finds the user account. Sets a session cookie and redirects to the configured post-login URL.",
206
- tags,
207
- responses: {
208
- 302: { description: "Redirect to the post-login URL with session token." },
209
- 400: { content: { "application/json": { schema: OAuthErrorResponse } }, description: "Invalid callback parameters or expired state." },
210
- },
211
- }), async (c) => {
212
- const form = await c.req.formData();
213
- const code = form.get("code");
214
- const state = form.get("state");
215
- if (!code || !state)
216
- return c.json({ error: "Invalid callback" }, 400);
217
- const stored = await consumeOAuthState(state);
218
- if (!stored)
219
- return c.json({ error: "Invalid or expired state" }, 400);
220
- const tokens = await getApple().validateAuthorizationCode(code);
221
- const claims = decodeIdToken(tokens.idToken());
222
- if (stored.linkUserId) {
223
- const adapter = getAuthAdapter();
224
- if (!adapter.linkProvider)
225
- return c.json({ error: "Auth adapter does not support linkProvider" }, 500);
226
- await adapter.linkProvider(stored.linkUserId, "apple", claims.sub);
227
- const sep = postLoginRedirect.includes("?") ? "&" : "?";
228
- return c.redirect(`${postLoginRedirect}${sep}linked=apple`);
229
- }
230
- // Apple only sends name on the very first sign-in
231
- const userJSON = form.get("user");
232
- const userInfo = userJSON ? JSON.parse(userJSON) : {};
233
- const name = userInfo.name
234
- ? `${userInfo.name.firstName ?? ""} ${userInfo.name.lastName ?? ""}`.trim() || undefined
235
- : undefined;
236
- return finishOAuth(c, "apple", claims.sub, { email: claims.email, name }, postLoginRedirect);
237
- });
238
- router.use("/auth/apple/link", userAuth);
239
- router.openapi(withSecurity(createRoute({
240
- method: "get",
241
- path: "/auth/apple/link",
242
- summary: "Link Apple account",
243
- description: "Initiates an OAuth flow to link an Apple account to the authenticated user. Requires a valid session. Redirects to Apple's sign-in page.",
244
- tags,
245
- responses: {
246
- 302: { description: "Redirect to Apple's OAuth sign-in page." },
247
- 401: { content: { "application/json": { schema: OAuthErrorResponse } }, description: "No valid session." },
248
- },
249
- }), { cookieAuth: [] }, { userToken: [] }), async (c) => {
250
- const state = generateState();
251
- await storeOAuthState(state, undefined, c.get("authUserId"));
252
- const url = getApple().createAuthorizationURL(state, ["name", "email"]);
253
- return c.redirect(url.toString());
254
- });
255
- }
256
- // ─── Microsoft ──────────────────────────────────────────────────────────
257
- if (providers.includes("microsoft")) {
258
- router.openapi(createRoute({
259
- method: "get",
260
- path: "/auth/microsoft",
261
- summary: "Initiate Microsoft OAuth",
262
- description: "Redirects the user to Microsoft's sign-in page to begin the OAuth login flow. After the user authorizes, Microsoft redirects back to `/auth/microsoft/callback`.",
263
- tags,
264
- responses: {
265
- 302: { description: "Redirect to Microsoft's OAuth sign-in page." },
266
- 500: { content: { "application/json": { schema: OAuthErrorResponse } }, description: "OAuth provider not configured." },
267
- },
268
- }), async (c) => {
269
- const state = generateState();
270
- const codeVerifier = generateCodeVerifier();
271
- await storeOAuthState(state, codeVerifier);
272
- const url = getMicrosoft().createAuthorizationURL(state, codeVerifier, ["openid", "profile", "email"]);
273
- return c.redirect(url.toString());
274
- });
275
- router.openapi(createRoute({
276
- method: "get",
277
- path: "/auth/microsoft/callback",
278
- summary: "Microsoft OAuth callback",
279
- description: "Handles the redirect from Microsoft after user authorization. Validates the OAuth state and code, then creates or finds the user account. Sets a session cookie and redirects to the configured post-login URL.",
280
- tags,
281
- request: {
282
- query: z.object({
283
- code: z.string().describe("Authorization code from Microsoft."),
284
- state: z.string().describe("OAuth state parameter for CSRF protection."),
285
- }),
286
- },
287
- responses: {
288
- 302: { description: "Redirect to the post-login URL with session token." },
289
- 400: { content: { "application/json": { schema: OAuthErrorResponse } }, description: "Invalid callback parameters or expired state." },
290
- },
291
- }), async (c) => {
292
- const { code, state } = c.req.valid("query");
293
- if (!code || !state)
294
- return c.json({ error: "Invalid callback" }, 400);
295
- const stored = await consumeOAuthState(state);
296
- if (!stored?.codeVerifier)
297
- return c.json({ error: "Invalid or expired state" }, 400);
298
- const tokens = await getMicrosoft().validateAuthorizationCode(code, stored.codeVerifier);
299
- const info = await fetch("https://graph.microsoft.com/v1.0/me", {
300
- headers: { Authorization: `Bearer ${tokens.accessToken()}` },
301
- }).then((r) => r.json());
302
- if (stored.linkUserId) {
303
- const adapter = getAuthAdapter();
304
- if (!adapter.linkProvider)
305
- return c.json({ error: "Auth adapter does not support linkProvider" }, 500);
306
- await adapter.linkProvider(stored.linkUserId, "microsoft", info.id);
307
- const sep = postLoginRedirect.includes("?") ? "&" : "?";
308
- return c.redirect(`${postLoginRedirect}${sep}linked=microsoft`);
309
- }
310
- return finishOAuth(c, "microsoft", info.id, { email: info.mail ?? info.userPrincipalName, name: info.displayName }, postLoginRedirect);
311
- });
312
- router.use("/auth/microsoft/link", userAuth);
313
- router.openapi(withSecurity(createRoute({
314
- method: "get",
315
- path: "/auth/microsoft/link",
316
- summary: "Link Microsoft account",
317
- description: "Initiates an OAuth flow to link a Microsoft account to the authenticated user. Requires a valid session. Redirects to Microsoft's sign-in page.",
318
- tags,
319
- responses: {
320
- 302: { description: "Redirect to Microsoft's OAuth sign-in page." },
321
- 401: { content: { "application/json": { schema: OAuthErrorResponse } }, description: "No valid session." },
322
- },
323
- }), { cookieAuth: [] }, { userToken: [] }), async (c) => {
324
- const state = generateState();
325
- const codeVerifier = generateCodeVerifier();
326
- await storeOAuthState(state, codeVerifier, c.get("authUserId"));
327
- const url = getMicrosoft().createAuthorizationURL(state, codeVerifier, ["openid", "profile", "email"]);
328
- return c.redirect(url.toString());
329
- });
330
- router.openapi(withSecurity(createRoute({
331
- method: "delete",
332
- path: "/auth/microsoft/link",
333
- summary: "Unlink Microsoft account",
334
- description: "Removes the linked Microsoft OAuth account from the authenticated user. Requires a valid session.",
335
- tags,
336
- responses: {
337
- 204: { description: "Microsoft account unlinked successfully." },
338
- 401: { content: { "application/json": { schema: OAuthErrorResponse } }, description: "No valid session." },
339
- 500: { content: { "application/json": { schema: OAuthErrorResponse } }, description: "Auth adapter does not support unlinkProvider." },
340
- },
341
- }), { cookieAuth: [] }, { userToken: [] }), async (c) => {
342
- const adapter = getAuthAdapter();
343
- if (!adapter.unlinkProvider) {
344
- return c.json({ error: "Auth adapter does not support unlinkProvider" }, 500);
345
- }
346
- await adapter.unlinkProvider(c.get("authUserId"), "microsoft");
347
- return c.body(null, 204);
348
- });
349
- }
350
- // ─── GitHub ────────────────────────────────────────────────────────────
351
- if (providers.includes("github")) {
352
- router.openapi(createRoute({
353
- method: "get",
354
- path: "/auth/github",
355
- summary: "Initiate GitHub OAuth",
356
- description: "Redirects the user to GitHub's authorization page to begin the OAuth login flow. After the user authorizes, GitHub redirects back to `/auth/github/callback`.",
357
- tags,
358
- responses: {
359
- 302: { description: "Redirect to GitHub's OAuth authorization page." },
360
- 500: { content: { "application/json": { schema: OAuthErrorResponse } }, description: "OAuth provider not configured." },
361
- },
362
- }), async (c) => {
363
- const state = generateState();
364
- await storeOAuthState(state);
365
- const url = getGitHub().createAuthorizationURL(state, ["read:user", "user:email"]);
366
- return c.redirect(url.toString());
367
- });
368
- router.openapi(createRoute({
369
- method: "get",
370
- path: "/auth/github/callback",
371
- summary: "GitHub OAuth callback",
372
- description: "Handles the redirect from GitHub after user authorization. Validates the OAuth state and code, then creates or finds the user account. Sets a session cookie and redirects to the configured post-login URL.",
373
- tags,
374
- request: {
375
- query: z.object({
376
- code: z.string().describe("Authorization code from GitHub."),
377
- state: z.string().describe("OAuth state parameter for CSRF protection."),
378
- }),
379
- },
380
- responses: {
381
- 302: { description: "Redirect to the post-login URL with session token." },
382
- 400: { content: { "application/json": { schema: OAuthErrorResponse } }, description: "Invalid callback parameters or expired state." },
383
- },
384
- }), async (c) => {
385
- const { code, state } = c.req.valid("query");
386
- if (!code || !state)
387
- return c.json({ error: "Invalid callback" }, 400);
388
- const stored = await consumeOAuthState(state);
389
- if (!stored)
390
- return c.json({ error: "Invalid or expired state" }, 400);
391
- const tokens = await getGitHub().validateAuthorizationCode(code);
392
- const headers = { Authorization: `Bearer ${tokens.accessToken()}`, "User-Agent": "bunshot" };
393
- const info = await fetch("https://api.github.com/user", { headers })
394
- .then((r) => r.json());
395
- // GitHub may not return email on /user if it's private — fetch from /user/emails
396
- let email = info.email;
397
- if (!email) {
398
- const emails = await fetch("https://api.github.com/user/emails", { headers })
399
- .then((r) => r.json());
400
- email = emails.find((e) => e.primary && e.verified)?.email ?? emails.find((e) => e.verified)?.email;
401
- }
402
- if (stored.linkUserId) {
403
- const adapter = getAuthAdapter();
404
- if (!adapter.linkProvider)
405
- return c.json({ error: "Auth adapter does not support linkProvider" }, 500);
406
- await adapter.linkProvider(stored.linkUserId, "github", String(info.id));
407
- const sep = postLoginRedirect.includes("?") ? "&" : "?";
408
- return c.redirect(`${postLoginRedirect}${sep}linked=github`);
409
- }
410
- return finishOAuth(c, "github", String(info.id), { email, name: info.name, avatarUrl: info.avatar_url }, postLoginRedirect);
411
- });
412
- router.use("/auth/github/link", userAuth);
413
- router.openapi(withSecurity(createRoute({
414
- method: "get",
415
- path: "/auth/github/link",
416
- summary: "Link GitHub account",
417
- description: "Initiates an OAuth flow to link a GitHub account to the authenticated user. Requires a valid session. Redirects to GitHub's authorization page.",
418
- tags,
419
- responses: {
420
- 302: { description: "Redirect to GitHub's OAuth authorization page." },
421
- 401: { content: { "application/json": { schema: OAuthErrorResponse } }, description: "No valid session." },
422
- },
423
- }), { cookieAuth: [] }, { userToken: [] }), async (c) => {
424
- const state = generateState();
425
- await storeOAuthState(state, undefined, c.get("authUserId"));
426
- const url = getGitHub().createAuthorizationURL(state, ["read:user", "user:email"]);
427
- return c.redirect(url.toString());
428
- });
429
- router.openapi(withSecurity(createRoute({
430
- method: "delete",
431
- path: "/auth/github/link",
432
- summary: "Unlink GitHub account",
433
- description: "Removes the linked GitHub OAuth account from the authenticated user. Requires a valid session.",
434
- tags,
435
- responses: {
436
- 204: { description: "GitHub account unlinked successfully." },
437
- 401: { content: { "application/json": { schema: OAuthErrorResponse } }, description: "No valid session." },
438
- 500: { content: { "application/json": { schema: OAuthErrorResponse } }, description: "Auth adapter does not support unlinkProvider." },
439
- },
440
- }), { cookieAuth: [] }, { userToken: [] }), async (c) => {
441
- const adapter = getAuthAdapter();
442
- if (!adapter.unlinkProvider) {
443
- return c.json({ error: "Auth adapter does not support unlinkProvider" }, 500);
444
- }
445
- await adapter.unlinkProvider(c.get("authUserId"), "github");
446
- return c.body(null, 204);
447
- });
448
- }
449
- // ─── Code Exchange ─────────────────────────────────────────────────────
450
- router.openapi(createRoute({
451
- method: "post",
452
- path: "/auth/oauth/exchange",
453
- summary: "Exchange OAuth authorization code for session token",
454
- description: "Exchanges a one-time authorization code (received from the OAuth redirect) for a session token. The code is single-use and expires after 60 seconds. Sets session cookies for browser clients; returns the token in the JSON response for mobile/SPA clients.",
455
- tags,
456
- request: {
457
- body: {
458
- content: {
459
- "application/json": {
460
- schema: z.object({
461
- code: z.string().describe("One-time authorization code from the OAuth redirect."),
462
- }),
463
- },
464
- },
465
- },
466
- },
467
- responses: {
468
- 200: {
469
- content: {
470
- "application/json": {
471
- schema: z.object({
472
- token: z.string().describe("Session JWT."),
473
- userId: z.string().describe("Authenticated user ID."),
474
- email: z.string().optional().describe("User email if available."),
475
- refreshToken: z.string().optional().describe("Refresh token if refresh tokens are configured."),
476
- }),
477
- },
478
- },
479
- description: "Session token and user info.",
480
- },
481
- 400: { content: { "application/json": { schema: OAuthErrorResponse } }, description: "Missing code parameter." },
482
- 401: { content: { "application/json": { schema: OAuthErrorResponse } }, description: "Invalid, expired, or already-used code." },
483
- 429: { content: { "application/json": { schema: OAuthErrorResponse } }, description: "Rate limit exceeded." },
484
- },
485
- }), async (c) => {
486
- // Rate limit by IP to prevent brute-forcing codes within the 60s TTL
487
- const ip = getClientIp(c);
488
- const limited = await trackAttempt(`oauth-exchange:ip:${ip}`, { max: 20, windowMs: 60_000 });
489
- if (limited) {
490
- return c.json({ error: "Too many requests" }, 429);
491
- }
492
- const { code } = c.req.valid("json");
493
- if (!code)
494
- return c.json({ error: "Missing code" }, 400);
495
- const payload = await consumeOAuthCode(code);
496
- if (!payload)
497
- return c.json({ error: "Invalid or expired code" }, 401);
498
- // Set session cookies for browser clients
499
- const rtConfig = getRefreshTokenConfig();
500
- setCookie(c, COOKIE_TOKEN, payload.token, cookieOptions(rtConfig ? getAccessTokenExpiry() : undefined));
501
- if (payload.refreshToken && rtConfig) {
502
- setCookie(c, COOKIE_REFRESH_TOKEN, payload.refreshToken, cookieOptions(getRefreshTokenExpiry()));
503
- }
504
- if (getCsrfEnabled())
505
- refreshCsrfToken(c);
506
- return c.json({
507
- token: payload.token,
508
- userId: payload.userId,
509
- email: payload.email,
510
- refreshToken: payload.refreshToken,
511
- }, 200);
512
- });
513
- return router;
514
- };
@@ -1,2 +0,0 @@
1
- import type { PresignedUrlConfig } from "../app";
2
- export declare const createUploadsRouter: (config: PresignedUrlConfig) => import("@hono/zod-openapi").OpenAPIHono<import("../lib/context").AppEnv, {}, "/">;
@@ -1,135 +0,0 @@
1
- import { z } from "zod";
2
- import { createRouter } from "../lib/context";
3
- import { createRoute } from "../lib/createRoute";
4
- import { userAuth } from "../middleware/userAuth";
5
- import { getStorageAdapter, getUploadConfig } from "../lib/upload";
6
- import { getSigningConfig, getSigningSecret } from "../lib/appConfig";
7
- import { createPresignedUrl } from "../lib/signing";
8
- const tags = ["Uploads"];
9
- export const createUploadsRouter = (config) => {
10
- const router = createRouter();
11
- const basePath = (config.path ?? "/uploads").replace(/\/$/, "");
12
- router.use(`${basePath}/*`, userAuth);
13
- const presignRoute = createRoute({
14
- method: "post",
15
- path: `${basePath}/presign`,
16
- tags,
17
- summary: "Generate presigned upload URL",
18
- request: {
19
- body: {
20
- content: {
21
- "application/json": {
22
- schema: z.object({
23
- key: z.string().describe("Storage key for the upload"),
24
- mimeType: z.string().optional().describe("MIME type of the file"),
25
- expirySeconds: z.number().int().positive().optional().describe("URL expiry in seconds"),
26
- }),
27
- },
28
- },
29
- },
30
- },
31
- responses: {
32
- 200: {
33
- description: "Presigned URL generated",
34
- content: { "application/json": { schema: z.object({ url: z.string(), key: z.string() }) } },
35
- },
36
- 501: {
37
- description: "Not implemented by adapter",
38
- content: { "application/json": { schema: z.object({ error: z.string() }) } },
39
- },
40
- },
41
- });
42
- router.openapi(presignRoute, async (c) => {
43
- const adapter = getStorageAdapter();
44
- if (!adapter?.presignPut) {
45
- return c.json({ error: "Presigned URLs not supported by the configured storage adapter" }, 501);
46
- }
47
- const { key, mimeType, expirySeconds } = c.req.valid("json");
48
- const _uploadConfig = getUploadConfig();
49
- const expiry = expirySeconds ?? (typeof config.expirySeconds === "number" ? config.expirySeconds : 3600);
50
- const url = await adapter.presignPut(key, { expirySeconds: expiry, mimeType });
51
- return c.json({ url, key }, 200);
52
- });
53
- const presignGetRoute = createRoute({
54
- method: "get",
55
- path: `${basePath}/presign/:key{.+}`,
56
- tags,
57
- summary: "Generate presigned download URL",
58
- request: {
59
- params: z.object({ key: z.string() }),
60
- query: z.object({
61
- expiry: z.string().optional().describe("URL expiry in seconds (default: 3600)"),
62
- }),
63
- },
64
- responses: {
65
- 200: {
66
- description: "Presigned download URL",
67
- content: {
68
- "application/json": {
69
- schema: z.object({
70
- url: z.string(),
71
- expiresAt: z.number().describe("Unix timestamp (seconds) when the URL expires"),
72
- }),
73
- },
74
- },
75
- },
76
- 501: {
77
- description: "Not implemented",
78
- content: { "application/json": { schema: z.object({ error: z.string() }) } },
79
- },
80
- },
81
- });
82
- router.openapi(presignGetRoute, async (c) => {
83
- const { key } = c.req.valid("param");
84
- const { expiry: expiryStr } = c.req.valid("query");
85
- const expirySeconds = expiryStr ? parseInt(expiryStr, 10) : (typeof config.expirySeconds === "number" ? config.expirySeconds : 3600);
86
- const signingCfg = getSigningConfig();
87
- if (signingCfg?.presignedUrls) {
88
- const secret = getSigningSecret();
89
- if (!secret)
90
- return c.json({ error: "Signing secret not configured" }, 501);
91
- const defaultExpiry = typeof signingCfg.presignedUrls === "object"
92
- ? (signingCfg.presignedUrls.defaultExpiry ?? expirySeconds)
93
- : expirySeconds;
94
- const base = new URL(c.req.url);
95
- base.pathname = `${basePath}/download/${key}`;
96
- base.search = "";
97
- const url = createPresignedUrl(base.toString(), key, { method: "GET", expiry: defaultExpiry }, secret);
98
- const expiresAt = Math.floor(Date.now() / 1000) + defaultExpiry;
99
- return c.json({ url, expiresAt }, 200);
100
- }
101
- // Fallback: adapter.presignGet (S3 only)
102
- const adapter = getStorageAdapter();
103
- if (!adapter?.presignGet) {
104
- return c.json({ error: "Presigned download URLs not supported. Enable signing.presignedUrls or use an S3 adapter." }, 501);
105
- }
106
- const url = await adapter.presignGet(key, { expirySeconds });
107
- const expiresAt = Math.floor(Date.now() / 1000) + expirySeconds;
108
- return c.json({ url, expiresAt }, 200);
109
- });
110
- const deleteRoute = createRoute({
111
- method: "delete",
112
- path: `${basePath}/:key{.+}`,
113
- tags,
114
- summary: "Delete an uploaded file",
115
- request: {
116
- params: z.object({ key: z.string() }),
117
- },
118
- responses: {
119
- 204: { description: "Deleted" },
120
- 500: {
121
- description: "No storage adapter configured",
122
- content: { "application/json": { schema: z.object({ error: z.string() }) } },
123
- },
124
- },
125
- });
126
- router.openapi(deleteRoute, async (c) => {
127
- const adapter = getStorageAdapter();
128
- if (!adapter)
129
- return c.json({ error: "No storage adapter configured" }, 500);
130
- const { key } = c.req.valid("param");
131
- await adapter.delete(key);
132
- return c.body(null, 204);
133
- });
134
- return router;
135
- };