@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,2 @@
1
+ import type { UserResolver } from '../../../packages/bunshot-core/src/index.js';
2
+ export declare function resolveUserId(req: Request, resolver: UserResolver | null): Promise<string | null>;
@@ -0,0 +1,5 @@
1
+ export async function resolveUserId(req, resolver) {
2
+ if (!resolver)
3
+ return null;
4
+ return resolver.resolveUserId(req);
5
+ }
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Returns true if the Hono route pattern could match the given literal SSE path.
3
+ * Normalizes trailing slashes. Handles: exact match, :param segments,
4
+ * terminal wildcard *, catch-all /*, and prefix wildcard /path/*.
5
+ */
6
+ export declare function routePatternCanMatchLiteral(pattern: string, literal: string): boolean;
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Returns true if the Hono route pattern could match the given literal SSE path.
3
+ * Normalizes trailing slashes. Handles: exact match, :param segments,
4
+ * terminal wildcard *, catch-all /*, and prefix wildcard /path/*.
5
+ */
6
+ export function routePatternCanMatchLiteral(pattern, literal) {
7
+ const norm = (s) => s.replace(/\/+$/, '') || '/';
8
+ pattern = norm(pattern);
9
+ literal = norm(literal);
10
+ if (pattern === '/*' || pattern === '*')
11
+ return true;
12
+ const patSegs = pattern.split('/');
13
+ const litSegs = literal.split('/');
14
+ for (let i = 0; i < patSegs.length; i++) {
15
+ const p = patSegs[i];
16
+ if (p === '*')
17
+ return true; // terminal wildcard — rest matches
18
+ if (i >= litSegs.length)
19
+ return false;
20
+ if (p.startsWith(':'))
21
+ continue; // param segment — matches any
22
+ if (p !== litSegs[i])
23
+ return false; // literal mismatch
24
+ }
25
+ return patSegs.length === litSegs.length;
26
+ }
@@ -0,0 +1 @@
1
+ export type { StorageAdapter, UploadResult } from '../../../packages/bunshot-core/src/index.js';
@@ -0,0 +1 @@
1
+ export {};
@@ -10,11 +10,11 @@
10
10
  */
