@lastshotlabs/bunshot 0.0.25 → 0.0.28

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (725) hide show
  1. package/.oclif.manifest.json +39 -0
  2. package/README.md +8282 -2147
  3. package/dist/cli/commands/init.js +690 -0
  4. package/dist/cli/index.js +6 -0
  5. package/dist/cli.js +4 -4
  6. package/dist/packages/bunshot-admin/src/index.d.ts +15 -0
  7. package/dist/packages/bunshot-admin/src/index.js +11 -0
  8. package/dist/packages/bunshot-admin/src/lib/resourceTypes.d.ts +8 -0
  9. package/dist/packages/bunshot-admin/src/lib/resourceTypes.js +33 -0
  10. package/dist/packages/bunshot-admin/src/lib/typedRoute.d.ts +14 -0
  11. package/dist/packages/bunshot-admin/src/lib/typedRoute.js +17 -0
  12. package/dist/packages/bunshot-admin/src/plugin.d.ts +4 -0
  13. package/dist/packages/bunshot-admin/src/plugin.js +46 -0
  14. package/dist/packages/bunshot-admin/src/providers/auth0Access.d.ts +6 -0
  15. package/dist/packages/bunshot-admin/src/providers/auth0Access.js +32 -0
  16. package/dist/packages/bunshot-admin/src/routes/admin.d.ts +10 -0
  17. package/dist/packages/bunshot-admin/src/routes/admin.js +923 -0
  18. package/dist/packages/bunshot-admin/src/routes/mail.d.ts +6 -0
  19. package/dist/packages/bunshot-admin/src/routes/mail.js +114 -0
  20. package/dist/packages/bunshot-admin/src/routes/permissions.d.ts +8 -0
  21. package/dist/packages/bunshot-admin/src/routes/permissions.js +315 -0
  22. package/dist/packages/bunshot-admin/src/types/config.d.ts +16 -0
  23. package/dist/packages/bunshot-admin/src/types/config.js +37 -0
  24. package/dist/packages/bunshot-admin/src/types/env.d.ts +14 -0
  25. package/dist/packages/bunshot-admin/src/types/provider.d.ts +1 -0
  26. package/dist/packages/bunshot-admin/src/types/provider.js +4 -0
  27. package/dist/packages/bunshot-auth/src/adapters/memoryAuth.d.ts +66 -0
  28. package/dist/packages/bunshot-auth/src/adapters/memoryAuth.js +1063 -0
  29. package/dist/packages/bunshot-auth/src/adapters/mongoAuth.d.ts +2 -0
  30. package/dist/packages/bunshot-auth/src/adapters/mongoAuth.js +536 -0
  31. package/dist/packages/bunshot-auth/src/adapters/sqliteAuth.d.ts +88 -0
  32. package/dist/packages/bunshot-auth/src/adapters/sqliteAuth.js +1366 -0
  33. package/dist/packages/bunshot-auth/src/admin/bunshotAccess.d.ts +2 -0
  34. package/dist/packages/bunshot-auth/src/admin/bunshotAccess.js +23 -0
  35. package/dist/packages/bunshot-auth/src/admin/bunshotUsers.d.ts +5 -0
  36. package/dist/packages/bunshot-auth/src/admin/bunshotUsers.js +131 -0
  37. package/dist/packages/bunshot-auth/src/bootstrap.d.ts +38 -0
  38. package/dist/packages/bunshot-auth/src/bootstrap.js +384 -0
  39. package/dist/packages/bunshot-auth/src/config/appConfig.d.ts +3 -0
  40. package/dist/packages/bunshot-auth/src/config/appConfig.js +4 -0
  41. package/dist/packages/bunshot-auth/src/config/authConfig.d.ts +478 -0
  42. package/dist/packages/bunshot-auth/src/config/authConfig.js +46 -0
  43. package/dist/packages/bunshot-auth/src/config/configLock.d.ts +2 -0
  44. package/dist/packages/bunshot-auth/src/config/configLock.js +10 -0
  45. package/dist/packages/bunshot-auth/src/index.d.ts +25 -0
  46. package/dist/packages/bunshot-auth/src/index.js +23 -0
  47. package/dist/packages/bunshot-auth/src/infra/mongo.d.ts +15 -0
  48. package/dist/packages/bunshot-auth/src/infra/mongo.js +44 -0
  49. package/dist/packages/bunshot-auth/src/infra/queue.d.ts +14 -0
  50. package/dist/packages/bunshot-auth/src/infra/queue.js +27 -0
  51. package/dist/packages/bunshot-auth/src/infra/redis.d.ts +5 -0
  52. package/dist/packages/bunshot-auth/src/infra/redis.js +15 -0
  53. package/dist/packages/bunshot-auth/src/infra/signing.d.ts +7 -0
  54. package/dist/packages/bunshot-auth/src/infra/signing.js +8 -0
  55. package/dist/packages/bunshot-auth/src/lib/accountLockout.d.ts +34 -0
  56. package/dist/packages/bunshot-auth/src/lib/accountLockout.js +244 -0
  57. package/dist/packages/bunshot-auth/src/lib/adapterTiers.d.ts +1 -0
  58. package/dist/packages/bunshot-auth/src/lib/adapterTiers.js +1 -0
  59. package/dist/packages/bunshot-auth/src/lib/authAdapter.d.ts +1 -0
  60. package/dist/packages/bunshot-auth/src/lib/authAdapter.js +1 -0
  61. package/dist/packages/bunshot-auth/src/lib/authContext.d.ts +15 -0
  62. package/dist/packages/bunshot-auth/src/lib/authContext.js +1 -0
  63. package/dist/packages/bunshot-auth/src/lib/authEventBus.d.ts +4 -0
  64. package/dist/packages/bunshot-auth/src/lib/authEventBus.js +15 -0
  65. package/dist/packages/bunshot-auth/src/lib/authRateLimit.d.ts +28 -0
  66. package/dist/packages/bunshot-auth/src/lib/authRateLimit.js +205 -0
  67. package/dist/packages/bunshot-auth/src/lib/breachedPassword.d.ts +19 -0
  68. package/dist/packages/bunshot-auth/src/lib/breachedPassword.js +61 -0
  69. package/dist/packages/bunshot-auth/src/lib/cache.d.ts +12 -0
  70. package/dist/packages/bunshot-auth/src/lib/cache.js +120 -0
  71. package/dist/packages/bunshot-auth/src/lib/clientIp.d.ts +4 -0
  72. package/dist/{lib → packages/bunshot-auth/src/lib}/clientIp.js +14 -7
  73. package/dist/packages/bunshot-auth/src/lib/cookieOptions.d.ts +27 -0
  74. package/dist/packages/bunshot-auth/src/lib/cookieOptions.js +33 -0
  75. package/dist/packages/bunshot-auth/src/lib/credentialStuffing.d.ts +40 -0
  76. package/dist/packages/bunshot-auth/src/lib/credentialStuffing.js +221 -0
  77. package/dist/packages/bunshot-auth/src/lib/deletionCancelToken.d.ts +19 -0
  78. package/dist/packages/bunshot-auth/src/lib/deletionCancelToken.js +148 -0
  79. package/dist/packages/bunshot-auth/src/lib/emailTemplates.d.ts +23 -0
  80. package/dist/packages/bunshot-auth/src/lib/emailTemplates.js +265 -0
  81. package/dist/packages/bunshot-auth/src/lib/emailVerification.d.ts +30 -0
  82. package/dist/packages/bunshot-auth/src/lib/emailVerification.js +200 -0
  83. package/dist/packages/bunshot-auth/src/lib/env.d.ts +1 -0
  84. package/dist/packages/bunshot-auth/src/lib/env.js +3 -0
  85. package/dist/packages/bunshot-auth/src/lib/fingerprint.js +36 -0
  86. package/dist/{lib → packages/bunshot-auth/src/lib}/groups.d.ts +15 -16
  87. package/dist/{lib → packages/bunshot-auth/src/lib}/groups.js +22 -34
  88. package/dist/packages/bunshot-auth/src/lib/jwks.d.ts +28 -0
  89. package/dist/packages/bunshot-auth/src/lib/jwks.js +79 -0
  90. package/dist/packages/bunshot-auth/src/lib/jwt.d.ts +12 -0
  91. package/dist/packages/bunshot-auth/src/lib/jwt.js +86 -0
  92. package/dist/packages/bunshot-auth/src/lib/logger.d.ts +3 -0
  93. package/dist/packages/bunshot-auth/src/lib/logger.js +13 -0
  94. package/dist/packages/bunshot-auth/src/lib/m2m.d.ts +30 -0
  95. package/dist/packages/bunshot-auth/src/lib/m2m.js +44 -0
  96. package/dist/packages/bunshot-auth/src/lib/magicLink.d.ts +13 -0
  97. package/dist/packages/bunshot-auth/src/lib/magicLink.js +145 -0
  98. package/dist/packages/bunshot-auth/src/lib/mfaChallenge.d.ts +60 -0
  99. package/dist/packages/bunshot-auth/src/lib/mfaChallenge.js +419 -0
  100. package/dist/packages/bunshot-auth/src/lib/oauth.d.ts +82 -0
  101. package/dist/packages/bunshot-auth/src/lib/oauth.js +177 -0
  102. package/dist/packages/bunshot-auth/src/lib/oauthCode.d.ts +19 -0
  103. package/dist/packages/bunshot-auth/src/lib/oauthCode.js +182 -0
  104. package/dist/packages/bunshot-auth/src/lib/oauthReauth.d.ts +19 -0
  105. package/dist/packages/bunshot-auth/src/lib/oauthReauth.js +255 -0
  106. package/dist/packages/bunshot-auth/src/lib/organization.d.ts +66 -0
  107. package/dist/packages/bunshot-auth/src/lib/organization.js +225 -0
  108. package/dist/packages/bunshot-auth/src/lib/passwordHistory.d.ts +12 -0
  109. package/dist/packages/bunshot-auth/src/lib/passwordHistory.js +31 -0
  110. package/dist/packages/bunshot-auth/src/lib/resetPassword.d.ts +20 -0
  111. package/dist/packages/bunshot-auth/src/lib/resetPassword.js +148 -0
  112. package/dist/packages/bunshot-auth/src/lib/roles.d.ts +9 -0
  113. package/dist/packages/bunshot-auth/src/lib/roles.js +93 -0
  114. package/dist/packages/bunshot-auth/src/lib/saml.d.ts +29 -0
  115. package/dist/packages/bunshot-auth/src/lib/saml.js +73 -0
  116. package/dist/packages/bunshot-auth/src/lib/samlRequestId.d.ts +13 -0
  117. package/dist/packages/bunshot-auth/src/lib/samlRequestId.js +129 -0
  118. package/dist/packages/bunshot-auth/src/lib/scim.d.ts +44 -0
  119. package/dist/packages/bunshot-auth/src/lib/scim.js +56 -0
  120. package/dist/packages/bunshot-auth/src/lib/securityEventWiring.d.ts +22 -0
  121. package/dist/packages/bunshot-auth/src/lib/securityEventWiring.js +65 -0
  122. package/dist/packages/bunshot-auth/src/lib/session.d.ts +45 -0
  123. package/dist/packages/bunshot-auth/src/lib/session.js +1211 -0
  124. package/dist/packages/bunshot-auth/src/lib/storeInfra.d.ts +26 -0
  125. package/dist/packages/bunshot-auth/src/lib/storeInfra.js +18 -0
  126. package/dist/packages/bunshot-auth/src/lib/suspension.d.ts +14 -0
  127. package/dist/packages/bunshot-auth/src/lib/suspension.js +20 -0
  128. package/dist/packages/bunshot-auth/src/lib/validateAdapter.d.ts +16 -0
  129. package/dist/packages/bunshot-auth/src/lib/validateAdapter.js +161 -0
  130. package/dist/packages/bunshot-auth/src/middleware/bearerAuth.d.ts +13 -0
  131. package/dist/packages/bunshot-auth/src/middleware/bearerAuth.js +58 -0
  132. package/dist/{middleware → packages/bunshot-auth/src/middleware}/csrf.d.ts +5 -4
  133. package/dist/packages/bunshot-auth/src/middleware/csrf.js +138 -0
  134. package/dist/packages/bunshot-auth/src/middleware/identify.d.ts +4 -0
  135. package/dist/packages/bunshot-auth/src/middleware/identify.js +124 -0
  136. package/dist/{middleware → packages/bunshot-auth/src/middleware}/requireMfaSetup.d.ts +2 -2
  137. package/dist/{middleware → packages/bunshot-auth/src/middleware}/requireMfaSetup.js +10 -7
  138. package/dist/{middleware → packages/bunshot-auth/src/middleware}/requireRole.d.ts +2 -2
  139. package/dist/{middleware → packages/bunshot-auth/src/middleware}/requireRole.js +20 -16
  140. package/dist/packages/bunshot-auth/src/middleware/requireScope.d.ts +10 -0
  141. package/dist/packages/bunshot-auth/src/middleware/requireScope.js +25 -0
  142. package/dist/packages/bunshot-auth/src/middleware/requireStepUp.d.ts +18 -0
  143. package/dist/packages/bunshot-auth/src/middleware/requireStepUp.js +30 -0
  144. package/dist/{middleware → packages/bunshot-auth/src/middleware}/requireVerifiedEmail.d.ts +2 -2
  145. package/dist/{middleware → packages/bunshot-auth/src/middleware}/requireVerifiedEmail.js +7 -6
  146. package/dist/packages/bunshot-auth/src/middleware/scimAuth.d.ts +8 -0
  147. package/dist/packages/bunshot-auth/src/middleware/scimAuth.js +29 -0
  148. package/dist/packages/bunshot-auth/src/middleware/userAuth.d.ts +3 -0
  149. package/dist/packages/bunshot-auth/src/middleware/userAuth.js +6 -0
  150. package/dist/{models → packages/bunshot-auth/src/models}/AuthUser.d.ts +19 -8
  151. package/dist/packages/bunshot-auth/src/models/AuthUser.js +53 -0
  152. package/dist/packages/bunshot-auth/src/models/Group.d.ts +19 -0
  153. package/dist/packages/bunshot-auth/src/models/Group.js +22 -0
  154. package/dist/{models → packages/bunshot-auth/src/models}/GroupMembership.d.ts +6 -8
  155. package/dist/packages/bunshot-auth/src/models/GroupMembership.js +19 -0
  156. package/dist/packages/bunshot-auth/src/models/M2MClient.d.ts +18 -0
  157. package/dist/packages/bunshot-auth/src/models/M2MClient.js +18 -0
  158. package/dist/packages/bunshot-auth/src/models/TenantRole.d.ts +13 -0
  159. package/dist/packages/bunshot-auth/src/models/TenantRole.js +17 -0
  160. package/dist/packages/bunshot-auth/src/plugin.d.ts +4 -0
  161. package/dist/packages/bunshot-auth/src/plugin.js +274 -0
  162. package/dist/packages/bunshot-auth/src/routes/auth.d.ts +15 -0
  163. package/dist/packages/bunshot-auth/src/routes/auth.js +1624 -0
  164. package/dist/packages/bunshot-auth/src/routes/groups.d.ts +4 -0
  165. package/dist/packages/bunshot-auth/src/routes/groups.js +481 -0
  166. package/dist/packages/bunshot-auth/src/routes/m2m.d.ts +2 -0
  167. package/dist/packages/bunshot-auth/src/routes/m2m.js +145 -0
  168. package/dist/packages/bunshot-auth/src/routes/mfa.d.ts +6 -0
  169. package/dist/packages/bunshot-auth/src/routes/mfa.js +991 -0
  170. package/dist/packages/bunshot-auth/src/routes/oauth.d.ts +3 -0
  171. package/dist/packages/bunshot-auth/src/routes/oauth.js +1727 -0
  172. package/dist/packages/bunshot-auth/src/routes/oidc.d.ts +2 -0
  173. package/dist/packages/bunshot-auth/src/routes/oidc.js +84 -0
  174. package/dist/packages/bunshot-auth/src/routes/organizations.d.ts +3 -0
  175. package/dist/packages/bunshot-auth/src/routes/organizations.js +741 -0
  176. package/dist/packages/bunshot-auth/src/routes/passkey.d.ts +2 -0
  177. package/dist/packages/bunshot-auth/src/routes/passkey.js +199 -0
  178. package/dist/packages/bunshot-auth/src/routes/saml.d.ts +2 -0
  179. package/dist/packages/bunshot-auth/src/routes/saml.js +226 -0
  180. package/dist/packages/bunshot-auth/src/routes/scim.d.ts +3 -0
  181. package/dist/packages/bunshot-auth/src/routes/scim.js +588 -0
  182. package/dist/packages/bunshot-auth/src/runtime.d.ts +52 -0
  183. package/dist/packages/bunshot-auth/src/runtime.js +11 -0
  184. package/dist/{schemas → packages/bunshot-auth/src/schemas}/auth.d.ts +4 -5
  185. package/dist/packages/bunshot-auth/src/schemas/auth.js +24 -0
  186. package/dist/packages/bunshot-auth/src/schemas/error.d.ts +10 -0
  187. package/dist/packages/bunshot-auth/src/schemas/error.js +10 -0
  188. package/dist/packages/bunshot-auth/src/schemas/success.d.ts +10 -0
  189. package/dist/packages/bunshot-auth/src/schemas/success.js +10 -0
  190. package/dist/packages/bunshot-auth/src/services/auth.d.ts +39 -0
  191. package/dist/packages/bunshot-auth/src/services/auth.js +378 -0
  192. package/dist/{services → packages/bunshot-auth/src/services}/mfa.d.ts +41 -17
  193. package/dist/{services → packages/bunshot-auth/src/services}/mfa.js +259 -183
  194. package/dist/packages/bunshot-auth/src/testing.d.ts +31 -0
  195. package/dist/packages/bunshot-auth/src/testing.js +23 -0
  196. package/dist/packages/bunshot-auth/src/types/adapter.d.ts +1 -0
  197. package/dist/packages/bunshot-auth/src/types/adapter.js +1 -0
  198. package/dist/packages/bunshot-auth/src/types/config.d.ts +152 -0
  199. package/dist/packages/bunshot-auth/src/types/config.js +179 -0
  200. package/dist/{routes → packages/bunshot-auth/src/types}/groups.d.ts +2 -3
  201. package/dist/packages/bunshot-auth/src/types/groups.js +1 -0
  202. package/dist/packages/bunshot-auth/src/types/oauthCode.d.ts +6 -0
  203. package/dist/packages/bunshot-auth/src/types/oauthCode.js +1 -0
  204. package/dist/packages/bunshot-auth/src/types/oauthReauth.d.ts +13 -0
  205. package/dist/packages/bunshot-auth/src/types/oauthReauth.js +1 -0
  206. package/dist/packages/bunshot-auth/src/types/redis.d.ts +1 -0
  207. package/dist/packages/bunshot-auth/src/types/redis.js +1 -0
  208. package/dist/packages/bunshot-auth/src/types/saml.d.ts +10 -0
  209. package/dist/packages/bunshot-auth/src/types/saml.js +1 -0
  210. package/dist/packages/bunshot-auth/src/types/session.d.ts +18 -0
  211. package/dist/packages/bunshot-auth/src/types/session.js +1 -0
  212. package/dist/packages/bunshot-auth/src/types/store.d.ts +1 -0
  213. package/dist/packages/bunshot-auth/src/types/store.js +1 -0
  214. package/dist/packages/bunshot-core/src/adminProvider.d.ts +95 -0
  215. package/dist/packages/bunshot-core/src/adminProvider.js +1 -0
  216. package/dist/packages/bunshot-core/src/auditLog.d.ts +34 -0
  217. package/dist/packages/bunshot-core/src/auditLog.js +1 -0
  218. package/dist/packages/bunshot-core/src/auth-adapter.d.ts +227 -0
  219. package/dist/packages/bunshot-core/src/auth-adapter.js +4 -0
  220. package/dist/packages/bunshot-core/src/authVariables.d.ts +14 -0
  221. package/dist/packages/bunshot-core/src/authVariables.js +4 -0
  222. package/dist/packages/bunshot-core/src/cache.d.ts +12 -0
  223. package/dist/packages/bunshot-core/src/cache.js +21 -0
  224. package/dist/packages/bunshot-core/src/captcha.d.ts +16 -0
  225. package/dist/packages/bunshot-core/src/captcha.js +1 -0
  226. package/dist/packages/bunshot-core/src/clearRegistry.d.ts +6 -0
  227. package/dist/packages/bunshot-core/src/clearRegistry.js +17 -0
  228. package/dist/packages/bunshot-core/src/clientIp.d.ts +3 -0
  229. package/dist/packages/bunshot-core/src/clientIp.js +45 -0
  230. package/dist/packages/bunshot-core/src/configLock.d.ts +4 -0
  231. package/dist/packages/bunshot-core/src/configLock.js +7 -0
  232. package/dist/packages/bunshot-core/src/configValidation.d.ts +22 -0
  233. package/dist/packages/bunshot-core/src/configValidation.js +39 -0
  234. package/dist/packages/bunshot-core/src/constants.js +10 -0
  235. package/dist/packages/bunshot-core/src/context/bunshotContext.d.ts +232 -0
  236. package/dist/packages/bunshot-core/src/context/bunshotContext.js +1 -0
  237. package/dist/packages/bunshot-core/src/context/contextAccess.d.ts +3 -0
  238. package/dist/packages/bunshot-core/src/context/contextAccess.js +16 -0
  239. package/dist/packages/bunshot-core/src/context/contextStore.d.ts +16 -0
  240. package/dist/packages/bunshot-core/src/context/contextStore.js +31 -0
  241. package/dist/packages/bunshot-core/src/context/frameworkConfig.d.ts +38 -0
  242. package/dist/packages/bunshot-core/src/context/frameworkConfig.js +1 -0
  243. package/dist/packages/bunshot-core/src/context/index.d.ts +4 -0
  244. package/dist/packages/bunshot-core/src/context/index.js +2 -0
  245. package/dist/packages/bunshot-core/src/context.d.ts +40 -0
  246. package/dist/packages/bunshot-core/src/context.js +35 -0
  247. package/dist/packages/bunshot-core/src/coreContracts.d.ts +47 -0
  248. package/dist/packages/bunshot-core/src/coreContracts.js +1 -0
  249. package/dist/packages/bunshot-core/src/coreRegistrar.d.ts +6 -0
  250. package/dist/packages/bunshot-core/src/coreRegistrar.js +42 -0
  251. package/dist/{lib → packages/bunshot-core/src}/createRoute.d.ts +4 -30
  252. package/dist/{lib → packages/bunshot-core/src}/createRoute.js +39 -88
  253. package/dist/packages/bunshot-core/src/cronRegistry.d.ts +11 -0
  254. package/dist/packages/bunshot-core/src/cronRegistry.js +1 -0
  255. package/dist/packages/bunshot-core/src/crypto.d.ts +43 -0
  256. package/dist/packages/bunshot-core/src/crypto.js +74 -0
  257. package/dist/packages/bunshot-core/src/csrf.d.ts +8 -0
  258. package/dist/packages/bunshot-core/src/csrf.js +1 -0
  259. package/dist/packages/bunshot-core/src/defaults/defaultFingerprint.d.ts +7 -0
  260. package/dist/packages/bunshot-core/src/defaults/defaultFingerprint.js +19 -0
  261. package/dist/packages/bunshot-core/src/defaults/memoryCacheAdapter.d.ts +6 -0
  262. package/dist/packages/bunshot-core/src/defaults/memoryCacheAdapter.js +40 -0
  263. package/dist/packages/bunshot-core/src/defaults/memoryRateLimit.d.ts +6 -0
  264. package/dist/packages/bunshot-core/src/defaults/memoryRateLimit.js +24 -0
  265. package/dist/packages/bunshot-core/src/emailTemplates.d.ts +5 -0
  266. package/dist/packages/bunshot-core/src/emailTemplates.js +10 -0
  267. package/dist/packages/bunshot-core/src/errors.d.ts +13 -0
  268. package/dist/packages/bunshot-core/src/errors.js +22 -0
  269. package/dist/packages/bunshot-core/src/eventBus.d.ts +270 -0
  270. package/dist/packages/bunshot-core/src/eventBus.js +143 -0
  271. package/dist/packages/bunshot-core/src/idempotency.d.ts +18 -0
  272. package/dist/packages/bunshot-core/src/idempotency.js +1 -0
  273. package/dist/packages/bunshot-core/src/index.d.ts +60 -0
  274. package/dist/packages/bunshot-core/src/index.js +34 -0
  275. package/dist/packages/bunshot-core/src/mail.d.ts +14 -0
  276. package/dist/packages/bunshot-core/src/mail.js +8 -0
  277. package/dist/packages/bunshot-core/src/memoryEviction.d.ts +24 -0
  278. package/dist/packages/bunshot-core/src/memoryEviction.js +52 -0
  279. package/dist/packages/bunshot-core/src/pagination.d.ts +45 -0
  280. package/dist/packages/bunshot-core/src/pagination.js +61 -0
  281. package/dist/packages/bunshot-core/src/permissions.d.ts +64 -0
  282. package/dist/packages/bunshot-core/src/permissions.js +27 -0
  283. package/dist/packages/bunshot-core/src/plugin.d.ts +44 -0
  284. package/dist/packages/bunshot-core/src/plugin.js +1 -0
  285. package/dist/packages/bunshot-core/src/rateLimit.d.ts +5 -0
  286. package/dist/packages/bunshot-core/src/rateLimit.js +18 -0
  287. package/dist/packages/bunshot-core/src/redis.d.ts +21 -0
  288. package/dist/packages/bunshot-core/src/redis.js +1 -0
  289. package/dist/packages/bunshot-core/src/routeAuth.d.ts +5 -0
  290. package/dist/packages/bunshot-core/src/routeAuth.js +11 -0
  291. package/dist/packages/bunshot-core/src/routeOverrides.d.ts +24 -0
  292. package/dist/packages/bunshot-core/src/routeOverrides.js +25 -0
  293. package/dist/packages/bunshot-core/src/routerAdapter.d.ts +6 -0
  294. package/dist/packages/bunshot-core/src/routerAdapter.js +56 -0
  295. package/dist/packages/bunshot-core/src/secrets.d.ts +48 -0
  296. package/dist/packages/bunshot-core/src/secrets.js +8 -0
  297. package/dist/packages/bunshot-core/src/signing.d.ts +41 -0
  298. package/dist/packages/bunshot-core/src/signing.js +1 -0
  299. package/dist/packages/bunshot-core/src/sse.d.ts +36 -0
  300. package/dist/packages/bunshot-core/src/sse.js +1 -0
  301. package/dist/packages/bunshot-core/src/storageAdapter.js +1 -0
  302. package/dist/packages/bunshot-core/src/storeInfra.d.ts +44 -0
  303. package/dist/packages/bunshot-core/src/storeInfra.js +18 -0
  304. package/dist/packages/bunshot-core/src/storeType.d.ts +7 -0
  305. package/dist/packages/bunshot-core/src/storeType.js +1 -0
  306. package/dist/packages/bunshot-core/src/testing.d.ts +1 -0
  307. package/dist/packages/bunshot-core/src/testing.js +1 -0
  308. package/dist/packages/bunshot-core/src/uploadRegistry.d.ts +23 -0
  309. package/dist/packages/bunshot-core/src/uploadRegistry.js +4 -0
  310. package/dist/packages/bunshot-core/src/userResolver.d.ts +5 -0
  311. package/dist/packages/bunshot-core/src/userResolver.js +14 -0
  312. package/dist/packages/bunshot-core/src/wsMessages.d.ts +42 -0
  313. package/dist/packages/bunshot-core/src/wsMessages.js +4 -0
  314. package/dist/packages/bunshot-permissions/src/adapters/memory.d.ts +7 -0
  315. package/dist/packages/bunshot-permissions/src/adapters/memory.js +73 -0
  316. package/dist/packages/bunshot-permissions/src/index.d.ts +10 -0
  317. package/dist/packages/bunshot-permissions/src/index.js +5 -0
  318. package/dist/packages/bunshot-permissions/src/lib/bootstrap.d.ts +7 -0
  319. package/dist/packages/bunshot-permissions/src/lib/bootstrap.js +12 -0
  320. package/dist/packages/bunshot-permissions/src/lib/evaluator.d.ts +10 -0
  321. package/dist/packages/bunshot-permissions/src/lib/evaluator.js +165 -0
  322. package/dist/packages/bunshot-permissions/src/lib/registry.d.ts +2 -0
  323. package/dist/packages/bunshot-permissions/src/lib/registry.js +31 -0
  324. package/dist/packages/bunshot-permissions/src/lib/validation.d.ts +1 -0
  325. package/dist/packages/bunshot-permissions/src/lib/validation.js +1 -0
  326. package/dist/packages/bunshot-permissions/src/types/adapter.d.ts +1 -0
  327. package/dist/packages/bunshot-permissions/src/types/adapter.js +1 -0
  328. package/dist/packages/bunshot-permissions/src/types/evaluator.d.ts +1 -0
  329. package/dist/packages/bunshot-permissions/src/types/evaluator.js +1 -0
  330. package/dist/packages/bunshot-permissions/src/types/models.d.ts +1 -0
  331. package/dist/packages/bunshot-permissions/src/types/models.js +1 -0
  332. package/dist/packages/bunshot-permissions/src/types/registry.d.ts +1 -0
  333. package/dist/packages/bunshot-permissions/src/types/registry.js +1 -0
  334. package/dist/packages/bunshot-postgres/src/adapter.d.ts +6 -0
  335. package/dist/packages/bunshot-postgres/src/adapter.js +794 -0
  336. package/dist/packages/bunshot-postgres/src/connection.d.ts +15 -0
  337. package/dist/packages/bunshot-postgres/src/connection.js +16 -0
  338. package/dist/packages/bunshot-postgres/src/index.d.ts +4 -0
  339. package/dist/packages/bunshot-postgres/src/index.js +2 -0
  340. package/dist/packages/bunshot-postgres/src/schema.d.ts +997 -0
  341. package/dist/packages/bunshot-postgres/src/schema.js +105 -0
  342. package/dist/src/app.d.ts +230 -0
  343. package/dist/src/app.js +182 -0
  344. package/dist/src/cli/commands/init.d.ts +10 -0
  345. package/dist/src/cli/commands/init.js +709 -0
  346. package/dist/src/cli/index.d.ts +1 -0
  347. package/dist/src/cli/index.js +3 -0
  348. package/dist/src/entrypoints/mongo.d.ts +6 -0
  349. package/dist/src/entrypoints/mongo.js +4 -0
  350. package/dist/src/entrypoints/queue.d.ts +2 -0
  351. package/dist/src/entrypoints/queue.js +1 -0
  352. package/dist/src/entrypoints/redis.d.ts +1 -0
  353. package/dist/src/entrypoints/redis.js +1 -0
  354. package/dist/{adapters → src/framework/adapters}/localStorage.d.ts +1 -1
  355. package/dist/{adapters → src/framework/adapters}/localStorage.js +23 -8
  356. package/dist/src/framework/adapters/memoryStorage.d.ts +2 -0
  357. package/dist/src/framework/adapters/memoryStorage.js +45 -0
  358. package/dist/{adapters → src/framework/adapters}/s3Storage.d.ts +1 -1
  359. package/dist/{adapters → src/framework/adapters}/s3Storage.js +12 -12
  360. package/dist/src/framework/admin/bunshotAccess.d.ts +2 -0
  361. package/dist/src/framework/admin/bunshotAccess.js +23 -0
  362. package/dist/src/framework/admin/bunshotUsers.d.ts +2 -0
  363. package/dist/src/framework/admin/bunshotUsers.js +103 -0
  364. package/dist/src/framework/admin/index.d.ts +7 -0
  365. package/dist/src/framework/admin/index.js +21 -0
  366. package/dist/src/framework/boundaryAdapters/cacheFactories.d.ts +13 -0
  367. package/dist/src/framework/boundaryAdapters/cacheFactories.js +86 -0
  368. package/dist/src/framework/boundaryAdapters/index.d.ts +2 -0
  369. package/dist/src/framework/boundaryAdapters/index.js +1 -0
  370. package/dist/src/framework/boundaryAdapters.d.ts +17 -0
  371. package/dist/src/framework/boundaryAdapters.js +62 -0
  372. package/dist/src/framework/buildContext.d.ts +33 -0
  373. package/dist/src/framework/buildContext.js +119 -0
  374. package/dist/src/framework/config/schema.d.ts +447 -0
  375. package/dist/src/framework/config/schema.js +528 -0
  376. package/dist/src/framework/createInfrastructure.d.ts +76 -0
  377. package/dist/src/framework/createInfrastructure.js +221 -0
  378. package/dist/src/framework/lib/auditLog.d.ts +23 -0
  379. package/dist/src/framework/lib/auditLog.js +416 -0
  380. package/dist/src/framework/lib/captcha.d.ts +11 -0
  381. package/dist/src/framework/lib/captcha.js +40 -0
  382. package/dist/{lib → src/framework/lib}/createDtoMapper.js +4 -4
  383. package/dist/src/framework/lib/createRoute.d.ts +1 -0
  384. package/dist/src/framework/lib/createRoute.js +2 -0
  385. package/dist/{lib → src/framework/lib}/idempotency.d.ts +2 -6
  386. package/dist/src/framework/lib/idempotency.js +74 -0
  387. package/dist/src/framework/lib/logger.d.ts +3 -0
  388. package/dist/src/framework/lib/logger.js +14 -0
  389. package/dist/src/framework/lib/metrics.d.ts +34 -0
  390. package/dist/{lib → src/framework/lib}/metrics.js +49 -57
  391. package/dist/src/framework/lib/pagination.d.ts +42 -0
  392. package/dist/src/framework/lib/pagination.js +51 -0
  393. package/dist/src/framework/lib/redisTransport.d.ts +38 -0
  394. package/dist/src/framework/lib/redisTransport.js +107 -0
  395. package/dist/src/framework/lib/resolveUserId.d.ts +2 -0
  396. package/dist/src/framework/lib/resolveUserId.js +5 -0
  397. package/dist/src/framework/lib/sseCollision.d.ts +6 -0
  398. package/dist/src/framework/lib/sseCollision.js +26 -0
  399. package/dist/src/framework/lib/storageAdapter.d.ts +1 -0
  400. package/dist/src/framework/lib/storageAdapter.js +1 -0
  401. package/dist/{lib → src/framework/lib}/stripUnreferencedSchemas.js +4 -4
  402. package/dist/src/framework/lib/tenant.d.ts +21 -0
  403. package/dist/src/framework/lib/tenant.js +70 -0
  404. package/dist/{lib → src/framework/lib}/upload.d.ts +14 -9
  405. package/dist/src/framework/lib/upload.js +132 -0
  406. package/dist/src/framework/lib/uploadRegistry.d.ts +23 -0
  407. package/dist/src/framework/lib/uploadRegistry.js +34 -0
  408. package/dist/{lib → src/framework/lib}/validate.d.ts +1 -1
  409. package/dist/{lib → src/framework/lib}/validate.js +2 -2
  410. package/dist/src/framework/lib/ws.d.ts +19 -0
  411. package/dist/src/framework/lib/ws.js +130 -0
  412. package/dist/src/framework/lib/wsHeartbeat.d.ts +12 -0
  413. package/dist/src/framework/lib/wsHeartbeat.js +53 -0
  414. package/dist/src/framework/lib/wsMessages.d.ts +25 -0
  415. package/dist/src/framework/lib/wsMessages.js +45 -0
  416. package/dist/src/framework/lib/wsNamespace.d.ts +17 -0
  417. package/dist/src/framework/lib/wsNamespace.js +19 -0
  418. package/dist/src/framework/lib/wsPresence.d.ts +17 -0
  419. package/dist/src/framework/lib/wsPresence.js +84 -0
  420. package/dist/src/framework/lib/wsTransport.d.ts +38 -0
  421. package/dist/src/framework/lib/wsTransport.js +9 -0
  422. package/dist/{lib → src/framework/lib}/zodToMongoose.d.ts +1 -1
  423. package/dist/{lib → src/framework/lib}/zodToMongoose.js +11 -11
  424. package/dist/{middleware → src/framework/middleware}/auditLog.d.ts +4 -3
  425. package/dist/src/framework/middleware/auditLog.js +42 -0
  426. package/dist/{middleware → src/framework/middleware}/botProtection.d.ts +2 -2
  427. package/dist/{middleware → src/framework/middleware}/botProtection.js +8 -9
  428. package/dist/src/framework/middleware/cacheResponse.d.ts +35 -0
  429. package/dist/src/framework/middleware/cacheResponse.js +126 -0
  430. package/dist/src/framework/middleware/captcha.d.ts +9 -0
  431. package/dist/src/framework/middleware/captcha.js +37 -0
  432. package/dist/{middleware → src/framework/middleware}/errorHandler.d.ts +1 -1
  433. package/dist/src/framework/middleware/errorHandler.js +16 -0
  434. package/dist/src/framework/middleware/index.js +1 -0
  435. package/dist/{middleware → src/framework/middleware}/logger.d.ts +1 -1
  436. package/dist/src/framework/middleware/metrics.d.ts +12 -0
  437. package/dist/src/framework/middleware/metrics.js +26 -0
  438. package/dist/{middleware → src/framework/middleware}/rateLimit.d.ts +2 -2
  439. package/dist/src/framework/middleware/rateLimit.js +22 -0
  440. package/dist/src/framework/middleware/requestId.d.ts +3 -0
  441. package/dist/{middleware → src/framework/middleware}/requestId.js +2 -2
  442. package/dist/{middleware → src/framework/middleware}/requestLogger.d.ts +3 -3
  443. package/dist/{middleware → src/framework/middleware}/requestLogger.js +17 -12
  444. package/dist/{middleware → src/framework/middleware}/requestSigning.d.ts +2 -2
  445. package/dist/{middleware → src/framework/middleware}/requestSigning.js +18 -19
  446. package/dist/src/framework/middleware/tenant.d.ts +14 -0
  447. package/dist/{middleware → src/framework/middleware}/tenant.js +31 -27
  448. package/dist/src/framework/middleware/upload.d.ts +5 -0
  449. package/dist/{middleware → src/framework/middleware}/upload.js +4 -4
  450. package/dist/{middleware → src/framework/middleware}/webhookAuth.d.ts +3 -3
  451. package/dist/{middleware → src/framework/middleware}/webhookAuth.js +11 -11
  452. package/dist/src/framework/models/AuditLog.d.ts +21 -0
  453. package/dist/src/framework/models/AuditLog.js +31 -0
  454. package/dist/src/framework/mountMiddleware.d.ts +91 -0
  455. package/dist/src/framework/mountMiddleware.js +128 -0
  456. package/dist/src/framework/mountOptionalEndpoints.d.ts +103 -0
  457. package/dist/src/framework/mountOptionalEndpoints.js +47 -0
  458. package/dist/src/framework/mountRoutes.d.ts +21 -0
  459. package/dist/src/framework/mountRoutes.js +144 -0
  460. package/dist/src/framework/persistence/cronRegistry.d.ts +28 -0
  461. package/dist/src/framework/persistence/cronRegistry.js +139 -0
  462. package/dist/src/framework/persistence/idempotency.d.ts +26 -0
  463. package/dist/src/framework/persistence/idempotency.js +178 -0
  464. package/dist/src/framework/persistence/index.d.ts +6 -0
  465. package/dist/src/framework/persistence/index.js +8 -0
  466. package/dist/src/framework/persistence/storeInfra.d.ts +9 -0
  467. package/dist/src/framework/persistence/storeInfra.js +1 -0
  468. package/dist/src/framework/persistence/uploadRegistry.d.ts +35 -0
  469. package/dist/src/framework/persistence/uploadRegistry.js +235 -0
  470. package/dist/src/framework/persistence/wsMessages.d.ts +22 -0
  471. package/dist/src/framework/persistence/wsMessages.js +296 -0
  472. package/dist/src/framework/preloadSchemas.d.ts +24 -0
  473. package/dist/src/framework/preloadSchemas.js +42 -0
  474. package/dist/src/framework/registerBoundaryAdapters.d.ts +23 -0
  475. package/dist/src/framework/registerBoundaryAdapters.js +46 -0
  476. package/dist/src/framework/routes/admin.d.ts +9 -0
  477. package/dist/src/framework/routes/admin.js +361 -0
  478. package/dist/src/framework/routes/health.d.ts +1 -0
  479. package/dist/src/framework/routes/health.js +21 -0
  480. package/dist/src/framework/routes/home.d.ts +1 -0
  481. package/dist/src/framework/routes/home.js +18 -0
  482. package/dist/src/framework/routes/jobs.d.ts +3 -0
  483. package/dist/src/framework/routes/jobs.js +315 -0
  484. package/dist/src/framework/routes/metrics.d.ts +10 -0
  485. package/dist/src/framework/routes/metrics.js +57 -0
  486. package/dist/src/framework/routes/uploads.d.ts +14 -0
  487. package/dist/src/framework/routes/uploads.js +262 -0
  488. package/dist/src/framework/runPluginLifecycle.d.ts +27 -0
  489. package/dist/src/framework/runPluginLifecycle.js +121 -0
  490. package/dist/src/framework/secrets/frameworkSecretSchema.d.ts +58 -0
  491. package/dist/src/framework/secrets/frameworkSecretSchema.js +20 -0
  492. package/dist/src/framework/secrets/index.d.ts +9 -0
  493. package/dist/src/framework/secrets/index.js +7 -0
  494. package/dist/src/framework/secrets/providers/envProvider.d.ts +15 -0
  495. package/dist/src/framework/secrets/providers/envProvider.js +18 -0
  496. package/dist/src/framework/secrets/providers/fileProvider.d.ts +8 -0
  497. package/dist/src/framework/secrets/providers/fileProvider.js +82 -0
  498. package/dist/src/framework/secrets/providers/ssmProvider.d.ts +20 -0
  499. package/dist/src/framework/secrets/providers/ssmProvider.js +127 -0
  500. package/dist/src/framework/secrets/resolveSecretBundle.d.ts +53 -0
  501. package/dist/src/framework/secrets/resolveSecretBundle.js +84 -0
  502. package/dist/src/framework/secrets/resolveSecrets.d.ts +18 -0
  503. package/dist/src/framework/secrets/resolveSecrets.js +34 -0
  504. package/dist/src/framework/sse/index.d.ts +21 -0
  505. package/dist/src/framework/sse/index.js +109 -0
  506. package/dist/src/framework/ws/index.d.ts +11 -0
  507. package/dist/src/framework/ws/index.js +8 -0
  508. package/dist/src/index.d.ts +87 -0
  509. package/dist/src/index.js +58 -0
  510. package/dist/src/lib/appConfig.d.ts +7 -0
  511. package/dist/src/lib/appConfig.js +27 -0
  512. package/dist/src/lib/appMeta.d.ts +7 -0
  513. package/dist/src/lib/appMeta.js +3 -0
  514. package/dist/src/lib/authConfig.d.ts +532 -0
  515. package/dist/src/lib/authConfig.js +179 -0
  516. package/dist/{lib → src/lib}/context.d.ts +6 -7
  517. package/dist/{lib → src/lib}/context.js +5 -5
  518. package/dist/src/lib/logger.d.ts +1 -0
  519. package/dist/src/lib/logger.js +1 -0
  520. package/dist/src/lib/mongo.d.ts +58 -0
  521. package/dist/src/lib/mongo.js +96 -0
  522. package/dist/src/lib/queue.d.ts +72 -0
  523. package/dist/src/lib/queue.js +152 -0
  524. package/dist/src/lib/redis.d.ts +28 -0
  525. package/dist/src/lib/redis.js +72 -0
  526. package/dist/{lib → src/lib}/signing.d.ts +2 -2
  527. package/dist/src/lib/signing.js +210 -0
  528. package/dist/src/lib/signingConfig.d.ts +40 -0
  529. package/dist/src/lib/signingConfig.js +28 -0
  530. package/dist/src/server.d.ts +146 -0
  531. package/dist/src/server.js +469 -0
  532. package/dist/src/shared/lib/HttpError.d.ts +1 -0
  533. package/dist/src/shared/lib/HttpError.js +2 -0
  534. package/dist/src/shared/lib/constants.d.ts +10 -0
  535. package/dist/src/shared/lib/crypto.d.ts +43 -0
  536. package/dist/src/shared/lib/crypto.js +74 -0
  537. package/dist/src/shared/lib/signing.d.ts +52 -0
  538. package/dist/{lib → src/shared/lib}/signing.js +40 -10
  539. package/dist/src/testing.d.ts +34 -0
  540. package/dist/src/testing.js +93 -0
  541. package/package.json +62 -25
  542. package/dist/adapters/memoryAuth.d.ts +0 -46
  543. package/dist/adapters/memoryAuth.js +0 -634
  544. package/dist/adapters/memoryStorage.d.ts +0 -3
  545. package/dist/adapters/memoryStorage.js +0 -44
  546. package/dist/adapters/mongoAuth.d.ts +0 -2
  547. package/dist/adapters/mongoAuth.js +0 -307
  548. package/dist/adapters/sqliteAuth.d.ts +0 -49
  549. package/dist/adapters/sqliteAuth.js +0 -707
  550. package/dist/app.d.ts +0 -456
  551. package/dist/app.js +0 -548
  552. package/dist/entrypoints/mongo.d.ts +0 -5
  553. package/dist/entrypoints/mongo.js +0 -4
  554. package/dist/entrypoints/queue.d.ts +0 -2
  555. package/dist/entrypoints/queue.js +0 -1
  556. package/dist/entrypoints/redis.d.ts +0 -1
  557. package/dist/entrypoints/redis.js +0 -1
  558. package/dist/index.d.ts +0 -98
  559. package/dist/index.js +0 -77
  560. package/dist/lib/HttpError.d.ts +0 -9
  561. package/dist/lib/HttpError.js +0 -14
  562. package/dist/lib/appConfig.d.ts +0 -162
  563. package/dist/lib/appConfig.js +0 -83
  564. package/dist/lib/auditLog.d.ts +0 -52
  565. package/dist/lib/auditLog.js +0 -201
  566. package/dist/lib/authAdapter.d.ts +0 -176
  567. package/dist/lib/authAdapter.js +0 -7
  568. package/dist/lib/authRateLimit.d.ts +0 -13
  569. package/dist/lib/authRateLimit.js +0 -81
  570. package/dist/lib/clientIp.d.ts +0 -14
  571. package/dist/lib/crypto.d.ts +0 -11
  572. package/dist/lib/crypto.js +0 -22
  573. package/dist/lib/deletionCancelToken.d.ts +0 -12
  574. package/dist/lib/deletionCancelToken.js +0 -88
  575. package/dist/lib/emailVerification.d.ts +0 -13
  576. package/dist/lib/emailVerification.js +0 -86
  577. package/dist/lib/fingerprint.js +0 -36
  578. package/dist/lib/idempotency.js +0 -182
  579. package/dist/lib/jwt.d.ts +0 -2
  580. package/dist/lib/jwt.js +0 -24
  581. package/dist/lib/logger.d.ts +0 -1
  582. package/dist/lib/logger.js +0 -7
  583. package/dist/lib/metrics.d.ts +0 -14
  584. package/dist/lib/mfaChallenge.d.ts +0 -42
  585. package/dist/lib/mfaChallenge.js +0 -293
  586. package/dist/lib/mongo.d.ts +0 -39
  587. package/dist/lib/mongo.js +0 -124
  588. package/dist/lib/oauth.d.ts +0 -40
  589. package/dist/lib/oauth.js +0 -101
  590. package/dist/lib/oauthCode.d.ts +0 -15
  591. package/dist/lib/oauthCode.js +0 -90
  592. package/dist/lib/pagination.d.ts +0 -119
  593. package/dist/lib/pagination.js +0 -166
  594. package/dist/lib/queue.d.ts +0 -37
  595. package/dist/lib/queue.js +0 -117
  596. package/dist/lib/redis.d.ts +0 -9
  597. package/dist/lib/redis.js +0 -61
  598. package/dist/lib/resetPassword.d.ts +0 -12
  599. package/dist/lib/resetPassword.js +0 -91
  600. package/dist/lib/roles.d.ts +0 -7
  601. package/dist/lib/roles.js +0 -49
  602. package/dist/lib/session.d.ts +0 -39
  603. package/dist/lib/session.js +0 -535
  604. package/dist/lib/tenant.d.ts +0 -15
  605. package/dist/lib/tenant.js +0 -65
  606. package/dist/lib/upload.js +0 -87
  607. package/dist/lib/ws.d.ts +0 -22
  608. package/dist/lib/ws.js +0 -89
  609. package/dist/lib/wsHeartbeat.d.ts +0 -12
  610. package/dist/lib/wsHeartbeat.js +0 -57
  611. package/dist/lib/wsMessages.d.ts +0 -40
  612. package/dist/lib/wsMessages.js +0 -330
  613. package/dist/lib/wsPresence.d.ts +0 -25
  614. package/dist/lib/wsPresence.js +0 -99
  615. package/dist/middleware/auditLog.js +0 -39
  616. package/dist/middleware/bearerAuth.d.ts +0 -2
  617. package/dist/middleware/bearerAuth.js +0 -11
  618. package/dist/middleware/cacheResponse.d.ts +0 -15
  619. package/dist/middleware/cacheResponse.js +0 -178
  620. package/dist/middleware/csrf.js +0 -125
  621. package/dist/middleware/errorHandler.js +0 -13
  622. package/dist/middleware/identify.d.ts +0 -3
  623. package/dist/middleware/identify.js +0 -95
  624. package/dist/middleware/index.js +0 -1
  625. package/dist/middleware/metrics.d.ts +0 -9
  626. package/dist/middleware/metrics.js +0 -26
  627. package/dist/middleware/rateLimit.js +0 -22
  628. package/dist/middleware/requestId.d.ts +0 -3
  629. package/dist/middleware/tenant.d.ts +0 -5
  630. package/dist/middleware/upload.d.ts +0 -5
  631. package/dist/middleware/userAuth.d.ts +0 -3
  632. package/dist/middleware/userAuth.js +0 -6
  633. package/dist/models/AuditLog.d.ts +0 -30
  634. package/dist/models/AuditLog.js +0 -39
  635. package/dist/models/AuthUser.js +0 -48
  636. package/dist/models/Group.d.ts +0 -21
  637. package/dist/models/Group.js +0 -28
  638. package/dist/models/GroupMembership.js +0 -25
  639. package/dist/models/TenantRole.d.ts +0 -15
  640. package/dist/models/TenantRole.js +0 -23
  641. package/dist/routes/auth.d.ts +0 -11
  642. package/dist/routes/auth.js +0 -605
  643. package/dist/routes/groups.js +0 -346
  644. package/dist/routes/health.d.ts +0 -1
  645. package/dist/routes/health.js +0 -22
  646. package/dist/routes/home.d.ts +0 -1
  647. package/dist/routes/home.js +0 -16
  648. package/dist/routes/jobs.d.ts +0 -2
  649. package/dist/routes/jobs.js +0 -272
  650. package/dist/routes/metrics.d.ts +0 -7
  651. package/dist/routes/metrics.js +0 -52
  652. package/dist/routes/mfa.d.ts +0 -5
  653. package/dist/routes/mfa.js +0 -620
  654. package/dist/routes/oauth.d.ts +0 -2
  655. package/dist/routes/oauth.js +0 -514
  656. package/dist/routes/uploads.d.ts +0 -2
  657. package/dist/routes/uploads.js +0 -135
  658. package/dist/schemas/auth.js +0 -30
  659. package/dist/server.d.ts +0 -57
  660. package/dist/server.js +0 -112
  661. package/dist/services/auth.d.ts +0 -27
  662. package/dist/services/auth.js +0 -159
  663. package/dist/ws/index.d.ts +0 -10
  664. package/dist/ws/index.js +0 -38
  665. package/docs/sections/adding-middleware/full.md +0 -35
  666. package/docs/sections/adding-models/full.md +0 -125
  667. package/docs/sections/adding-models/overview.md +0 -13
  668. package/docs/sections/adding-routes/full.md +0 -182
  669. package/docs/sections/adding-routes/overview.md +0 -23
  670. package/docs/sections/auth-flow/full.md +0 -779
  671. package/docs/sections/auth-flow/overview.md +0 -10
  672. package/docs/sections/auth-security-examples/full.md +0 -365
  673. package/docs/sections/authentication/full.md +0 -130
  674. package/docs/sections/authentication/overview.md +0 -5
  675. package/docs/sections/cli/full.md +0 -42
  676. package/docs/sections/configuration/full.md +0 -172
  677. package/docs/sections/configuration/overview.md +0 -18
  678. package/docs/sections/configuration-example/full.md +0 -117
  679. package/docs/sections/configuration-example/overview.md +0 -30
  680. package/docs/sections/documentation/full.md +0 -171
  681. package/docs/sections/environment-variables/full.md +0 -55
  682. package/docs/sections/exports/full.md +0 -123
  683. package/docs/sections/extending-context/full.md +0 -59
  684. package/docs/sections/header.md +0 -3
  685. package/docs/sections/installation/full.md +0 -6
  686. package/docs/sections/jobs/full.md +0 -140
  687. package/docs/sections/jobs/overview.md +0 -15
  688. package/docs/sections/logging/full.md +0 -83
  689. package/docs/sections/metrics/full.md +0 -127
  690. package/docs/sections/mongodb-connections/full.md +0 -45
  691. package/docs/sections/mongodb-connections/overview.md +0 -7
  692. package/docs/sections/multi-tenancy/full.md +0 -66
  693. package/docs/sections/multi-tenancy/overview.md +0 -15
  694. package/docs/sections/oauth/full.md +0 -189
  695. package/docs/sections/oauth/overview.md +0 -16
  696. package/docs/sections/package-development/full.md +0 -7
  697. package/docs/sections/pagination/full.md +0 -93
  698. package/docs/sections/peer-dependencies/full.md +0 -47
  699. package/docs/sections/quick-start/full.md +0 -43
  700. package/docs/sections/response-caching/full.md +0 -117
  701. package/docs/sections/response-caching/overview.md +0 -13
  702. package/docs/sections/roles/full.md +0 -225
  703. package/docs/sections/roles/overview.md +0 -14
  704. package/docs/sections/running-without-redis/full.md +0 -16
  705. package/docs/sections/running-without-redis-or-mongodb/full.md +0 -60
  706. package/docs/sections/signing/full.md +0 -203
  707. package/docs/sections/stack/full.md +0 -10
  708. package/docs/sections/uploads/full.md +0 -199
  709. package/docs/sections/versioning/full.md +0 -85
  710. package/docs/sections/webhook-auth/full.md +0 -100
  711. package/docs/sections/websocket/full.md +0 -184
  712. package/docs/sections/websocket/overview.md +0 -5
  713. package/docs/sections/websocket-rooms/full.md +0 -102
  714. package/docs/sections/websocket-rooms/overview.md +0 -5
  715. /package/dist/{lib/storageAdapter.js → packages/bunshot-admin/src/types/env.js} +0 -0
  716. /package/dist/{lib → packages/bunshot-auth/src/lib}/fingerprint.d.ts +0 -0
  717. /package/dist/{lib → packages/bunshot-core/src}/constants.d.ts +0 -0
  718. /package/dist/{lib → packages/bunshot-core/src}/storageAdapter.d.ts +0 -0
  719. /package/dist/{lib → src/framework/lib}/createDtoMapper.d.ts +0 -0
  720. /package/dist/{lib → src/framework/lib}/stripUnreferencedSchemas.d.ts +0 -0
  721. /package/dist/{middleware → src/framework/middleware}/cors.d.ts +0 -0
  722. /package/dist/{middleware → src/framework/middleware}/cors.js +0 -0
  723. /package/dist/{middleware → src/framework/middleware}/index.d.ts +0 -0
  724. /package/dist/{middleware → src/framework/middleware}/logger.js +0 -0
  725. /package/dist/{lib → src/shared/lib}/constants.js +0 -0