11
11
  export function stripUnreferencedSchemas(spec) {
12
12
  const schemas = spec?.components?.schemas;
13
- if (!schemas || typeof schemas !== "object")
13
+ if (!schemas || typeof schemas !== 'object')
14
14
  return spec;
15
15
  // Collect all $ref strings from an arbitrary JSON node
16
16
  function collectRefs(node, refs) {
17
- if (!node || typeof node !== "object")
17
+ if (!node || typeof node !== 'object')
18
18
  return;
19
19
  if (Array.isArray(node)) {
20
20
  for (const item of node)
@@ -22,7 +22,7 @@ export function stripUnreferencedSchemas(spec) {
22
22
  return;
23
23
  }
24
24
  for (const [key, val] of Object.entries(node)) {
25
- if (key === "$ref" && typeof val === "string") {
25
+ if (key === '$ref' && typeof val === 'string') {
26
26
  refs.add(val);
27
27
  }
28
28
  else {
@@ -32,7 +32,7 @@ export function stripUnreferencedSchemas(spec) {
32
32
  }
33
33
  // Extract schema name from a $ref like "#/components/schemas/Foo"
34
34
  function schemaNameFromRef(ref) {
35
- const prefix = "#/components/schemas/";
35
+ const prefix = '#/components/schemas/';
36
36
  return ref.startsWith(prefix) ? ref.slice(prefix.length) : null;
37
37
  }
38
38
  // Collect initial refs from paths (not from components to avoid circular bootstrapping)
@@ -0,0 +1,21 @@
1
+ import type { Connection } from 'mongoose';
2
+ export interface TenantInfo {
3
+ tenantId: string;
4
+ displayName?: string;
5
+ config?: Record<string, unknown>;
6
+ createdAt: Date;
7
+ deletedAt?: Date | null;
8
+ }
9
+ export interface CreateTenantOptions {
10
+ displayName?: string;
11
+ config?: Record<string, unknown>;
12
+ }
13
+ export interface TenantService {
14
+ createTenant(tenantId: string, options?: CreateTenantOptions): Promise<void>;
15
+ deleteTenant(tenantId: string): Promise<void>;
16
+ getTenant(tenantId: string): Promise<TenantInfo | null>;
17
+ listTenants(): Promise<TenantInfo[]>;
18
+ }
19
+ export declare function createTenantService(conn: Connection, getTenantCache?: () => {
20
+ delete(tenantId: string): void;
21
+ } | null): TenantService;
@@ -0,0 +1,70 @@
1
+ import { getMongooseModule } from '../../lib/mongo';
2
+ function getTenantModel(conn) {
3
+ if (conn.models['Tenant']) {
4
+ return conn.models['Tenant'];
5
+ }
6
+ const mg = getMongooseModule();
7
+ const { Schema } = mg;
8
+ const schema = new Schema({
9
+ tenantId: { type: String, required: true, unique: true },
10
+ displayName: { type: String },
11
+ config: { type: Schema.Types.Mixed },
12
+ deletedAt: { type: Date, default: null },
13
+ }, { timestamps: true });
14
+ return conn.model('Tenant', schema);
15
+ }
16
+ export function createTenantService(conn, getTenantCache) {
17
+ return {
18
+ async createTenant(tenantId, options) {
19
+ const Tenant = getTenantModel(conn);
20
+ const existing = await Tenant.findOne({ tenantId }).lean();
21
+ if (existing && !existing.deletedAt) {
22
+ throw new Error(`Tenant "${tenantId}" already exists`);
23
+ }
24
+ if (existing && existing.deletedAt) {
25
+ // Reactivate soft-deleted tenant
26
+ await Tenant.findOneAndUpdate({ tenantId }, { $set: { deletedAt: null, displayName: options?.displayName, config: options?.config } });
27
+ return;
28
+ }
29
+ await Tenant.create({
30
+ tenantId,
31
+ displayName: options?.displayName,
32
+ config: options?.config,
33
+ });
34
+ },
35
+ async deleteTenant(tenantId) {
36
+ const Tenant = getTenantModel(conn);
37
+ const existing = await Tenant.findOne({ tenantId }).lean();
38
+ // Already deleted (or never existed) — nothing to do
39
+ if (!existing || existing.deletedAt)
40
+ return;
41
+ // Soft-delete
42
+ await Tenant.findOneAndUpdate({ tenantId }, { $set: { deletedAt: new Date() } });
43
+ const cache = getTenantCache?.();
44
+ if (cache)
45
+ cache.delete(tenantId);
46
+ },
47
+ async getTenant(tenantId) {
48
+ const Tenant = getTenantModel(conn);
49
+ const doc = await Tenant.findOne({ tenantId, deletedAt: null }).lean();
50
+ if (!doc)
51
+ return null;
52
+ return {
53
+ tenantId: doc.tenantId,
54
+ displayName: doc.displayName,
55
+ config: doc.config,
56
+ createdAt: doc.createdAt,
57
+ };
58
+ },
59
+ async listTenants() {
60
+ const Tenant = getTenantModel(conn);
61
+ const docs = await Tenant.find({ deletedAt: null }).lean();
62
+ return docs.map(doc => ({
63
+ tenantId: doc.tenantId,
64
+ displayName: doc.displayName,
65
+ config: doc.config,
66
+ createdAt: doc.createdAt,
67
+ }));
68
+ },
69
+ };
70
+ }
@@ -1,6 +1,6 @@
1
- import type { Context } from "hono";
2
- import type { AppEnv } from "./context";
3
- import type { StorageAdapter, UploadResult } from "./storageAdapter";
1
+ import type { StorageAdapter, UploadResult } from '../lib/storageAdapter';
2
+ import type { Context } from 'hono';
3
+ import type { AppEnv } from '../../../packages/bunshot-core/src/index.js';
4
4
  export interface UploadOpts {
5
5
  field?: string | string[];
6
6
  maxFileSize?: number;
@@ -13,23 +13,28 @@ export interface UploadOpts {
13
13
  }) => string;
14
14
  tenantScopedKeys?: boolean;
15
15
  }
16
- export declare const setStorageAdapter: (adapter: StorageAdapter) => void;
17
- export declare const getStorageAdapter: () => StorageAdapter | null;
18
- export declare const setUploadConfig: (config: UploadOpts) => void;
19
- export declare const getUploadConfig: () => UploadOpts;
16
+ type UploadCarrier = object;
17
+ export declare const getStorageAdapter: (input: UploadCarrier) => StorageAdapter | null;
18
+ export declare const getUploadConfig: (input: UploadCarrier) => UploadOpts;
20
19
  export declare const generateUploadKey: (file: File, ctx: {
21
20
  userId?: string;
22
21
  tenantId?: string;
23
- }, opts?: UploadOpts) => string;
22
+ }, opts?: UploadOpts, input?: UploadCarrier) => string;
23
+ export declare const generateUploadKeyFromFilename: (filename: string | undefined, ctx: {
24
+ userId?: string;
25
+ tenantId?: string;
26
+ }, opts?: UploadOpts, input?: UploadCarrier) => string;
24
27
  export declare const validateFile: (file: File, opts: {
25
28
  maxFileSize?: number;
26
29
  allowedMimeTypes?: string[];
27
- }) => string | null;
30
+ }, input?: UploadCarrier) => string | null;
28
31
  export declare const processUpload: (file: File, opts: UploadOpts & {
29
32
  ctx?: {
30
33
  userId?: string;
31
34
  tenantId?: string;
32
35
  };
33
36
  bucket?: string;
37
+ carrier?: object;
34
38
  }) => Promise<UploadResult>;
35
39
  export declare const parseUpload: (c: Context<AppEnv>, opts?: UploadOpts) => Promise<UploadResult[]>;
40
+ export {};
@@ -0,0 +1,132 @@
1
+ import { extname } from 'node:path';
2
+ import { HttpError, resolveContext } from '../../../packages/bunshot-core/src/index.js';
3
+ function getUploadState(input) {
4
+ const ctx = resolveContext(input);
5
+ const state = ctx.upload;
6
+ if (!state)
7
+ return { adapter: null, config: {} };
8
+ return {
9
+ adapter: state.adapter ?? null,
10
+ config: { ...state.config },
11
+ };
12
+ }
13
+ export const getStorageAdapter = (input) => getUploadState(input).adapter;
14
+ export const getUploadConfig = (input) => getUploadState(input).config;
15
+ function mergeUploadConfig(input, opts) {
16
+ const base = input ? getUploadConfig(input) : {};
17
+ return { ...base, ...opts };
18
+ }
19
+ export const generateUploadKey = (file, ctx, opts, input) => {
20
+ const merged = mergeUploadConfig(input, opts);
21
+ if (merged.generateKey)
22
+ return merged.generateKey(file, ctx);
23
+ const rawExt = extname(file.name);
24
+ const ext = /^\.[a-zA-Z0-9]{1,10}$/.test(rawExt) ? rawExt : '';
25
+ const uuid = crypto.randomUUID();
26
+ const prefix = merged.keyPrefix ?? 'uploads/';
27
+ const tenantPrefix = merged.tenantScopedKeys && ctx.tenantId ? `${ctx.tenantId}/` : '';
28
+ return `${prefix}${tenantPrefix}${uuid}${ext}`;
29
+ };
30
+ export const generateUploadKeyFromFilename = (filename, ctx, opts, input) => {
31
+ const merged = mergeUploadConfig(input, opts);
32
+ if (merged.generateKey) {
33
+ const stub = new File([], filename ?? 'upload');
34
+ return merged.generateKey(stub, ctx);
35
+ }
36
+ const rawExt = filename ? extname(filename) : '';
37
+ const ext = /^\.[a-zA-Z0-9]{1,10}$/.test(rawExt) ? rawExt : '';
38
+ const uuid = crypto.randomUUID();
39
+ const prefix = merged.keyPrefix ?? 'uploads/';
40
+ const tenantPrefix = merged.tenantScopedKeys && ctx.tenantId ? `${ctx.tenantId}/` : '';
41
+ return `${prefix}${tenantPrefix}${uuid}${ext}`;
42
+ };
43
+ const mimeMatches = (mimeType, pattern) => {
44
+ if (pattern.endsWith('/*')) {
45
+ return mimeType.startsWith(pattern.slice(0, -1));
46
+ }
47
+ return mimeType === pattern;
48
+ };
49
+ export const validateFile = (file, opts, input) => {
50
+ const merged = mergeUploadConfig(input, opts);
51
+ const maxFileSize = merged.maxFileSize ?? 10 * 1024 * 1024;
52
+ if (file.size > maxFileSize) {
53
+ return `File "${file.name}" exceeds maximum size of ${maxFileSize} bytes`;
54
+ }
55
+ const allowedMimeTypes = merged.allowedMimeTypes;
56
+ if (allowedMimeTypes && allowedMimeTypes.length > 0) {
57
+ const allowed = allowedMimeTypes.some(pattern => mimeMatches(file.type, pattern));
58
+ if (!allowed) {
59
+ return `File "${file.name}" has disallowed MIME type "${file.type}"`;
60
+ }
61
+ }
62
+ return null;
63
+ };
64
+ export const processUpload = async (file, opts) => {
65
+ const carrier = opts.carrier;
66
+ const adapter = carrier ? getStorageAdapter(carrier) : null;
67
+ if (!adapter)
68
+ throw new HttpError(500, 'No storage adapter configured');
69
+ const validationError = validateFile(file, opts, carrier);
70
+ if (validationError)
71
+ throw new HttpError(400, validationError);
72
+ const key = generateUploadKey(file, opts.ctx ?? {}, opts, carrier);
73
+ const { url } = await adapter.put(key, file, {
74
+ mimeType: file.type,
75
+ size: file.size,
76
+ bucket: opts.bucket,
77
+ });
78
+ if (carrier) {
79
+ const { registerUpload } = await import('../lib/uploadRegistry');
80
+ await registerUpload({
81
+ key,
82
+ ownerUserId: opts.ctx?.userId,
83
+ tenantId: opts.ctx?.tenantId,
84
+ mimeType: file.type,
85
+ bucket: opts.bucket,
86
+ createdAt: Date.now(),
87
+ }, carrier);
88
+ }
89
+ return {
90
+ key,
91
+ originalName: file.name,
92
+ mimeType: file.type,
93
+ size: file.size,
94
+ ...(url !== undefined ? { url } : {}),
95
+ };
96
+ };
97
+ export const parseUpload = async (c, opts) => {
98
+ const bunshotCtx = c.get('bunshotCtx');
99
+ const merged = mergeUploadConfig(bunshotCtx, opts);
100
+ const fields = merged.field
101
+ ? Array.isArray(merged.field)
102
+ ? merged.field
103
+ : [merged.field]
104
+ : ['file'];
105
+ const maxFiles = merged.maxFiles ?? 10;
106
+ const body = await c.req.parseBody({ all: true });
107
+ const results = [];
108
+ const userId = c.get('authUserId') ?? undefined;
109
+ const tenantId = c.get('tenantId') ?? undefined;
110
+ const bucket = c.get('uploadBucket');
111
+ for (const field of fields) {
112
+ const raw = body[field];
113
+ if (!raw)
114
+ continue;
115
+ const files = Array.isArray(raw) ? raw : [raw];
116
+ for (const f of files) {
117
+ if (!(f instanceof File))
118
+ continue;
119
+ if (results.length >= maxFiles) {
120
+ throw new HttpError(400, `Too many files. Maximum is ${maxFiles}`);
121
+ }
122
+ const result = await processUpload(f, {
123
+ ...merged,
124
+ ctx: { userId, tenantId },
125
+ bucket: bucket ?? undefined,
126
+ carrier: bunshotCtx,
127
+ });
128
+ results.push(result);
129
+ }
130
+ }
131
+ return results;
132
+ };
@@ -0,0 +1,23 @@
1
+ import type { UploadRecord } from '../../../packages/bunshot-core/src/index.js';
2
+ export type { UploadRecord };
3
+ /**
4
+ * Store a new upload record. Keyed by the storage key.
5
+ *
6
+ * @param record - The upload record to store
7
+ * @param app - The Hono app instance (required — used to resolve the context)
8
+ */
9
+ export declare const registerUpload: (record: UploadRecord, app: object) => Promise<void>;
10
+ /**
11
+ * Retrieve an upload record by key. Returns null if not found.
12
+ *
13
+ * @param key - The storage key
14
+ * @param app - The Hono app instance (required — used to resolve the context)
15
+ */
16
+ export declare const getUploadRecord: (key: string, app: object) => Promise<UploadRecord | null>;
17
+ /**
18
+ * Delete an upload record by key. Returns true if it existed.
19
+ *
20
+ * @param key - The storage key
21
+ * @param app - The Hono app instance (required — used to resolve the context)
22
+ */
23
+ export declare const deleteUploadRecord: (key: string, app: object) => Promise<boolean>;
@@ -0,0 +1,34 @@
1
+ // ---------------------------------------------------------------------------
2
+ // Upload Registry — thin wrappers that consume repositories from context
3
+ // ---------------------------------------------------------------------------
4
+ import { resolveContext } from '../../../packages/bunshot-core/src/index.js';
5
+ /**
6
+ * Store a new upload record. Keyed by the storage key.
7
+ *
8
+ * @param record - The upload record to store
9
+ * @param app - The Hono app instance (required — used to resolve the context)
10
+ */
11
+ export const registerUpload = async (record, app) => {
12
+ const ctx = resolveContext(app);
13
+ await ctx.persistence.uploadRegistry.register(record);
14
+ };
15
+ /**
16
+ * Retrieve an upload record by key. Returns null if not found.
17
+ *
18
+ * @param key - The storage key
19
+ * @param app - The Hono app instance (required — used to resolve the context)
20
+ */
21
+ export const getUploadRecord = async (key, app) => {
22
+ const ctx = resolveContext(app);
23
+ return ctx.persistence.uploadRegistry.get(key);
24
+ };
25
+ /**
26
+ * Delete an upload record by key. Returns true if it existed.
27
+ *
28
+ * @param key - The storage key
29
+ * @param app - The Hono app instance (required — used to resolve the context)
30
+ */
31
+ export const deleteUploadRecord = async (key, app) => {
32
+ const ctx = resolveContext(app);
33
+ return ctx.persistence.uploadRegistry.delete(key);
34
+ };
@@ -1,2 +1,2 @@
1
- import { z } from "zod";
1
+ import { z } from 'zod';
2
2
  export declare const validate: <T extends z.ZodType>(schema: T, req: Request) => Promise<z.output<T>>;
@@ -1,5 +1,5 @@
1
- import { z } from "zod";
2
- import { ValidationError } from "./HttpError";
1
+ import { z } from 'zod';
2
+ import { ValidationError } from '../../../packages/bunshot-core/src/index.js';
3
3
  export const validate = async (schema, req) => {
4
4
  try {
5
5
  const body = await req.json();
@@ -0,0 +1,19 @@
1
+ import type { ServerWebSocket } from 'bun';
2
+ import type { WsState } from '../../../packages/bunshot-core/src/index.js';
3
+ type WithRooms = {
4
+ rooms: Set<string>;
5
+ };
6
+ type WithSocketId = {
7
+ id: string;
8
+ endpoint: string;
9
+ } & WithRooms;
10
+ type RoomGuard<T extends WithRooms> = (ws: ServerWebSocket<T>, room: string) => boolean | Promise<boolean>;
11
+ export declare const publish: (state: WsState, endpoint: string, room: string, data: unknown) => void;
12
+ export declare const getRooms: (state: WsState, endpoint: string) => string[];
13
+ export declare const getRoomSubscribers: (state: WsState, endpoint: string, room: string) => string[];
14
+ export declare const handleRoomActions: <T extends WithSocketId>(state: WsState, ws: ServerWebSocket<T>, message: string | Buffer, onSubscribe?: RoomGuard<T>) => Promise<boolean>;
15
+ export declare const subscribe: <T extends WithSocketId>(state: WsState, ws: ServerWebSocket<T>, room: string) => void;
16
+ export declare const unsubscribe: <T extends WithSocketId>(state: WsState, ws: ServerWebSocket<T>, room: string) => void;
17
+ export declare const getSubscriptions: <T extends WithRooms>(ws: ServerWebSocket<T>) => string[];
18
+ export declare const cleanupSocket: <T extends WithSocketId>(state: WsState, ws: ServerWebSocket<T>) => void;
19
+ export {};
@@ -0,0 +1,130 @@
1
+ import { wsEndpointKey } from './wsNamespace';
2
+ import { addPresence, cleanupPresence, removePresence } from './wsPresence';
3
+ const MAX_ROOM_ACTION_SIZE = 4096;
4
+ function isValidRoomName(room) {
5
+ return typeof room === 'string' && /^[a-zA-Z0-9_:./\-]{1,128}$/.test(room);
6
+ }
7
+ export const publish = (state, endpoint, room, data) => {
8
+ const key = wsEndpointKey(endpoint, room);
9
+ const msg = JSON.stringify(data);
10
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
11
+ state.server?.publish?.(key, msg);
12
+ if (state.transport) {
13
+ state.transport
14
+ .publish(endpoint, room, msg, state.instanceId)
15
+ .catch(e => console.error('[ws-transport] publish error:', e));
16
+ }
17
+ };
18
+ export const getRooms = (state, endpoint) => {
19
+ const prefix = encodeURIComponent(endpoint) + ':';
20
+ const rooms = [];
21
+ for (const key of state.roomRegistry.keys()) {
22
+ if (key.startsWith(prefix)) {
23
+ const colonIdx = key.indexOf(':');
24
+ rooms.push(decodeURIComponent(key.slice(colonIdx + 1)));
25
+ }
26
+ }
27
+ return rooms;
28
+ };
29
+ export const getRoomSubscribers = (state, endpoint, room) => [
30
+ ...(state.roomRegistry.get(wsEndpointKey(endpoint, room)) ?? []),
31
+ ];
32
+ export const handleRoomActions = async (state, ws, message, onSubscribe) => {
33
+ try {
34
+ const raw = typeof message === 'string' ? message : Buffer.from(message).toString();
35
+ if (raw.length > MAX_ROOM_ACTION_SIZE)
36
+ return false;
37
+ const data = JSON.parse(raw);
38
+ if (data.action === 'subscribe' && typeof data.room === 'string') {
39
+ if (!isValidRoomName(data.room))
40
+ return true;
41
+ if (onSubscribe) {
42
+ let allowed;
43
+ try {
44
+ allowed = await onSubscribe(ws, data.room);
45
+ }
46
+ catch (e) {
47
+ console.error(`[ws] onRoomSubscribe guard error for room "${data.room}":`, e);
48
+ allowed = false;
49
+ }
50
+ if (!allowed) {
51
+ ws.send(JSON.stringify({ event: 'subscribe_denied', room: data.room }));
52
+ return true;
53
+ }
54
+ }
55
+ subscribe(state, ws, data.room);
56
+ ws.send(JSON.stringify({ event: 'subscribed', room: data.room }));
57
+ return true;
58
+ }
59
+ if (data.action === 'unsubscribe' && typeof data.room === 'string') {
60
+ if (!isValidRoomName(data.room))
61
+ return true;
62
+ unsubscribe(state, ws, data.room);
63
+ ws.send(JSON.stringify({ event: 'unsubscribed', room: data.room }));
64
+ return true;
65
+ }
66
+ }
67
+ catch {
68
+ // not JSON
69
+ }
70
+ return false;
71
+ };
72
+ export const subscribe = (state, ws, room) => {
73
+ const key = wsEndpointKey(ws.data.endpoint, room);
74
+ ws.subscribe(key);
75
+ ws.data.rooms.add(room);
76
+ if (!state.roomRegistry.has(key))
77
+ state.roomRegistry.set(key, new Set());
78
+ state.roomRegistry.get(key).add(ws.data.id);
79
+ if (state.presenceEnabled) {
80
+ const result = addPresence(state, ws.data.id, ws.data.endpoint, room);
81
+ if (result?.isNewUser) {
82
+ publish(state, ws.data.endpoint, room, {
83
+ event: 'presence_join',
84
+ room,
85
+ userId: result.userId,
86
+ });
87
+ }
88
+ }
89
+ };
90
+ export const unsubscribe = (state, ws, room) => {
91
+ const key = wsEndpointKey(ws.data.endpoint, room);
92
+ ws.unsubscribe(key);
93
+ ws.data.rooms.delete(room);
94
+ const ids = state.roomRegistry.get(key);
95
+ if (ids) {
96
+ ids.delete(ws.data.id);
97
+ if (ids.size === 0)
98
+ state.roomRegistry.delete(key);
99
+ }
100
+ if (state.presenceEnabled) {
101
+ const result = removePresence(state, ws.data.id, ws.data.endpoint, room);
102
+ if (result?.isLastSocket) {
103
+ publish(state, ws.data.endpoint, room, {
104
+ event: 'presence_leave',
105
+ room,
106
+ userId: result.userId,
107
+ });
108
+ }
109
+ }
110
+ };
111
+ export const getSubscriptions = (ws) => [
112
+ ...ws.data.rooms,
113
+ ];
114
+ export const cleanupSocket = (state, ws) => {
115
+ if (state.presenceEnabled) {
116
+ const departed = cleanupPresence(state, ws.data.id, ws.data.endpoint, ws.data.rooms);
117
+ for (const { room, userId } of departed) {
118
+ publish(state, ws.data.endpoint, room, { event: 'presence_leave', room, userId });
119
+ }
120
+ }
121
+ for (const room of ws.data.rooms) {
122
+ const key = wsEndpointKey(ws.data.endpoint, room);
123
+ const ids = state.roomRegistry.get(key);
124
+ if (ids) {
125
+ ids.delete(ws.data.id);
126
+ if (ids.size === 0)
127
+ state.roomRegistry.delete(key);
128
+ }
129
+ }
130
+ };
@@ -0,0 +1,12 @@
1
+ import type { ServerWebSocket } from 'bun';
2
+ import type { WsState } from '../../../packages/bunshot-core/src/index.js';
3
+ export interface HeartbeatConfig {
4
+ intervalMs?: number;
5
+ timeoutMs?: number;
6
+ }
7
+ export declare const registerSocket: (state: WsState, ws: ServerWebSocket<any>, socketId: string, endpoint: string) => void;
8
+ export declare const deregisterSocket: (state: WsState, id: string) => void;
9
+ export declare const handlePong: (state: WsState, id: string) => void;
10
+ export declare const startHeartbeat: (state: WsState, configs: Record<string, HeartbeatConfig | boolean>) => void;
11
+ export declare const stopHeartbeat: (state: WsState) => void;
12
+ export declare const clearHeartbeatState: (state: WsState) => void;
@@ -0,0 +1,53 @@
1
+ const DEFAULT_INTERVAL_MS = 30_000;
2
+ const DEFAULT_TIMEOUT_MS = 10_000;
3
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
4
+ export const registerSocket = (state, ws, socketId, endpoint) => {
5
+ const timeoutMs = state.heartbeatEndpointConfigs.get(endpoint)?.timeoutMs ?? DEFAULT_TIMEOUT_MS;
6
+ state.heartbeatSockets.set(socketId, { ws, endpoint, timeoutAt: Date.now() + timeoutMs });
7
+ };
8
+ export const deregisterSocket = (state, id) => {
9
+ state.heartbeatSockets.delete(id);
10
+ };
11
+ export const handlePong = (state, id) => {
12
+ const entry = state.heartbeatSockets.get(id);
13
+ if (!entry)
14
+ return;
15
+ const timeoutMs = state.heartbeatEndpointConfigs.get(entry.endpoint)?.timeoutMs ?? DEFAULT_TIMEOUT_MS;
16
+ entry.timeoutAt = Date.now() + timeoutMs;
17
+ };
18
+ export const startHeartbeat = (state, configs) => {
19
+ if (state.heartbeatTimer)
20
+ return;
21
+ for (const [endpoint, cfg] of Object.entries(configs)) {
22
+ const opts = typeof cfg === 'object' ? cfg : {};
23
+ state.heartbeatEndpointConfigs.set(endpoint, {
24
+ intervalMs: opts.intervalMs ?? DEFAULT_INTERVAL_MS,
25
+ timeoutMs: opts.timeoutMs ?? DEFAULT_TIMEOUT_MS,
26
+ });
27
+ }
28
+ const minInterval = Math.min(...[...state.heartbeatEndpointConfigs.values()].map(c => c.intervalMs ?? DEFAULT_INTERVAL_MS));
29
+ state.heartbeatTimer = setInterval(() => {
30
+ const now = Date.now();
31
+ for (const [, entry] of state.heartbeatSockets) {
32
+ if (now >= entry.timeoutAt) {
33
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
34
+ entry.ws.close(1001, 'Heartbeat timeout');
35
+ }
36
+ else {
37
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
38
+ entry.ws.ping();
39
+ }
40
+ }
41
+ }, minInterval);
42
+ };
43
+ export const stopHeartbeat = (state) => {
44
+ if (state.heartbeatTimer) {
45
+ clearInterval(state.heartbeatTimer);
46
+ state.heartbeatTimer = null;
47
+ }
48
+ };
49
+ export const clearHeartbeatState = (state) => {
50
+ stopHeartbeat(state);
51
+ state.heartbeatSockets.clear();
52
+ state.heartbeatEndpointConfigs.clear();
53
+ };