@@ -0,0 +1,40 @@
1
+ const VERIFY_URLS = {
2
+ recaptcha: 'https://www.google.com/recaptcha/api/siteverify',
3
+ hcaptcha: 'https://hcaptcha.com/siteverify',
4
+ turnstile: 'https://challenges.cloudflare.com/turnstile/v0/siteverify',
5
+ };
6
+ /**
7
+ * Verify a CAPTCHA token with the provider's API.
8
+ * Returns { success: true } on pass, { success: false, error } on fail.
9
+ */
10
+ export async function verifyCaptcha(token, config, ip) {
11
+ const url = VERIFY_URLS[config.provider];
12
+ const body = new URLSearchParams({ secret: config.secretKey, response: token });
13
+ if (ip)
14
+ body.set('remoteip', ip);
15
+ let data;
16
+ try {
17
+ const res = await fetch(url, { method: 'POST', body });
18
+ if (!res.ok)
19
+ return { success: false, error: `Provider returned ${res.status}` };
20
+ data = (await res.json());
21
+ }
22
+ catch (err) {
23
+ return { success: false, error: 'CAPTCHA provider unreachable' };
24
+ }
25
+ if (!data.success) {
26
+ return {
27
+ success: false,
28
+ error: String(data['error-codes']?.[0] ?? 'invalid-token'),
29
+ };
30
+ }
31
+ // reCAPTCHA v3: check score
32
+ if (config.provider === 'recaptcha' && typeof data.score === 'number') {
33
+ const minScore = config.minScore ?? 0.5;
34
+ if (data.score < minScore) {
35
+ return { success: false, score: data.score, error: 'score-too-low' };
36
+ }
37
+ return { success: true, score: data.score };
38
+ }
39
+ return { success: true };
40
+ }
@@ -1,11 +1,11 @@
1
1
  /** Check if a Zod type is nullable or optional */
2
2
  function isNullable(zodType) {
3
3
  const defType = zodType?._zod?.def?.type;
4
- if (defType === "nullable")
4
+ if (defType === 'nullable')
5
5
  return true;
6
- if (defType === "optional")
6
+ if (defType === 'optional')
7
7
  return true;
8
- if (defType === "default")
8
+ if (defType === 'default')
9
9
  return isNullable(zodType._zod.def.innerType);
10
10
  return false;
11
11
  }
@@ -46,7 +46,7 @@ export function createDtoMapper(zodSchema, config = {}) {
46
46
  return (doc) => {
47
47
  const dto = {};
48
48
  for (const field of apiFields) {
49
- if (field === "id") {
49
+ if (field === 'id') {
50
50
  dto.id = doc._id.toString();
51
51
  continue;
52
52
  }
@@ -0,0 +1 @@
1
+ export { createRoute, withSecurity, registerSchema, registerSchemas, maybeAutoRegister, } from '../../../packages/bunshot-core/src/index.js';
@@ -0,0 +1,2 @@
1
+ // Re-export from core — all route utilities now live in @lastshotlabs/bunshot-core
2
+ export { createRoute, withSecurity, registerSchema, registerSchemas, maybeAutoRegister, } from '../../../packages/bunshot-core/src/index.js';
@@ -1,12 +1,9 @@
1
- import type { MiddlewareHandler } from "hono";
2
- import type { AppEnv } from "./context";
1
+ import type { MiddlewareHandler } from 'hono';
2
+ import type { AppEnv } from '../../../packages/bunshot-core/src/index.js';
3
3
  export interface IdempotencyOptions {
4
4
  /** TTL in seconds for cached responses. Default: 86400 (24 hours). */
5
5
  ttl?: number;
6
6
  }
7
- type IdempotencyStore = "redis" | "mongo" | "sqlite" | "memory";
8
- export declare const setIdempotencyStore: (store: IdempotencyStore) => void;
9
- export declare const clearIdempotencyMemoryStore: () => void;
10
7
  /**
11
8
  * Idempotency middleware. Reads the `Idempotency-Key` header and returns a
12
9
  * cached response if one exists for this user + key combination. Otherwise
@@ -19,4 +16,3 @@ export declare const clearIdempotencyMemoryStore: () => void;
19
16
  * prevent enumeration. When off, raw keys are stored (slight enumeration risk).
20
17
  */
21
18
  export declare const idempotent: (opts?: IdempotencyOptions) => MiddlewareHandler<AppEnv>;
22
- export {};
@@ -0,0 +1,74 @@
1
+ // ---------------------------------------------------------------------------
2
+ // Idempotency middleware — consumes repository from BunshotContext
3
+ // ---------------------------------------------------------------------------
4
+ import { hmacSign } from '../../lib/signing';
5
+ import { HEADER_IDEMPOTENCY_KEY } from '../../../packages/bunshot-core/src/index.js';
6
+ // ---------------------------------------------------------------------------
7
+ // Key derivation
8
+ // ---------------------------------------------------------------------------
9
+ function deriveKey(rawKey, userId, signing) {
10
+ const prefix = userId ?? 'anon';
11
+ if (signing?.config?.idempotencyKeys && signing.secret) {
12
+ return `${prefix}:${hmacSign(rawKey, signing.secret)}`;
13
+ }
14
+ return `${prefix}:${rawKey}`;
15
+ }
16
+ // ---------------------------------------------------------------------------
17
+ // Middleware factory
18
+ // ---------------------------------------------------------------------------
19
+ /**
20
+ * Idempotency middleware. Reads the `Idempotency-Key` header and returns a
21
+ * cached response if one exists for this user + key combination. Otherwise
22
+ * calls the next handler, stores the response, and returns it.
23
+ *
24
+ * On write collision (two concurrent identical requests), the second request
25
+ * re-reads and returns the first-stored result.
26
+ *
27
+ * When `signing.idempotencyKeys: true`, keys are HMAC'd before storage to
28
+ * prevent enumeration. When off, raw keys are stored (slight enumeration risk).
29
+ */
30
+ export const idempotent = (opts) => async (c, next) => {
31
+ const rawKey = c.req.header(HEADER_IDEMPOTENCY_KEY);
32
+ if (!rawKey) {
33
+ await next();
34
+ return;
35
+ }
36
+ const ctx = c.get('bunshotCtx');
37
+ const adapter = ctx?.persistence.idempotency;
38
+ if (!adapter) {
39
+ // No persistence configured — pass through
40
+ await next();
41
+ return;
42
+ }
43
+ const userId = c.get('authUserId') ?? null;
44
+ const signingConfig = ctx?.signing ?? null;
45
+ const signingSecret = signingConfig?.secret ?? null;
46
+ const key = deriveKey(rawKey, userId, { config: signingConfig, secret: signingSecret });
47
+ const ttl = opts?.ttl ?? 86400;
48
+ // Cache hit — return stored response
49
+ const cached = await adapter.get(key);
50
+ if (cached) {
51
+ return c.json(JSON.parse(cached.response), cached.status);
52
+ }
53
+ // Cache miss — call handler
54
+ await next();
55
+ // Capture the response body by reading it
56
+ const status = c.res.status;
57
+ let body = '';
58
+ try {
59
+ body = await c.res.clone().text();
60
+ }
61
+ catch {
62
+ // Non-text/non-json response — skip caching
63
+ return;
64
+ }
65
+ await adapter.set(key, body, status, ttl);
66
+ // Re-read to handle write collision (NX semantics — set() may have been a no-op)
67
+ const stored = await adapter.get(key);
68
+ if (stored && stored.response !== body) {
69
+ c.res = new Response(stored.response, {
70
+ status: stored.status,
71
+ headers: { 'content-type': 'application/json' },
72
+ });
73
+ }
74
+ };
@@ -0,0 +1,3 @@
1
+ export declare const log: (...args: unknown[]) => void;
2
+ /** Like log(), but also requires LOGGING_AUTH_TRACE=true. Use for lines that include user/session IDs. */
3
+ export declare const authTrace: (...args: unknown[]) => void;
@@ -0,0 +1,14 @@
1
+ function isVerbose() {
2
+ const v = process.env.LOGGING_VERBOSE;
3
+ return v !== undefined ? v === 'true' : process.env.NODE_ENV !== 'production';
4
+ }
5
+ export const log = (...args) => {
6
+ if (isVerbose())
7
+ console.log(...args);
8
+ };
9
+ const authTraceEnabled = process.env.LOGGING_AUTH_TRACE === 'true';
10
+ /** Like log(), but also requires LOGGING_AUTH_TRACE=true. Use for lines that include user/session IDs. */
11
+ export const authTrace = (...args) => {
12
+ if (authTraceEnabled)
13
+ log(...args);
14
+ };
@@ -0,0 +1,34 @@
1
+ type Labels = Record<string, string>;
2
+ interface CounterEntry {
3
+ labels: Labels;
4
+ value: number;
5
+ }
6
+ interface HistogramEntry {
7
+ labels: Labels;
8
+ buckets: number[];
9
+ sum: number;
10
+ count: number;
11
+ }
12
+ type GaugeCallback = () => Promise<{
13
+ labels: Labels;
14
+ value: number;
15
+ }[]>;
16
+ export interface MetricsState {
17
+ readonly counters: Map<string, Map<string, CounterEntry>>;
18
+ readonly histograms: Map<string, {
19
+ boundaries: number[];
20
+ entries: Map<string, HistogramEntry>;
21
+ }>;
22
+ readonly gaugeCallbacks: Map<string, GaugeCallback>;
23
+ queues: Map<string, any> | null;
24
+ }
25
+ export declare function createMetricsState(): MetricsState;
26
+ export declare function defaultNormalizePath(path: string): string;
27
+ export declare function incrementCounter(state: MetricsState, name: string, labels: Labels, amount?: number): void;
28
+ export declare function observeHistogram(state: MetricsState, name: string, labels: Labels, value: number, buckets?: number[]): void;
29
+ export declare function registerGaugeCallback(state: MetricsState, name: string, cb: GaugeCallback): void;
30
+ export declare function serializeMetrics(state: MetricsState): Promise<string>;
31
+ export declare function resetMetrics(state: MetricsState): void;
32
+ export declare function setMetricsQueues(state: MetricsState, map: Map<string, any>): void;
33
+ export declare function closeMetricsQueues(state: MetricsState): Promise<void>;
34
+ export {};
@@ -1,44 +1,49 @@
1
1
  // In-memory Prometheus-compatible metrics registry.
2
- // Bun is single-threaded so no atomics are needed.
3
- // ── Helpers ──────────────────────────────────────────────────────────────────
2
+ // Owned per app instance via MetricsState, not process-global.
3
+ export function createMetricsState() {
4
+ return {
5
+ counters: new Map(),
6
+ histograms: new Map(),
7
+ gaugeCallbacks: new Map(),
8
+ queues: null,
9
+ };
10
+ }
4
11
  function labelKey(labels) {
5
12
  return Object.entries(labels)
6
13
  .sort(([a], [b]) => a.localeCompare(b))
7
14
  .map(([k, v]) => `${k}="${v}"`)
8
- .join(",");
15
+ .join(',');
9
16
  }
10
17
  function formatLabels(labels) {
11
18
  const pairs = Object.entries(labels)
12
19
  .sort(([a], [b]) => a.localeCompare(b))
13
20
  .map(([k, v]) => `${k}="${v}"`);
14
- return pairs.length ? `{${pairs.join(",")}}` : "";
21
+ return pairs.length ? `{${pairs.join(',')}}` : '';
15
22
  }
16
- // ── Path normalization ───────────────────────────────────────────────────────
17
23
  const UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
18
24
  const OBJECTID_RE = /^[0-9a-f]{24}$/i;
19
25
  const NUMERIC_RE = /^\d+$/;
20
26
  export function defaultNormalizePath(path) {
21
27
  return path
22
- .split("/")
23
- .map((seg) => {
28
+ .split('/')
29
+ .map(seg => {
24
30
  if (!seg)
25
31
  return seg;
26
32
  if (UUID_RE.test(seg))
27
- return ":id";
33
+ return ':id';
28
34
  if (OBJECTID_RE.test(seg))
29
- return ":id";
35
+ return ':id';
30
36
  if (NUMERIC_RE.test(seg))
31
- return ":id";
37
+ return ':id';
32
38
  return seg;
33
39
  })
34
- .join("/");
40
+ .join('/');
35
41
  }
36
- const counters = new Map();
37
- export function incrementCounter(name, labels, amount = 1) {
38
- let metric = counters.get(name);
42
+ export function incrementCounter(state, name, labels, amount = 1) {
43
+ let metric = state.counters.get(name);
39
44
  if (!metric) {
40
45
  metric = new Map();
41
- counters.set(name, metric);
46
+ state.counters.set(name, metric);
42
47
  }
43
48
  const key = labelKey(labels);
44
49
  const existing = metric.get(key);
@@ -49,14 +54,12 @@ export function incrementCounter(name, labels, amount = 1) {
49
54
  metric.set(key, { labels: { ...labels }, value: amount });
50
55
  }
51
56
  }
52
- // ── Histogram ────────────────────────────────────────────────────────────────
53
57
  const DEFAULT_BUCKETS = [0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1, 2.5, 5, 10];
54
- const histograms = new Map();
55
- export function observeHistogram(name, labels, value, buckets = DEFAULT_BUCKETS) {
56
- let metric = histograms.get(name);
58
+ export function observeHistogram(state, name, labels, value, buckets = DEFAULT_BUCKETS) {
59
+ let metric = state.histograms.get(name);
57
60
  if (!metric) {
58
61
  metric = { boundaries: buckets, entries: new Map() };
59
- histograms.set(name, metric);
62
+ state.histograms.set(name, metric);
60
63
  }
61
64
  const key = labelKey(labels);
62
65
  let entry = metric.entries.get(key);
@@ -64,8 +67,6 @@ export function observeHistogram(name, labels, value, buckets = DEFAULT_BUCKETS)
64
67
  entry = { labels: { ...labels }, buckets: new Array(buckets.length).fill(0), sum: 0, count: 0 };
65
68
  metric.entries.set(key, entry);
66
69
  }
67
- // Find the first (tightest) bucket the value fits in.
68
- // Serialization will compute cumulative sums across buckets.
69
70
  for (let i = 0; i < metric.boundaries.length; i++) {
70
71
  if (value <= metric.boundaries[i]) {
71
72
  entry.buckets[i]++;
@@ -75,43 +76,37 @@ export function observeHistogram(name, labels, value, buckets = DEFAULT_BUCKETS)
75
76
  entry.sum += value;
76
77
  entry.count++;
77
78
  }
78
- const gaugeCallbacks = new Map();
79
- export function registerGaugeCallback(name, cb) {
80
- gaugeCallbacks.set(name, cb);
79
+ export function registerGaugeCallback(state, name, cb) {
80
+ state.gaugeCallbacks.set(name, cb);
81
81
  }
82
- // ── Serialize ────────────────────────────────────────────────────────────────
83
- export async function serializeMetrics() {
82
+ export async function serializeMetrics(state) {
84
83
  const lines = [];
85
- // Collect gauge callbacks first so any error-counter increments are
86
- // included when we serialize counters below.
87
84
  const gaugeLines = [];
88
- for (const [name, cb] of gaugeCallbacks) {
85
+ for (const [name, cb] of state.gaugeCallbacks) {
89
86
  try {
90
87
  const results = await cb();
91
- gaugeLines.push(`# HELP ${name} ${name.replace(/_/g, " ")}`);
88
+ gaugeLines.push(`# HELP ${name} ${name.replace(/_/g, ' ')}`);
92
89
  gaugeLines.push(`# TYPE ${name} gauge`);
93
90
  for (const { labels, value } of results) {
94
91
  gaugeLines.push(`${name}${formatLabels(labels)} ${value}`);
95
92
  }
96
- gaugeLines.push("");
93
+ gaugeLines.push('');
97
94
  }
98
95
  catch (err) {
99
96
  console.warn(`[metrics] Gauge callback "${name}" failed:`, err);
100
- incrementCounter("bunshot_gauge_errors_total", { gauge: name });
97
+ incrementCounter(state, 'bunshot_gauge_errors_total', { gauge: name });
101
98
  }
102
99
  }
103
- // Counters
104
- for (const [name, entries] of counters) {
105
- lines.push(`# HELP ${name} Total ${name.replace(/_/g, " ")}`);
100
+ for (const [name, entries] of state.counters) {
101
+ lines.push(`# HELP ${name} Total ${name.replace(/_/g, ' ')}`);
106
102
  lines.push(`# TYPE ${name} counter`);
107
103
  for (const entry of entries.values()) {
108
104
  lines.push(`${name}${formatLabels(entry.labels)} ${entry.value}`);
109
105
  }
110
- lines.push("");
106
+ lines.push('');
111
107
  }
112
- // Histograms
113
- for (const [name, metric] of histograms) {
114
- lines.push(`# HELP ${name} ${name.replace(/_/g, " ")}`);
108
+ for (const [name, metric] of state.histograms) {
109
+ lines.push(`# HELP ${name} ${name.replace(/_/g, ' ')}`);
115
110
  lines.push(`# TYPE ${name} histogram`);
116
111
  for (const entry of metric.entries.values()) {
117
112
  const lbls = formatLabels(entry.labels);
@@ -121,32 +116,28 @@ export async function serializeMetrics() {
121
116
  const bucketLabels = { ...entry.labels, le: String(metric.boundaries[i]) };
122
117
  lines.push(`${name}_bucket${formatLabels(bucketLabels)} ${cumulative}`);
123
118
  }
124
- const infLabels = { ...entry.labels, le: "+Inf" };
119
+ const infLabels = { ...entry.labels, le: '+Inf' };
125
120
  lines.push(`${name}_bucket${formatLabels(infLabels)} ${entry.count}`);
126
121
  lines.push(`${name}_sum${lbls} ${entry.sum}`);
127
122
  lines.push(`${name}_count${lbls} ${entry.count}`);
128
123
  }
129
- lines.push("");
124
+ lines.push('');
130
125
  }
131
- // Gauges (already collected above)
132
126
  lines.push(...gaugeLines);
133
- return lines.join("\n");
127
+ return lines.join('\n');
134
128
  }
135
- // ── Reset (for tests) ───────────────────────────────────────────────────────
136
- export function resetMetrics() {
137
- counters.clear();
138
- histograms.clear();
139
- gaugeCallbacks.clear();
129
+ export function resetMetrics(state) {
130
+ state.counters.clear();
131
+ state.histograms.clear();
132
+ state.gaugeCallbacks.clear();
140
133
  }
141
- // ── Queue cleanup ────────────────────────────────────────────────────────────
142
- let metricsQueues = null;
143
- export function setMetricsQueues(map) {
144
- metricsQueues = map;
134
+ export function setMetricsQueues(state, map) {
135
+ state.queues = map;
145
136
  }
146
- export async function closeMetricsQueues() {
147
- if (!metricsQueues)
137
+ export async function closeMetricsQueues(state) {
138
+ if (!state.queues)
148
139
  return;
149
- for (const q of metricsQueues.values()) {
140
+ for (const q of state.queues.values()) {
150
141
  try {
151
142
  await q.close();
152
143
  }
@@ -154,5 +145,6 @@ export async function closeMetricsQueues() {
154
145
  // best-effort cleanup
155
146
  }
156
147
  }
157
- metricsQueues.clear();
148
+ state.queues.clear();
149
+ state.queues = null;
158
150
  }
@@ -0,0 +1,42 @@
1
+ import type { SigningConfig } from '../../lib/signingConfig';
2
+ import { z } from 'zod';
3
+ import type { ZodType } from 'zod';
4
+ export type { PaginationOpts, PaginatedResult } from '../../../packages/bunshot-core/src/index.js';
5
+ export { offsetParams, parseOffsetParams, paginatedResponse } from '../../../packages/bunshot-core/src/index.js';
6
+ export { cursorPaginatedResponse } from '../../../packages/bunshot-core/src/index.js';
7
+ export type { OffsetParamDefaults, ParsedOffsetParams } from '../../../packages/bunshot-core/src/index.js';
8
+ export interface CursorParamDefaults {
9
+ limit?: number;
10
+ maxLimit?: number;
11
+ }
12
+ export interface ParsedCursorParams {
13
+ limit: number;
14
+ cursor: string | undefined;
15
+ }
16
+ export interface CursorResult<T> {
17
+ items: T[];
18
+ nextCursor: string | null;
19
+ hasMore: boolean;
20
+ }
21
+ export declare function cursorParams(defaults?: CursorParamDefaults): z.ZodObject<{
22
+ limit: z.ZodOptional<z.ZodString>;
23
+ cursor: z.ZodOptional<z.ZodString>;
24
+ }, z.core.$strip>;
25
+ export declare function parseCursorParams(raw: {
26
+ limit?: string;
27
+ cursor?: string;
28
+ }, defaults?: CursorParamDefaults, signing?: {
29
+ config: SigningConfig | null;
30
+ secret: string | string[] | null;
31
+ }): ParsedCursorParams & {
32
+ invalidCursor?: true;
33
+ };
34
+ export declare function maybeSignCursor(cursor: string | null, signing?: {
35
+ config: SigningConfig | null;
36
+ secret: string | string[] | null;
37
+ }): string | null;
38
+ export declare function cursorResponse<T extends ZodType>(itemSchema: T, name: string): z.ZodObject<{
39
+ items: z.ZodArray<T>;
40
+ nextCursor: z.ZodNullable<z.ZodString>;
41
+ hasMore: z.ZodBoolean;
42
+ }, z.core.$strip>;
@@ -0,0 +1,51 @@
1
+ import { signCursor, verifyCursor } from '../../lib/signing';
2
+ import { z } from 'zod';
3
+ import { registerSchema } from '../../../packages/bunshot-core/src/index.js';
4
+ export { offsetParams, parseOffsetParams, paginatedResponse } from '../../../packages/bunshot-core/src/index.js';
5
+ export { cursorPaginatedResponse } from '../../../packages/bunshot-core/src/index.js';
6
+ export function cursorParams(defaults) {
7
+ const defaultLimit = defaults?.limit ?? 50;
8
+ const maxLimit = defaults?.maxLimit ?? 200;
9
+ return z.object({
10
+ limit: z
11
+ .string()
12
+ .optional()
13
+ .describe(`Number of items to return (1-${maxLimit}, default ${defaultLimit})`),
14
+ cursor: z
15
+ .string()
16
+ .optional()
17
+ .describe("Opaque cursor from a previous response's nextCursor field"),
18
+ });
19
+ }
20
+ export function parseCursorParams(raw, defaults, signing) {
21
+ const defaultLimit = defaults?.limit ?? 50;
22
+ const maxLimit = defaults?.maxLimit ?? 200;
23
+ const rawLimit = parseInt(raw.limit ?? '', 10);
24
+ const limit = isNaN(rawLimit) ? defaultLimit : Math.min(Math.max(rawLimit, 1), maxLimit);
25
+ if (!raw.cursor)
26
+ return { limit, cursor: undefined };
27
+ if (signing?.config?.cursors && signing.secret) {
28
+ const verified = verifyCursor(raw.cursor, signing.secret);
29
+ if (verified === null)
30
+ return { limit, cursor: undefined, invalidCursor: true };
31
+ return { limit, cursor: verified };
32
+ }
33
+ return { limit, cursor: raw.cursor };
34
+ }
35
+ export function maybeSignCursor(cursor, signing) {
36
+ if (!cursor)
37
+ return cursor;
38
+ if (signing?.config?.cursors && signing.secret) {
39
+ return signCursor(cursor, signing.secret);
40
+ }
41
+ return cursor;
42
+ }
43
+ export function cursorResponse(itemSchema, name) {
44
+ const wrapper = z.object({
45
+ items: z.array(itemSchema),
46
+ nextCursor: z.string().nullable(),
47
+ hasMore: z.boolean(),
48
+ });
49
+ registerSchema(name, wrapper);
50
+ return wrapper;
51
+ }
@@ -0,0 +1,38 @@
1
+ import type { RedisOptions } from 'ioredis';
2
+ import type { WsTransportAdapter } from './wsTransport';
3
+ export type { WsTransportAdapter };
4
+ export interface RedisTransportOptions {
5
+ /** ioredis connection options or a Redis URL string */
6
+ connection: RedisOptions | string;
7
+ /** Channel prefix for pub/sub. Default: "ws:room:" */
8
+ channelPrefix?: string;
9
+ }
10
+ /**
11
+ * Redis pub/sub transport for horizontal WebSocket scaling.
12
+ *
13
+ * Uses two ioredis clients — one for publishing and one for subscribing —
14
+ * as required by the Redis pub/sub protocol (a client in subscribe mode
15
+ * cannot issue regular commands).
16
+ *
17
+ * Uses `psubscribe` on `<prefix>*` so that joining new rooms never
18
+ * requires an additional SUBSCRIBE call.
19
+ *
20
+ * Self-echo prevention: every published message is wrapped with the
21
+ * `origin` passed in from `ws.ts` (the server instance UUID). Messages
22
+ * whose origin matches the local instance are dropped by the caller —
23
+ * the origin is forwarded intact to the `onMessage` callback.
24
+ *
25
+ * @example
26
+ * ```ts
27
+ * import { createRedisTransport } from '@lastshotlabs/bunshot'
28
+ *
29
+ * // Pass transport via ws.transport in createServer config:
30
+ * createServer({
31
+ * ws: {
32
+ * transport: createRedisTransport({ connection: { host: 'localhost', port: 6379 } }),
33
+ * endpoints: { '/ws': {} },
34
+ * },
35
+ * })
36
+ * ```
37
+ */
38
+ export declare function createRedisTransport(opts: RedisTransportOptions): WsTransportAdapter;
@@ -0,0 +1,107 @@
1
+ import { wsEndpointKey } from './wsNamespace';
2
+ function requireIoredis() {
3
+ try {
4
+ // Bun supports require() in ESM; this defers the import to call time
5
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
6
+ const mod = require('ioredis');
7
+ return mod.default ?? mod;
8
+ }
9
+ catch {
10
+ throw new Error('ioredis is required for RedisTransport. Install it: bun add ioredis');
11
+ }
12
+ }
13
+ /**
14
+ * Redis pub/sub transport for horizontal WebSocket scaling.
15
+ *
16
+ * Uses two ioredis clients — one for publishing and one for subscribing —
17
+ * as required by the Redis pub/sub protocol (a client in subscribe mode
18
+ * cannot issue regular commands).
19
+ *
20
+ * Uses `psubscribe` on `<prefix>*` so that joining new rooms never
21
+ * requires an additional SUBSCRIBE call.
22
+ *
23
+ * Self-echo prevention: every published message is wrapped with the
24
+ * `origin` passed in from `ws.ts` (the server instance UUID). Messages
25
+ * whose origin matches the local instance are dropped by the caller —
26
+ * the origin is forwarded intact to the `onMessage` callback.
27
+ *
28
+ * @example
29
+ * ```ts
30
+ * import { createRedisTransport } from '@lastshotlabs/bunshot'
31
+ *
32
+ * // Pass transport via ws.transport in createServer config:
33
+ * createServer({
34
+ * ws: {
35
+ * transport: createRedisTransport({ connection: { host: 'localhost', port: 6379 } }),
36
+ * endpoints: { '/ws': {} },
37
+ * },
38
+ * })
39
+ * ```
40
+ */
41
+ export function createRedisTransport(opts) {
42
+ const channelPrefix = opts.channelPrefix ?? 'ws:room:';
43
+ let pubClient = null;
44
+ let subClient = null;
45
+ function buildClients() {
46
+ const Redis = requireIoredis();
47
+ const conn = opts.connection;
48
+ const pub = new Redis(conn);
49
+ const sub = new Redis(conn);
50
+ return { pub, sub };
51
+ }
52
+ function channelForKey(key) {
53
+ return `${channelPrefix}${key}`;
54
+ }
55
+ function keyFromChannel(channel) {
56
+ return channel.slice(channelPrefix.length);
57
+ }
58
+ return {
59
+ async publish(endpoint, room, message, origin) {
60
+ if (!pubClient)
61
+ throw new Error('[RedisTransport] Not connected — call connect() first');
62
+ const payload = JSON.stringify({ msg: message, origin });
63
+ await pubClient.publish(channelForKey(wsEndpointKey(endpoint, room)), payload);
64
+ },
65
+ async connect(onMessage) {
66
+ const { pub, sub } = buildClients();
67
+ pubClient = pub;
68
+ subClient = sub;
69
+ // psubscribe covers all rooms under the prefix — avoids per-room subscribe churn
70
+ await subClient.psubscribe(`${channelPrefix}*`);
71
+ subClient.on('pmessage', (_pattern, channel, rawPayload) => {
72
+ let parsed;
73
+ try {
74
+ parsed = JSON.parse(rawPayload);
75
+ }
76
+ catch {
77
+ // Malformed payload — skip silently
78
+ return;
79
+ }
80
+ // Channel key is a wsEndpointKey composite — decode endpoint and room
81
+ const compositeKey = keyFromChannel(channel);
82
+ const colonIdx = compositeKey.indexOf(':');
83
+ if (colonIdx === -1)
84
+ return;
85
+ const endpoint = decodeURIComponent(compositeKey.slice(0, colonIdx));
86
+ const room = decodeURIComponent(compositeKey.slice(colonIdx + 1));
87
+ onMessage(endpoint, room, parsed.msg, parsed.origin);
88
+ });
89
+ },
90
+ async disconnect() {
91
+ if (subClient) {
92
+ // Force-close the subscriber connection. In ioredis, a client in
93
+ // subscribe mode will hang on quit() because it waits for pending
94
+ // subscribe-mode commands. disconnect() closes the socket immediately
95
+ // without waiting, which is safe at shutdown time.
96
+ subClient.disconnect();
97
+ subClient = null;
98
+ }
99
+ if (pubClient) {
100
+ // Use disconnect() for consistency — quit() can hang if ioredis is
101
+ // in the middle of a reconnect cycle and has queued commands.
102
+ pubClient.disconnect();
103
+ pubClient = null;
104
+ }
105
+ },
106
+ };
107
+ }