@lastshotlabs/bunshot 0.0.25 → 0.0.28

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (725) hide show
  1. package/.oclif.manifest.json +39 -0
  2. package/README.md +8282 -2147
  3. package/dist/cli/commands/init.js +690 -0
  4. package/dist/cli/index.js +6 -0
  5. package/dist/cli.js +4 -4
  6. package/dist/packages/bunshot-admin/src/index.d.ts +15 -0
  7. package/dist/packages/bunshot-admin/src/index.js +11 -0
  8. package/dist/packages/bunshot-admin/src/lib/resourceTypes.d.ts +8 -0
  9. package/dist/packages/bunshot-admin/src/lib/resourceTypes.js +33 -0
  10. package/dist/packages/bunshot-admin/src/lib/typedRoute.d.ts +14 -0
  11. package/dist/packages/bunshot-admin/src/lib/typedRoute.js +17 -0
  12. package/dist/packages/bunshot-admin/src/plugin.d.ts +4 -0
  13. package/dist/packages/bunshot-admin/src/plugin.js +46 -0
  14. package/dist/packages/bunshot-admin/src/providers/auth0Access.d.ts +6 -0
  15. package/dist/packages/bunshot-admin/src/providers/auth0Access.js +32 -0
  16. package/dist/packages/bunshot-admin/src/routes/admin.d.ts +10 -0
  17. package/dist/packages/bunshot-admin/src/routes/admin.js +923 -0
  18. package/dist/packages/bunshot-admin/src/routes/mail.d.ts +6 -0
  19. package/dist/packages/bunshot-admin/src/routes/mail.js +114 -0
  20. package/dist/packages/bunshot-admin/src/routes/permissions.d.ts +8 -0
  21. package/dist/packages/bunshot-admin/src/routes/permissions.js +315 -0
  22. package/dist/packages/bunshot-admin/src/types/config.d.ts +16 -0
  23. package/dist/packages/bunshot-admin/src/types/config.js +37 -0
  24. package/dist/packages/bunshot-admin/src/types/env.d.ts +14 -0
  25. package/dist/packages/bunshot-admin/src/types/provider.d.ts +1 -0
  26. package/dist/packages/bunshot-admin/src/types/provider.js +4 -0
  27. package/dist/packages/bunshot-auth/src/adapters/memoryAuth.d.ts +66 -0
  28. package/dist/packages/bunshot-auth/src/adapters/memoryAuth.js +1063 -0
  29. package/dist/packages/bunshot-auth/src/adapters/mongoAuth.d.ts +2 -0
  30. package/dist/packages/bunshot-auth/src/adapters/mongoAuth.js +536 -0
  31. package/dist/packages/bunshot-auth/src/adapters/sqliteAuth.d.ts +88 -0
  32. package/dist/packages/bunshot-auth/src/adapters/sqliteAuth.js +1366 -0
  33. package/dist/packages/bunshot-auth/src/admin/bunshotAccess.d.ts +2 -0
  34. package/dist/packages/bunshot-auth/src/admin/bunshotAccess.js +23 -0
  35. package/dist/packages/bunshot-auth/src/admin/bunshotUsers.d.ts +5 -0
  36. package/dist/packages/bunshot-auth/src/admin/bunshotUsers.js +131 -0
  37. package/dist/packages/bunshot-auth/src/bootstrap.d.ts +38 -0
  38. package/dist/packages/bunshot-auth/src/bootstrap.js +384 -0
  39. package/dist/packages/bunshot-auth/src/config/appConfig.d.ts +3 -0
  40. package/dist/packages/bunshot-auth/src/config/appConfig.js +4 -0
  41. package/dist/packages/bunshot-auth/src/config/authConfig.d.ts +478 -0
  42. package/dist/packages/bunshot-auth/src/config/authConfig.js +46 -0
  43. package/dist/packages/bunshot-auth/src/config/configLock.d.ts +2 -0
  44. package/dist/packages/bunshot-auth/src/config/configLock.js +10 -0
  45. package/dist/packages/bunshot-auth/src/index.d.ts +25 -0
  46. package/dist/packages/bunshot-auth/src/index.js +23 -0
  47. package/dist/packages/bunshot-auth/src/infra/mongo.d.ts +15 -0
  48. package/dist/packages/bunshot-auth/src/infra/mongo.js +44 -0
  49. package/dist/packages/bunshot-auth/src/infra/queue.d.ts +14 -0
  50. package/dist/packages/bunshot-auth/src/infra/queue.js +27 -0
  51. package/dist/packages/bunshot-auth/src/infra/redis.d.ts +5 -0
  52. package/dist/packages/bunshot-auth/src/infra/redis.js +15 -0
  53. package/dist/packages/bunshot-auth/src/infra/signing.d.ts +7 -0
  54. package/dist/packages/bunshot-auth/src/infra/signing.js +8 -0
  55. package/dist/packages/bunshot-auth/src/lib/accountLockout.d.ts +34 -0
  56. package/dist/packages/bunshot-auth/src/lib/accountLockout.js +244 -0
  57. package/dist/packages/bunshot-auth/src/lib/adapterTiers.d.ts +1 -0
  58. package/dist/packages/bunshot-auth/src/lib/adapterTiers.js +1 -0
  59. package/dist/packages/bunshot-auth/src/lib/authAdapter.d.ts +1 -0
  60. package/dist/packages/bunshot-auth/src/lib/authAdapter.js +1 -0
  61. package/dist/packages/bunshot-auth/src/lib/authContext.d.ts +15 -0
  62. package/dist/packages/bunshot-auth/src/lib/authContext.js +1 -0
  63. package/dist/packages/bunshot-auth/src/lib/authEventBus.d.ts +4 -0
  64. package/dist/packages/bunshot-auth/src/lib/authEventBus.js +15 -0
  65. package/dist/packages/bunshot-auth/src/lib/authRateLimit.d.ts +28 -0
  66. package/dist/packages/bunshot-auth/src/lib/authRateLimit.js +205 -0
  67. package/dist/packages/bunshot-auth/src/lib/breachedPassword.d.ts +19 -0
  68. package/dist/packages/bunshot-auth/src/lib/breachedPassword.js +61 -0
  69. package/dist/packages/bunshot-auth/src/lib/cache.d.ts +12 -0
  70. package/dist/packages/bunshot-auth/src/lib/cache.js +120 -0
  71. package/dist/packages/bunshot-auth/src/lib/clientIp.d.ts +4 -0
  72. package/dist/{lib → packages/bunshot-auth/src/lib}/clientIp.js +14 -7
  73. package/dist/packages/bunshot-auth/src/lib/cookieOptions.d.ts +27 -0
  74. package/dist/packages/bunshot-auth/src/lib/cookieOptions.js +33 -0
  75. package/dist/packages/bunshot-auth/src/lib/credentialStuffing.d.ts +40 -0
  76. package/dist/packages/bunshot-auth/src/lib/credentialStuffing.js +221 -0
  77. package/dist/packages/bunshot-auth/src/lib/deletionCancelToken.d.ts +19 -0
  78. package/dist/packages/bunshot-auth/src/lib/deletionCancelToken.js +148 -0
  79. package/dist/packages/bunshot-auth/src/lib/emailTemplates.d.ts +23 -0
  80. package/dist/packages/bunshot-auth/src/lib/emailTemplates.js +265 -0
  81. package/dist/packages/bunshot-auth/src/lib/emailVerification.d.ts +30 -0
  82. package/dist/packages/bunshot-auth/src/lib/emailVerification.js +200 -0
  83. package/dist/packages/bunshot-auth/src/lib/env.d.ts +1 -0
  84. package/dist/packages/bunshot-auth/src/lib/env.js +3 -0
  85. package/dist/packages/bunshot-auth/src/lib/fingerprint.js +36 -0
  86. package/dist/{lib → packages/bunshot-auth/src/lib}/groups.d.ts +15 -16
  87. package/dist/{lib → packages/bunshot-auth/src/lib}/groups.js +22 -34
  88. package/dist/packages/bunshot-auth/src/lib/jwks.d.ts +28 -0
  89. package/dist/packages/bunshot-auth/src/lib/jwks.js +79 -0
  90. package/dist/packages/bunshot-auth/src/lib/jwt.d.ts +12 -0
  91. package/dist/packages/bunshot-auth/src/lib/jwt.js +86 -0
  92. package/dist/packages/bunshot-auth/src/lib/logger.d.ts +3 -0
  93. package/dist/packages/bunshot-auth/src/lib/logger.js +13 -0
  94. package/dist/packages/bunshot-auth/src/lib/m2m.d.ts +30 -0
  95. package/dist/packages/bunshot-auth/src/lib/m2m.js +44 -0
  96. package/dist/packages/bunshot-auth/src/lib/magicLink.d.ts +13 -0
  97. package/dist/packages/bunshot-auth/src/lib/magicLink.js +145 -0
  98. package/dist/packages/bunshot-auth/src/lib/mfaChallenge.d.ts +60 -0
  99. package/dist/packages/bunshot-auth/src/lib/mfaChallenge.js +419 -0
  100. package/dist/packages/bunshot-auth/src/lib/oauth.d.ts +82 -0
  101. package/dist/packages/bunshot-auth/src/lib/oauth.js +177 -0
  102. package/dist/packages/bunshot-auth/src/lib/oauthCode.d.ts +19 -0
  103. package/dist/packages/bunshot-auth/src/lib/oauthCode.js +182 -0
  104. package/dist/packages/bunshot-auth/src/lib/oauthReauth.d.ts +19 -0
  105. package/dist/packages/bunshot-auth/src/lib/oauthReauth.js +255 -0
  106. package/dist/packages/bunshot-auth/src/lib/organization.d.ts +66 -0
  107. package/dist/packages/bunshot-auth/src/lib/organization.js +225 -0
  108. package/dist/packages/bunshot-auth/src/lib/passwordHistory.d.ts +12 -0
  109. package/dist/packages/bunshot-auth/src/lib/passwordHistory.js +31 -0
  110. package/dist/packages/bunshot-auth/src/lib/resetPassword.d.ts +20 -0
  111. package/dist/packages/bunshot-auth/src/lib/resetPassword.js +148 -0
  112. package/dist/packages/bunshot-auth/src/lib/roles.d.ts +9 -0
  113. package/dist/packages/bunshot-auth/src/lib/roles.js +93 -0
  114. package/dist/packages/bunshot-auth/src/lib/saml.d.ts +29 -0
  115. package/dist/packages/bunshot-auth/src/lib/saml.js +73 -0
  116. package/dist/packages/bunshot-auth/src/lib/samlRequestId.d.ts +13 -0
  117. package/dist/packages/bunshot-auth/src/lib/samlRequestId.js +129 -0
  118. package/dist/packages/bunshot-auth/src/lib/scim.d.ts +44 -0
  119. package/dist/packages/bunshot-auth/src/lib/scim.js +56 -0
  120. package/dist/packages/bunshot-auth/src/lib/securityEventWiring.d.ts +22 -0
  121. package/dist/packages/bunshot-auth/src/lib/securityEventWiring.js +65 -0
  122. package/dist/packages/bunshot-auth/src/lib/session.d.ts +45 -0
  123. package/dist/packages/bunshot-auth/src/lib/session.js +1211 -0
  124. package/dist/packages/bunshot-auth/src/lib/storeInfra.d.ts +26 -0
  125. package/dist/packages/bunshot-auth/src/lib/storeInfra.js +18 -0
  126. package/dist/packages/bunshot-auth/src/lib/suspension.d.ts +14 -0
  127. package/dist/packages/bunshot-auth/src/lib/suspension.js +20 -0
  128. package/dist/packages/bunshot-auth/src/lib/validateAdapter.d.ts +16 -0
  129. package/dist/packages/bunshot-auth/src/lib/validateAdapter.js +161 -0
  130. package/dist/packages/bunshot-auth/src/middleware/bearerAuth.d.ts +13 -0
  131. package/dist/packages/bunshot-auth/src/middleware/bearerAuth.js +58 -0
  132. package/dist/{middleware → packages/bunshot-auth/src/middleware}/csrf.d.ts +5 -4
  133. package/dist/packages/bunshot-auth/src/middleware/csrf.js +138 -0
  134. package/dist/packages/bunshot-auth/src/middleware/identify.d.ts +4 -0
  135. package/dist/packages/bunshot-auth/src/middleware/identify.js +124 -0
  136. package/dist/{middleware → packages/bunshot-auth/src/middleware}/requireMfaSetup.d.ts +2 -2
  137. package/dist/{middleware → packages/bunshot-auth/src/middleware}/requireMfaSetup.js +10 -7
  138. package/dist/{middleware → packages/bunshot-auth/src/middleware}/requireRole.d.ts +2 -2
  139. package/dist/{middleware → packages/bunshot-auth/src/middleware}/requireRole.js +20 -16
  140. package/dist/packages/bunshot-auth/src/middleware/requireScope.d.ts +10 -0
  141. package/dist/packages/bunshot-auth/src/middleware/requireScope.js +25 -0
  142. package/dist/packages/bunshot-auth/src/middleware/requireStepUp.d.ts +18 -0
  143. package/dist/packages/bunshot-auth/src/middleware/requireStepUp.js +30 -0
  144. package/dist/{middleware → packages/bunshot-auth/src/middleware}/requireVerifiedEmail.d.ts +2 -2
  145. package/dist/{middleware → packages/bunshot-auth/src/middleware}/requireVerifiedEmail.js +7 -6
  146. package/dist/packages/bunshot-auth/src/middleware/scimAuth.d.ts +8 -0
  147. package/dist/packages/bunshot-auth/src/middleware/scimAuth.js +29 -0
  148. package/dist/packages/bunshot-auth/src/middleware/userAuth.d.ts +3 -0
  149. package/dist/packages/bunshot-auth/src/middleware/userAuth.js +6 -0
  150. package/dist/{models → packages/bunshot-auth/src/models}/AuthUser.d.ts +19 -8
  151. package/dist/packages/bunshot-auth/src/models/AuthUser.js +53 -0
  152. package/dist/packages/bunshot-auth/src/models/Group.d.ts +19 -0
  153. package/dist/packages/bunshot-auth/src/models/Group.js +22 -0
  154. package/dist/{models → packages/bunshot-auth/src/models}/GroupMembership.d.ts +6 -8
  155. package/dist/packages/bunshot-auth/src/models/GroupMembership.js +19 -0
  156. package/dist/packages/bunshot-auth/src/models/M2MClient.d.ts +18 -0
  157. package/dist/packages/bunshot-auth/src/models/M2MClient.js +18 -0
  158. package/dist/packages/bunshot-auth/src/models/TenantRole.d.ts +13 -0
  159. package/dist/packages/bunshot-auth/src/models/TenantRole.js +17 -0
  160. package/dist/packages/bunshot-auth/src/plugin.d.ts +4 -0
  161. package/dist/packages/bunshot-auth/src/plugin.js +274 -0
  162. package/dist/packages/bunshot-auth/src/routes/auth.d.ts +15 -0
  163. package/dist/packages/bunshot-auth/src/routes/auth.js +1624 -0
  164. package/dist/packages/bunshot-auth/src/routes/groups.d.ts +4 -0
  165. package/dist/packages/bunshot-auth/src/routes/groups.js +481 -0
  166. package/dist/packages/bunshot-auth/src/routes/m2m.d.ts +2 -0
  167. package/dist/packages/bunshot-auth/src/routes/m2m.js +145 -0
  168. package/dist/packages/bunshot-auth/src/routes/mfa.d.ts +6 -0
  169. package/dist/packages/bunshot-auth/src/routes/mfa.js +991 -0
  170. package/dist/packages/bunshot-auth/src/routes/oauth.d.ts +3 -0
  171. package/dist/packages/bunshot-auth/src/routes/oauth.js +1727 -0
  172. package/dist/packages/bunshot-auth/src/routes/oidc.d.ts +2 -0
  173. package/dist/packages/bunshot-auth/src/routes/oidc.js +84 -0
  174. package/dist/packages/bunshot-auth/src/routes/organizations.d.ts +3 -0
  175. package/dist/packages/bunshot-auth/src/routes/organizations.js +741 -0
  176. package/dist/packages/bunshot-auth/src/routes/passkey.d.ts +2 -0
  177. package/dist/packages/bunshot-auth/src/routes/passkey.js +199 -0
  178. package/dist/packages/bunshot-auth/src/routes/saml.d.ts +2 -0
  179. package/dist/packages/bunshot-auth/src/routes/saml.js +226 -0
  180. package/dist/packages/bunshot-auth/src/routes/scim.d.ts +3 -0
  181. package/dist/packages/bunshot-auth/src/routes/scim.js +588 -0
  182. package/dist/packages/bunshot-auth/src/runtime.d.ts +52 -0
  183. package/dist/packages/bunshot-auth/src/runtime.js +11 -0
  184. package/dist/{schemas → packages/bunshot-auth/src/schemas}/auth.d.ts +4 -5
  185. package/dist/packages/bunshot-auth/src/schemas/auth.js +24 -0
  186. package/dist/packages/bunshot-auth/src/schemas/error.d.ts +10 -0
  187. package/dist/packages/bunshot-auth/src/schemas/error.js +10 -0
  188. package/dist/packages/bunshot-auth/src/schemas/success.d.ts +10 -0
  189. package/dist/packages/bunshot-auth/src/schemas/success.js +10 -0
  190. package/dist/packages/bunshot-auth/src/services/auth.d.ts +39 -0
  191. package/dist/packages/bunshot-auth/src/services/auth.js +378 -0
  192. package/dist/{services → packages/bunshot-auth/src/services}/mfa.d.ts +41 -17
  193. package/dist/{services → packages/bunshot-auth/src/services}/mfa.js +259 -183
  194. package/dist/packages/bunshot-auth/src/testing.d.ts +31 -0
  195. package/dist/packages/bunshot-auth/src/testing.js +23 -0
  196. package/dist/packages/bunshot-auth/src/types/adapter.d.ts +1 -0
  197. package/dist/packages/bunshot-auth/src/types/adapter.js +1 -0
  198. package/dist/packages/bunshot-auth/src/types/config.d.ts +152 -0
  199. package/dist/packages/bunshot-auth/src/types/config.js +179 -0
  200. package/dist/{routes → packages/bunshot-auth/src/types}/groups.d.ts +2 -3
  201. package/dist/packages/bunshot-auth/src/types/groups.js +1 -0
  202. package/dist/packages/bunshot-auth/src/types/oauthCode.d.ts +6 -0
  203. package/dist/packages/bunshot-auth/src/types/oauthCode.js +1 -0
  204. package/dist/packages/bunshot-auth/src/types/oauthReauth.d.ts +13 -0
  205. package/dist/packages/bunshot-auth/src/types/oauthReauth.js +1 -0
  206. package/dist/packages/bunshot-auth/src/types/redis.d.ts +1 -0
  207. package/dist/packages/bunshot-auth/src/types/redis.js +1 -0
  208. package/dist/packages/bunshot-auth/src/types/saml.d.ts +10 -0
  209. package/dist/packages/bunshot-auth/src/types/saml.js +1 -0
  210. package/dist/packages/bunshot-auth/src/types/session.d.ts +18 -0
  211. package/dist/packages/bunshot-auth/src/types/session.js +1 -0
  212. package/dist/packages/bunshot-auth/src/types/store.d.ts +1 -0
  213. package/dist/packages/bunshot-auth/src/types/store.js +1 -0
  214. package/dist/packages/bunshot-core/src/adminProvider.d.ts +95 -0
  215. package/dist/packages/bunshot-core/src/adminProvider.js +1 -0
  216. package/dist/packages/bunshot-core/src/auditLog.d.ts +34 -0
  217. package/dist/packages/bunshot-core/src/auditLog.js +1 -0
  218. package/dist/packages/bunshot-core/src/auth-adapter.d.ts +227 -0
  219. package/dist/packages/bunshot-core/src/auth-adapter.js +4 -0
  220. package/dist/packages/bunshot-core/src/authVariables.d.ts +14 -0
  221. package/dist/packages/bunshot-core/src/authVariables.js +4 -0
  222. package/dist/packages/bunshot-core/src/cache.d.ts +12 -0
  223. package/dist/packages/bunshot-core/src/cache.js +21 -0
  224. package/dist/packages/bunshot-core/src/captcha.d.ts +16 -0
  225. package/dist/packages/bunshot-core/src/captcha.js +1 -0
  226. package/dist/packages/bunshot-core/src/clearRegistry.d.ts +6 -0
  227. package/dist/packages/bunshot-core/src/clearRegistry.js +17 -0
  228. package/dist/packages/bunshot-core/src/clientIp.d.ts +3 -0
  229. package/dist/packages/bunshot-core/src/clientIp.js +45 -0
  230. package/dist/packages/bunshot-core/src/configLock.d.ts +4 -0
  231. package/dist/packages/bunshot-core/src/configLock.js +7 -0
  232. package/dist/packages/bunshot-core/src/configValidation.d.ts +22 -0
  233. package/dist/packages/bunshot-core/src/configValidation.js +39 -0
  234. package/dist/packages/bunshot-core/src/constants.js +10 -0
  235. package/dist/packages/bunshot-core/src/context/bunshotContext.d.ts +232 -0
  236. package/dist/packages/bunshot-core/src/context/bunshotContext.js +1 -0
  237. package/dist/packages/bunshot-core/src/context/contextAccess.d.ts +3 -0
  238. package/dist/packages/bunshot-core/src/context/contextAccess.js +16 -0
  239. package/dist/packages/bunshot-core/src/context/contextStore.d.ts +16 -0
  240. package/dist/packages/bunshot-core/src/context/contextStore.js +31 -0
  241. package/dist/packages/bunshot-core/src/context/frameworkConfig.d.ts +38 -0
  242. package/dist/packages/bunshot-core/src/context/frameworkConfig.js +1 -0
  243. package/dist/packages/bunshot-core/src/context/index.d.ts +4 -0
  244. package/dist/packages/bunshot-core/src/context/index.js +2 -0
  245. package/dist/packages/bunshot-core/src/context.d.ts +40 -0
  246. package/dist/packages/bunshot-core/src/context.js +35 -0
  247. package/dist/packages/bunshot-core/src/coreContracts.d.ts +47 -0
  248. package/dist/packages/bunshot-core/src/coreContracts.js +1 -0
  249. package/dist/packages/bunshot-core/src/coreRegistrar.d.ts +6 -0
  250. package/dist/packages/bunshot-core/src/coreRegistrar.js +42 -0
  251. package/dist/{lib → packages/bunshot-core/src}/createRoute.d.ts +4 -30
  252. package/dist/{lib → packages/bunshot-core/src}/createRoute.js +39 -88
  253. package/dist/packages/bunshot-core/src/cronRegistry.d.ts +11 -0
  254. package/dist/packages/bunshot-core/src/cronRegistry.js +1 -0
  255. package/dist/packages/bunshot-core/src/crypto.d.ts +43 -0
  256. package/dist/packages/bunshot-core/src/crypto.js +74 -0
  257. package/dist/packages/bunshot-core/src/csrf.d.ts +8 -0
  258. package/dist/packages/bunshot-core/src/csrf.js +1 -0
  259. package/dist/packages/bunshot-core/src/defaults/defaultFingerprint.d.ts +7 -0
  260. package/dist/packages/bunshot-core/src/defaults/defaultFingerprint.js +19 -0
  261. package/dist/packages/bunshot-core/src/defaults/memoryCacheAdapter.d.ts +6 -0
  262. package/dist/packages/bunshot-core/src/defaults/memoryCacheAdapter.js +40 -0
  263. package/dist/packages/bunshot-core/src/defaults/memoryRateLimit.d.ts +6 -0
  264. package/dist/packages/bunshot-core/src/defaults/memoryRateLimit.js +24 -0
  265. package/dist/packages/bunshot-core/src/emailTemplates.d.ts +5 -0
  266. package/dist/packages/bunshot-core/src/emailTemplates.js +10 -0
  267. package/dist/packages/bunshot-core/src/errors.d.ts +13 -0
  268. package/dist/packages/bunshot-core/src/errors.js +22 -0
  269. package/dist/packages/bunshot-core/src/eventBus.d.ts +270 -0
  270. package/dist/packages/bunshot-core/src/eventBus.js +143 -0
  271. package/dist/packages/bunshot-core/src/idempotency.d.ts +18 -0
  272. package/dist/packages/bunshot-core/src/idempotency.js +1 -0
  273. package/dist/packages/bunshot-core/src/index.d.ts +60 -0
  274. package/dist/packages/bunshot-core/src/index.js +34 -0
  275. package/dist/packages/bunshot-core/src/mail.d.ts +14 -0
  276. package/dist/packages/bunshot-core/src/mail.js +8 -0
  277. package/dist/packages/bunshot-core/src/memoryEviction.d.ts +24 -0
  278. package/dist/packages/bunshot-core/src/memoryEviction.js +52 -0
  279. package/dist/packages/bunshot-core/src/pagination.d.ts +45 -0
  280. package/dist/packages/bunshot-core/src/pagination.js +61 -0
  281. package/dist/packages/bunshot-core/src/permissions.d.ts +64 -0
  282. package/dist/packages/bunshot-core/src/permissions.js +27 -0
  283. package/dist/packages/bunshot-core/src/plugin.d.ts +44 -0
  284. package/dist/packages/bunshot-core/src/plugin.js +1 -0
  285. package/dist/packages/bunshot-core/src/rateLimit.d.ts +5 -0
  286. package/dist/packages/bunshot-core/src/rateLimit.js +18 -0
  287. package/dist/packages/bunshot-core/src/redis.d.ts +21 -0
  288. package/dist/packages/bunshot-core/src/redis.js +1 -0
  289. package/dist/packages/bunshot-core/src/routeAuth.d.ts +5 -0
  290. package/dist/packages/bunshot-core/src/routeAuth.js +11 -0
  291. package/dist/packages/bunshot-core/src/routeOverrides.d.ts +24 -0
  292. package/dist/packages/bunshot-core/src/routeOverrides.js +25 -0
  293. package/dist/packages/bunshot-core/src/routerAdapter.d.ts +6 -0
  294. package/dist/packages/bunshot-core/src/routerAdapter.js +56 -0
  295. package/dist/packages/bunshot-core/src/secrets.d.ts +48 -0
  296. package/dist/packages/bunshot-core/src/secrets.js +8 -0
  297. package/dist/packages/bunshot-core/src/signing.d.ts +41 -0
  298. package/dist/packages/bunshot-core/src/signing.js +1 -0
  299. package/dist/packages/bunshot-core/src/sse.d.ts +36 -0
  300. package/dist/packages/bunshot-core/src/sse.js +1 -0
  301. package/dist/packages/bunshot-core/src/storageAdapter.js +1 -0
  302. package/dist/packages/bunshot-core/src/storeInfra.d.ts +44 -0
  303. package/dist/packages/bunshot-core/src/storeInfra.js +18 -0
  304. package/dist/packages/bunshot-core/src/storeType.d.ts +7 -0
  305. package/dist/packages/bunshot-core/src/storeType.js +1 -0
  306. package/dist/packages/bunshot-core/src/testing.d.ts +1 -0
  307. package/dist/packages/bunshot-core/src/testing.js +1 -0
  308. package/dist/packages/bunshot-core/src/uploadRegistry.d.ts +23 -0
  309. package/dist/packages/bunshot-core/src/uploadRegistry.js +4 -0
  310. package/dist/packages/bunshot-core/src/userResolver.d.ts +5 -0
  311. package/dist/packages/bunshot-core/src/userResolver.js +14 -0
  312. package/dist/packages/bunshot-core/src/wsMessages.d.ts +42 -0
  313. package/dist/packages/bunshot-core/src/wsMessages.js +4 -0
  314. package/dist/packages/bunshot-permissions/src/adapters/memory.d.ts +7 -0
  315. package/dist/packages/bunshot-permissions/src/adapters/memory.js +73 -0
  316. package/dist/packages/bunshot-permissions/src/index.d.ts +10 -0
  317. package/dist/packages/bunshot-permissions/src/index.js +5 -0
  318. package/dist/packages/bunshot-permissions/src/lib/bootstrap.d.ts +7 -0
  319. package/dist/packages/bunshot-permissions/src/lib/bootstrap.js +12 -0
  320. package/dist/packages/bunshot-permissions/src/lib/evaluator.d.ts +10 -0
  321. package/dist/packages/bunshot-permissions/src/lib/evaluator.js +165 -0
  322. package/dist/packages/bunshot-permissions/src/lib/registry.d.ts +2 -0
  323. package/dist/packages/bunshot-permissions/src/lib/registry.js +31 -0
  324. package/dist/packages/bunshot-permissions/src/lib/validation.d.ts +1 -0
  325. package/dist/packages/bunshot-permissions/src/lib/validation.js +1 -0
  326. package/dist/packages/bunshot-permissions/src/types/adapter.d.ts +1 -0
  327. package/dist/packages/bunshot-permissions/src/types/adapter.js +1 -0
  328. package/dist/packages/bunshot-permissions/src/types/evaluator.d.ts +1 -0
  329. package/dist/packages/bunshot-permissions/src/types/evaluator.js +1 -0
  330. package/dist/packages/bunshot-permissions/src/types/models.d.ts +1 -0
  331. package/dist/packages/bunshot-permissions/src/types/models.js +1 -0
  332. package/dist/packages/bunshot-permissions/src/types/registry.d.ts +1 -0
  333. package/dist/packages/bunshot-permissions/src/types/registry.js +1 -0
  334. package/dist/packages/bunshot-postgres/src/adapter.d.ts +6 -0
  335. package/dist/packages/bunshot-postgres/src/adapter.js +794 -0
  336. package/dist/packages/bunshot-postgres/src/connection.d.ts +15 -0
  337. package/dist/packages/bunshot-postgres/src/connection.js +16 -0
  338. package/dist/packages/bunshot-postgres/src/index.d.ts +4 -0
  339. package/dist/packages/bunshot-postgres/src/index.js +2 -0
  340. package/dist/packages/bunshot-postgres/src/schema.d.ts +997 -0
  341. package/dist/packages/bunshot-postgres/src/schema.js +105 -0
  342. package/dist/src/app.d.ts +230 -0
  343. package/dist/src/app.js +182 -0
  344. package/dist/src/cli/commands/init.d.ts +10 -0
  345. package/dist/src/cli/commands/init.js +709 -0
  346. package/dist/src/cli/index.d.ts +1 -0
  347. package/dist/src/cli/index.js +3 -0
  348. package/dist/src/entrypoints/mongo.d.ts +6 -0
  349. package/dist/src/entrypoints/mongo.js +4 -0
  350. package/dist/src/entrypoints/queue.d.ts +2 -0
  351. package/dist/src/entrypoints/queue.js +1 -0
  352. package/dist/src/entrypoints/redis.d.ts +1 -0
  353. package/dist/src/entrypoints/redis.js +1 -0
  354. package/dist/{adapters → src/framework/adapters}/localStorage.d.ts +1 -1
  355. package/dist/{adapters → src/framework/adapters}/localStorage.js +23 -8
  356. package/dist/src/framework/adapters/memoryStorage.d.ts +2 -0
  357. package/dist/src/framework/adapters/memoryStorage.js +45 -0
  358. package/dist/{adapters → src/framework/adapters}/s3Storage.d.ts +1 -1
  359. package/dist/{adapters → src/framework/adapters}/s3Storage.js +12 -12
  360. package/dist/src/framework/admin/bunshotAccess.d.ts +2 -0
  361. package/dist/src/framework/admin/bunshotAccess.js +23 -0
  362. package/dist/src/framework/admin/bunshotUsers.d.ts +2 -0
  363. package/dist/src/framework/admin/bunshotUsers.js +103 -0
  364. package/dist/src/framework/admin/index.d.ts +7 -0
  365. package/dist/src/framework/admin/index.js +21 -0
  366. package/dist/src/framework/boundaryAdapters/cacheFactories.d.ts +13 -0
  367. package/dist/src/framework/boundaryAdapters/cacheFactories.js +86 -0
  368. package/dist/src/framework/boundaryAdapters/index.d.ts +2 -0
  369. package/dist/src/framework/boundaryAdapters/index.js +1 -0
  370. package/dist/src/framework/boundaryAdapters.d.ts +17 -0
  371. package/dist/src/framework/boundaryAdapters.js +62 -0
  372. package/dist/src/framework/buildContext.d.ts +33 -0
  373. package/dist/src/framework/buildContext.js +119 -0
  374. package/dist/src/framework/config/schema.d.ts +447 -0
  375. package/dist/src/framework/config/schema.js +528 -0
  376. package/dist/src/framework/createInfrastructure.d.ts +76 -0
  377. package/dist/src/framework/createInfrastructure.js +221 -0
  378. package/dist/src/framework/lib/auditLog.d.ts +23 -0
  379. package/dist/src/framework/lib/auditLog.js +416 -0
  380. package/dist/src/framework/lib/captcha.d.ts +11 -0
  381. package/dist/src/framework/lib/captcha.js +40 -0
  382. package/dist/{lib → src/framework/lib}/createDtoMapper.js +4 -4
  383. package/dist/src/framework/lib/createRoute.d.ts +1 -0
  384. package/dist/src/framework/lib/createRoute.js +2 -0
  385. package/dist/{lib → src/framework/lib}/idempotency.d.ts +2 -6
  386. package/dist/src/framework/lib/idempotency.js +74 -0
  387. package/dist/src/framework/lib/logger.d.ts +3 -0
  388. package/dist/src/framework/lib/logger.js +14 -0
  389. package/dist/src/framework/lib/metrics.d.ts +34 -0
  390. package/dist/{lib → src/framework/lib}/metrics.js +49 -57
  391. package/dist/src/framework/lib/pagination.d.ts +42 -0
  392. package/dist/src/framework/lib/pagination.js +51 -0
  393. package/dist/src/framework/lib/redisTransport.d.ts +38 -0
  394. package/dist/src/framework/lib/redisTransport.js +107 -0
  395. package/dist/src/framework/lib/resolveUserId.d.ts +2 -0
  396. package/dist/src/framework/lib/resolveUserId.js +5 -0
  397. package/dist/src/framework/lib/sseCollision.d.ts +6 -0
  398. package/dist/src/framework/lib/sseCollision.js +26 -0
  399. package/dist/src/framework/lib/storageAdapter.d.ts +1 -0
  400. package/dist/src/framework/lib/storageAdapter.js +1 -0
  401. package/dist/{lib → src/framework/lib}/stripUnreferencedSchemas.js +4 -4
  402. package/dist/src/framework/lib/tenant.d.ts +21 -0
  403. package/dist/src/framework/lib/tenant.js +70 -0
  404. package/dist/{lib → src/framework/lib}/upload.d.ts +14 -9
  405. package/dist/src/framework/lib/upload.js +132 -0
  406. package/dist/src/framework/lib/uploadRegistry.d.ts +23 -0
  407. package/dist/src/framework/lib/uploadRegistry.js +34 -0
  408. package/dist/{lib → src/framework/lib}/validate.d.ts +1 -1
  409. package/dist/{lib → src/framework/lib}/validate.js +2 -2
  410. package/dist/src/framework/lib/ws.d.ts +19 -0
  411. package/dist/src/framework/lib/ws.js +130 -0
  412. package/dist/src/framework/lib/wsHeartbeat.d.ts +12 -0
  413. package/dist/src/framework/lib/wsHeartbeat.js +53 -0
  414. package/dist/src/framework/lib/wsMessages.d.ts +25 -0
  415. package/dist/src/framework/lib/wsMessages.js +45 -0
  416. package/dist/src/framework/lib/wsNamespace.d.ts +17 -0
  417. package/dist/src/framework/lib/wsNamespace.js +19 -0
  418. package/dist/src/framework/lib/wsPresence.d.ts +17 -0
  419. package/dist/src/framework/lib/wsPresence.js +84 -0
  420. package/dist/src/framework/lib/wsTransport.d.ts +38 -0
  421. package/dist/src/framework/lib/wsTransport.js +9 -0
  422. package/dist/{lib → src/framework/lib}/zodToMongoose.d.ts +1 -1
  423. package/dist/{lib → src/framework/lib}/zodToMongoose.js +11 -11
  424. package/dist/{middleware → src/framework/middleware}/auditLog.d.ts +4 -3
  425. package/dist/src/framework/middleware/auditLog.js +42 -0
  426. package/dist/{middleware → src/framework/middleware}/botProtection.d.ts +2 -2
  427. package/dist/{middleware → src/framework/middleware}/botProtection.js +8 -9
  428. package/dist/src/framework/middleware/cacheResponse.d.ts +35 -0
  429. package/dist/src/framework/middleware/cacheResponse.js +126 -0
  430. package/dist/src/framework/middleware/captcha.d.ts +9 -0
  431. package/dist/src/framework/middleware/captcha.js +37 -0
  432. package/dist/{middleware → src/framework/middleware}/errorHandler.d.ts +1 -1
  433. package/dist/src/framework/middleware/errorHandler.js +16 -0
  434. package/dist/src/framework/middleware/index.js +1 -0
  435. package/dist/{middleware → src/framework/middleware}/logger.d.ts +1 -1
  436. package/dist/src/framework/middleware/metrics.d.ts +12 -0
  437. package/dist/src/framework/middleware/metrics.js +26 -0
  438. package/dist/{middleware → src/framework/middleware}/rateLimit.d.ts +2 -2
  439. package/dist/src/framework/middleware/rateLimit.js +22 -0
  440. package/dist/src/framework/middleware/requestId.d.ts +3 -0
  441. package/dist/{middleware → src/framework/middleware}/requestId.js +2 -2
  442. package/dist/{middleware → src/framework/middleware}/requestLogger.d.ts +3 -3
  443. package/dist/{middleware → src/framework/middleware}/requestLogger.js +17 -12
  444. package/dist/{middleware → src/framework/middleware}/requestSigning.d.ts +2 -2
  445. package/dist/{middleware → src/framework/middleware}/requestSigning.js +18 -19
  446. package/dist/src/framework/middleware/tenant.d.ts +14 -0
  447. package/dist/{middleware → src/framework/middleware}/tenant.js +31 -27
  448. package/dist/src/framework/middleware/upload.d.ts +5 -0
  449. package/dist/{middleware → src/framework/middleware}/upload.js +4 -4
  450. package/dist/{middleware → src/framework/middleware}/webhookAuth.d.ts +3 -3
  451. package/dist/{middleware → src/framework/middleware}/webhookAuth.js +11 -11
  452. package/dist/src/framework/models/AuditLog.d.ts +21 -0
  453. package/dist/src/framework/models/AuditLog.js +31 -0
  454. package/dist/src/framework/mountMiddleware.d.ts +91 -0
  455. package/dist/src/framework/mountMiddleware.js +128 -0
  456. package/dist/src/framework/mountOptionalEndpoints.d.ts +103 -0
  457. package/dist/src/framework/mountOptionalEndpoints.js +47 -0
  458. package/dist/src/framework/mountRoutes.d.ts +21 -0
  459. package/dist/src/framework/mountRoutes.js +144 -0
  460. package/dist/src/framework/persistence/cronRegistry.d.ts +28 -0
  461. package/dist/src/framework/persistence/cronRegistry.js +139 -0
  462. package/dist/src/framework/persistence/idempotency.d.ts +26 -0
  463. package/dist/src/framework/persistence/idempotency.js +178 -0
  464. package/dist/src/framework/persistence/index.d.ts +6 -0
  465. package/dist/src/framework/persistence/index.js +8 -0
  466. package/dist/src/framework/persistence/storeInfra.d.ts +9 -0
  467. package/dist/src/framework/persistence/storeInfra.js +1 -0
  468. package/dist/src/framework/persistence/uploadRegistry.d.ts +35 -0
  469. package/dist/src/framework/persistence/uploadRegistry.js +235 -0
  470. package/dist/src/framework/persistence/wsMessages.d.ts +22 -0
  471. package/dist/src/framework/persistence/wsMessages.js +296 -0
  472. package/dist/src/framework/preloadSchemas.d.ts +24 -0
  473. package/dist/src/framework/preloadSchemas.js +42 -0
  474. package/dist/src/framework/registerBoundaryAdapters.d.ts +23 -0
  475. package/dist/src/framework/registerBoundaryAdapters.js +46 -0
  476. package/dist/src/framework/routes/admin.d.ts +9 -0
  477. package/dist/src/framework/routes/admin.js +361 -0
  478. package/dist/src/framework/routes/health.d.ts +1 -0
  479. package/dist/src/framework/routes/health.js +21 -0
  480. package/dist/src/framework/routes/home.d.ts +1 -0
  481. package/dist/src/framework/routes/home.js +18 -0
  482. package/dist/src/framework/routes/jobs.d.ts +3 -0
  483. package/dist/src/framework/routes/jobs.js +315 -0
  484. package/dist/src/framework/routes/metrics.d.ts +10 -0
  485. package/dist/src/framework/routes/metrics.js +57 -0
  486. package/dist/src/framework/routes/uploads.d.ts +14 -0
  487. package/dist/src/framework/routes/uploads.js +262 -0
  488. package/dist/src/framework/runPluginLifecycle.d.ts +27 -0
  489. package/dist/src/framework/runPluginLifecycle.js +121 -0
  490. package/dist/src/framework/secrets/frameworkSecretSchema.d.ts +58 -0
  491. package/dist/src/framework/secrets/frameworkSecretSchema.js +20 -0
  492. package/dist/src/framework/secrets/index.d.ts +9 -0
  493. package/dist/src/framework/secrets/index.js +7 -0
  494. package/dist/src/framework/secrets/providers/envProvider.d.ts +15 -0
  495. package/dist/src/framework/secrets/providers/envProvider.js +18 -0
  496. package/dist/src/framework/secrets/providers/fileProvider.d.ts +8 -0
  497. package/dist/src/framework/secrets/providers/fileProvider.js +82 -0
  498. package/dist/src/framework/secrets/providers/ssmProvider.d.ts +20 -0
  499. package/dist/src/framework/secrets/providers/ssmProvider.js +127 -0
  500. package/dist/src/framework/secrets/resolveSecretBundle.d.ts +53 -0
  501. package/dist/src/framework/secrets/resolveSecretBundle.js +84 -0
  502. package/dist/src/framework/secrets/resolveSecrets.d.ts +18 -0
  503. package/dist/src/framework/secrets/resolveSecrets.js +34 -0
  504. package/dist/src/framework/sse/index.d.ts +21 -0
  505. package/dist/src/framework/sse/index.js +109 -0
  506. package/dist/src/framework/ws/index.d.ts +11 -0
  507. package/dist/src/framework/ws/index.js +8 -0
  508. package/dist/src/index.d.ts +87 -0
  509. package/dist/src/index.js +58 -0
  510. package/dist/src/lib/appConfig.d.ts +7 -0
  511. package/dist/src/lib/appConfig.js +27 -0
  512. package/dist/src/lib/appMeta.d.ts +7 -0
  513. package/dist/src/lib/appMeta.js +3 -0
  514. package/dist/src/lib/authConfig.d.ts +532 -0
  515. package/dist/src/lib/authConfig.js +179 -0
  516. package/dist/{lib → src/lib}/context.d.ts +6 -7
  517. package/dist/{lib → src/lib}/context.js +5 -5
  518. package/dist/src/lib/logger.d.ts +1 -0
  519. package/dist/src/lib/logger.js +1 -0
  520. package/dist/src/lib/mongo.d.ts +58 -0
  521. package/dist/src/lib/mongo.js +96 -0
  522. package/dist/src/lib/queue.d.ts +72 -0
  523. package/dist/src/lib/queue.js +152 -0
  524. package/dist/src/lib/redis.d.ts +28 -0
  525. package/dist/src/lib/redis.js +72 -0
  526. package/dist/{lib → src/lib}/signing.d.ts +2 -2
  527. package/dist/src/lib/signing.js +210 -0
  528. package/dist/src/lib/signingConfig.d.ts +40 -0
  529. package/dist/src/lib/signingConfig.js +28 -0
  530. package/dist/src/server.d.ts +146 -0
  531. package/dist/src/server.js +469 -0
  532. package/dist/src/shared/lib/HttpError.d.ts +1 -0
  533. package/dist/src/shared/lib/HttpError.js +2 -0
  534. package/dist/src/shared/lib/constants.d.ts +10 -0
  535. package/dist/src/shared/lib/crypto.d.ts +43 -0
  536. package/dist/src/shared/lib/crypto.js +74 -0
  537. package/dist/src/shared/lib/signing.d.ts +52 -0
  538. package/dist/{lib → src/shared/lib}/signing.js +40 -10
  539. package/dist/src/testing.d.ts +34 -0
  540. package/dist/src/testing.js +93 -0
  541. package/package.json +62 -25
  542. package/dist/adapters/memoryAuth.d.ts +0 -46
  543. package/dist/adapters/memoryAuth.js +0 -634
  544. package/dist/adapters/memoryStorage.d.ts +0 -3
  545. package/dist/adapters/memoryStorage.js +0 -44
  546. package/dist/adapters/mongoAuth.d.ts +0 -2
  547. package/dist/adapters/mongoAuth.js +0 -307
  548. package/dist/adapters/sqliteAuth.d.ts +0 -49
  549. package/dist/adapters/sqliteAuth.js +0 -707
  550. package/dist/app.d.ts +0 -456
  551. package/dist/app.js +0 -548
  552. package/dist/entrypoints/mongo.d.ts +0 -5
  553. package/dist/entrypoints/mongo.js +0 -4
  554. package/dist/entrypoints/queue.d.ts +0 -2
  555. package/dist/entrypoints/queue.js +0 -1
  556. package/dist/entrypoints/redis.d.ts +0 -1
  557. package/dist/entrypoints/redis.js +0 -1
  558. package/dist/index.d.ts +0 -98
  559. package/dist/index.js +0 -77
  560. package/dist/lib/HttpError.d.ts +0 -9
  561. package/dist/lib/HttpError.js +0 -14
  562. package/dist/lib/appConfig.d.ts +0 -162
  563. package/dist/lib/appConfig.js +0 -83
  564. package/dist/lib/auditLog.d.ts +0 -52
  565. package/dist/lib/auditLog.js +0 -201
  566. package/dist/lib/authAdapter.d.ts +0 -176
  567. package/dist/lib/authAdapter.js +0 -7
  568. package/dist/lib/authRateLimit.d.ts +0 -13
  569. package/dist/lib/authRateLimit.js +0 -81
  570. package/dist/lib/clientIp.d.ts +0 -14
  571. package/dist/lib/crypto.d.ts +0 -11
  572. package/dist/lib/crypto.js +0 -22
  573. package/dist/lib/deletionCancelToken.d.ts +0 -12
  574. package/dist/lib/deletionCancelToken.js +0 -88
  575. package/dist/lib/emailVerification.d.ts +0 -13
  576. package/dist/lib/emailVerification.js +0 -86
  577. package/dist/lib/fingerprint.js +0 -36
  578. package/dist/lib/idempotency.js +0 -182
  579. package/dist/lib/jwt.d.ts +0 -2
  580. package/dist/lib/jwt.js +0 -24
  581. package/dist/lib/logger.d.ts +0 -1
  582. package/dist/lib/logger.js +0 -7
  583. package/dist/lib/metrics.d.ts +0 -14
  584. package/dist/lib/mfaChallenge.d.ts +0 -42
  585. package/dist/lib/mfaChallenge.js +0 -293
  586. package/dist/lib/mongo.d.ts +0 -39
  587. package/dist/lib/mongo.js +0 -124
  588. package/dist/lib/oauth.d.ts +0 -40
  589. package/dist/lib/oauth.js +0 -101
  590. package/dist/lib/oauthCode.d.ts +0 -15
  591. package/dist/lib/oauthCode.js +0 -90
  592. package/dist/lib/pagination.d.ts +0 -119
  593. package/dist/lib/pagination.js +0 -166
  594. package/dist/lib/queue.d.ts +0 -37
  595. package/dist/lib/queue.js +0 -117
  596. package/dist/lib/redis.d.ts +0 -9
  597. package/dist/lib/redis.js +0 -61
  598. package/dist/lib/resetPassword.d.ts +0 -12
  599. package/dist/lib/resetPassword.js +0 -91
  600. package/dist/lib/roles.d.ts +0 -7
  601. package/dist/lib/roles.js +0 -49
  602. package/dist/lib/session.d.ts +0 -39
  603. package/dist/lib/session.js +0 -535
  604. package/dist/lib/tenant.d.ts +0 -15
  605. package/dist/lib/tenant.js +0 -65
  606. package/dist/lib/upload.js +0 -87
  607. package/dist/lib/ws.d.ts +0 -22
  608. package/dist/lib/ws.js +0 -89
  609. package/dist/lib/wsHeartbeat.d.ts +0 -12
  610. package/dist/lib/wsHeartbeat.js +0 -57
  611. package/dist/lib/wsMessages.d.ts +0 -40
  612. package/dist/lib/wsMessages.js +0 -330
  613. package/dist/lib/wsPresence.d.ts +0 -25
  614. package/dist/lib/wsPresence.js +0 -99
  615. package/dist/middleware/auditLog.js +0 -39
  616. package/dist/middleware/bearerAuth.d.ts +0 -2
  617. package/dist/middleware/bearerAuth.js +0 -11
  618. package/dist/middleware/cacheResponse.d.ts +0 -15
  619. package/dist/middleware/cacheResponse.js +0 -178
  620. package/dist/middleware/csrf.js +0 -125
  621. package/dist/middleware/errorHandler.js +0 -13
  622. package/dist/middleware/identify.d.ts +0 -3
  623. package/dist/middleware/identify.js +0 -95
  624. package/dist/middleware/index.js +0 -1
  625. package/dist/middleware/metrics.d.ts +0 -9
  626. package/dist/middleware/metrics.js +0 -26
  627. package/dist/middleware/rateLimit.js +0 -22
  628. package/dist/middleware/requestId.d.ts +0 -3
  629. package/dist/middleware/tenant.d.ts +0 -5
  630. package/dist/middleware/upload.d.ts +0 -5
  631. package/dist/middleware/userAuth.d.ts +0 -3
  632. package/dist/middleware/userAuth.js +0 -6
  633. package/dist/models/AuditLog.d.ts +0 -30
  634. package/dist/models/AuditLog.js +0 -39
  635. package/dist/models/AuthUser.js +0 -48
  636. package/dist/models/Group.d.ts +0 -21
  637. package/dist/models/Group.js +0 -28
  638. package/dist/models/GroupMembership.js +0 -25
  639. package/dist/models/TenantRole.d.ts +0 -15
  640. package/dist/models/TenantRole.js +0 -23
  641. package/dist/routes/auth.d.ts +0 -11
  642. package/dist/routes/auth.js +0 -605
  643. package/dist/routes/groups.js +0 -346
  644. package/dist/routes/health.d.ts +0 -1
  645. package/dist/routes/health.js +0 -22
  646. package/dist/routes/home.d.ts +0 -1
  647. package/dist/routes/home.js +0 -16
  648. package/dist/routes/jobs.d.ts +0 -2
  649. package/dist/routes/jobs.js +0 -272
  650. package/dist/routes/metrics.d.ts +0 -7
  651. package/dist/routes/metrics.js +0 -52
  652. package/dist/routes/mfa.d.ts +0 -5
  653. package/dist/routes/mfa.js +0 -620
  654. package/dist/routes/oauth.d.ts +0 -2
  655. package/dist/routes/oauth.js +0 -514
  656. package/dist/routes/uploads.d.ts +0 -2
  657. package/dist/routes/uploads.js +0 -135
  658. package/dist/schemas/auth.js +0 -30
  659. package/dist/server.d.ts +0 -57
  660. package/dist/server.js +0 -112
  661. package/dist/services/auth.d.ts +0 -27
  662. package/dist/services/auth.js +0 -159
  663. package/dist/ws/index.d.ts +0 -10
  664. package/dist/ws/index.js +0 -38
  665. package/docs/sections/adding-middleware/full.md +0 -35
  666. package/docs/sections/adding-models/full.md +0 -125
  667. package/docs/sections/adding-models/overview.md +0 -13
  668. package/docs/sections/adding-routes/full.md +0 -182
  669. package/docs/sections/adding-routes/overview.md +0 -23
  670. package/docs/sections/auth-flow/full.md +0 -779
  671. package/docs/sections/auth-flow/overview.md +0 -10
  672. package/docs/sections/auth-security-examples/full.md +0 -365
  673. package/docs/sections/authentication/full.md +0 -130
  674. package/docs/sections/authentication/overview.md +0 -5
  675. package/docs/sections/cli/full.md +0 -42
  676. package/docs/sections/configuration/full.md +0 -172
  677. package/docs/sections/configuration/overview.md +0 -18
  678. package/docs/sections/configuration-example/full.md +0 -117
  679. package/docs/sections/configuration-example/overview.md +0 -30
  680. package/docs/sections/documentation/full.md +0 -171
  681. package/docs/sections/environment-variables/full.md +0 -55
  682. package/docs/sections/exports/full.md +0 -123
  683. package/docs/sections/extending-context/full.md +0 -59
  684. package/docs/sections/header.md +0 -3
  685. package/docs/sections/installation/full.md +0 -6
  686. package/docs/sections/jobs/full.md +0 -140
  687. package/docs/sections/jobs/overview.md +0 -15
  688. package/docs/sections/logging/full.md +0 -83
  689. package/docs/sections/metrics/full.md +0 -127
  690. package/docs/sections/mongodb-connections/full.md +0 -45
  691. package/docs/sections/mongodb-connections/overview.md +0 -7
  692. package/docs/sections/multi-tenancy/full.md +0 -66
  693. package/docs/sections/multi-tenancy/overview.md +0 -15
  694. package/docs/sections/oauth/full.md +0 -189
  695. package/docs/sections/oauth/overview.md +0 -16
  696. package/docs/sections/package-development/full.md +0 -7
  697. package/docs/sections/pagination/full.md +0 -93
  698. package/docs/sections/peer-dependencies/full.md +0 -47
  699. package/docs/sections/quick-start/full.md +0 -43
  700. package/docs/sections/response-caching/full.md +0 -117
  701. package/docs/sections/response-caching/overview.md +0 -13
  702. package/docs/sections/roles/full.md +0 -225
  703. package/docs/sections/roles/overview.md +0 -14
  704. package/docs/sections/running-without-redis/full.md +0 -16
  705. package/docs/sections/running-without-redis-or-mongodb/full.md +0 -60
  706. package/docs/sections/signing/full.md +0 -203
  707. package/docs/sections/stack/full.md +0 -10
  708. package/docs/sections/uploads/full.md +0 -199
  709. package/docs/sections/versioning/full.md +0 -85
  710. package/docs/sections/webhook-auth/full.md +0 -100
  711. package/docs/sections/websocket/full.md +0 -184
  712. package/docs/sections/websocket/overview.md +0 -5
  713. package/docs/sections/websocket-rooms/full.md +0 -102
  714. package/docs/sections/websocket-rooms/overview.md +0 -5
  715. /package/dist/{lib/storageAdapter.js → packages/bunshot-admin/src/types/env.js} +0 -0
  716. /package/dist/{lib → packages/bunshot-auth/src/lib}/fingerprint.d.ts +0 -0
  717. /package/dist/{lib → packages/bunshot-core/src}/constants.d.ts +0 -0
  718. /package/dist/{lib → packages/bunshot-core/src}/storageAdapter.d.ts +0 -0
  719. /package/dist/{lib → src/framework/lib}/createDtoMapper.d.ts +0 -0
  720. /package/dist/{lib → src/framework/lib}/stripUnreferencedSchemas.d.ts +0 -0
  721. /package/dist/{middleware → src/framework/middleware}/cors.d.ts +0 -0
  722. /package/dist/{middleware → src/framework/middleware}/cors.js +0 -0
  723. /package/dist/{middleware → src/framework/middleware}/index.d.ts +0 -0
  724. /package/dist/{middleware → src/framework/middleware}/logger.js +0 -0
  725. /package/dist/{lib → src/shared/lib}/constants.js +0 -0
@@ -1,87 +0,0 @@
1
- import { HttpError } from "./HttpError";
2
- import { extname } from "node:path";
3
- let _adapter = null;
4
- let _config = {};
5
- export const setStorageAdapter = (adapter) => { _adapter = adapter; };
6
- export const getStorageAdapter = () => _adapter;
7
- export const setUploadConfig = (config) => { _config = config; };
8
- export const getUploadConfig = () => _config;
9
- export const generateUploadKey = (file, ctx, opts) => {
10
- const merged = { ..._config, ...opts };
11
- if (merged.generateKey)
12
- return merged.generateKey(file, ctx);
13
- const ext = extname(file.name);
14
- const uuid = crypto.randomUUID();
15
- const prefix = merged.keyPrefix ?? "uploads/";
16
- const tenantPrefix = merged.tenantScopedKeys && ctx.tenantId ? `${ctx.tenantId}/` : "";
17
- return `${prefix}${tenantPrefix}${uuid}${ext}`;
18
- };
19
- const mimeMatches = (mimeType, pattern) => {
20
- if (pattern.endsWith("/*")) {
21
- return mimeType.startsWith(pattern.slice(0, -1));
22
- }
23
- return mimeType === pattern;
24
- };
25
- export const validateFile = (file, opts) => {
26
- const maxFileSize = opts.maxFileSize ?? _config.maxFileSize ?? 10 * 1024 * 1024;
27
- if (file.size > maxFileSize) {
28
- return `File "${file.name}" exceeds maximum size of ${maxFileSize} bytes`;
29
- }
30
- const allowedMimeTypes = opts.allowedMimeTypes ?? _config.allowedMimeTypes;
31
- if (allowedMimeTypes && allowedMimeTypes.length > 0) {
32
- const allowed = allowedMimeTypes.some((pattern) => mimeMatches(file.type, pattern));
33
- if (!allowed) {
34
- return `File "${file.name}" has disallowed MIME type "${file.type}"`;
35
- }
36
- }
37
- return null;
38
- };
39
- export const processUpload = async (file, opts) => {
40
- const adapter = _adapter;
41
- if (!adapter)
42
- throw new HttpError(500, "No storage adapter configured");
43
- const validationError = validateFile(file, opts);
44
- if (validationError)
45
- throw new HttpError(400, validationError);
46
- const key = generateUploadKey(file, opts.ctx ?? {}, opts);
47
- const { url } = await adapter.put(key, file, {
48
- mimeType: file.type,
49
- size: file.size,
50
- bucket: opts.bucket,
51
- });
52
- return {
53
- key,
54
- originalName: file.name,
55
- mimeType: file.type,
56
- size: file.size,
57
- ...(url !== undefined ? { url } : {}),
58
- };
59
- };
60
- export const parseUpload = async (c, opts) => {
61
- const merged = { ..._config, ...opts };
62
- const fields = merged.field
63
- ? (Array.isArray(merged.field) ? merged.field : [merged.field])
64
- : ["file"];
65
- const maxFiles = merged.maxFiles ?? 10;
66
- const body = await c.req.parseBody({ all: true });
67
- const results = [];
68
- const userId = c.get("authUserId") ?? undefined;
69
- const tenantId = c.get("tenantId") ?? undefined;
70
- const bucket = c.get("uploadBucket");
71
- for (const field of fields) {
72
- const raw = body[field];
73
- if (!raw)
74
- continue;
75
- const files = Array.isArray(raw) ? raw : [raw];
76
- for (const f of files) {
77
- if (!(f instanceof File))
78
- continue;
79
- if (results.length >= maxFiles) {
80
- throw new HttpError(400, `Too many files. Maximum is ${maxFiles}`);
81
- }
82
- const result = await processUpload(f, { ...merged, ctx: { userId, tenantId }, bucket: bucket ?? undefined });
83
- results.push(result);
84
- }
85
- }
86
- return results;
87
- };
package/dist/lib/ws.d.ts DELETED
@@ -1,22 +0,0 @@
1
- import type { Server, ServerWebSocket } from "bun";
2
- type WithRooms = {
3
- rooms: Set<string>;
4
- };
5
- type WithSocketId = {
6
- id: string;
7
- } & WithRooms;
8
- export declare const setWsServer: (server: Server<any>) => void;
9
- export declare const setPresenceEnabled: (enabled: boolean) => void;
10
- export declare const publish: (topic: string, data: unknown) => void;
11
- /** All rooms that currently have at least one subscriber */
12
- export declare const getRooms: () => string[];
13
- /** Socket IDs subscribed to a given room */
14
- export declare const getRoomSubscribers: (room: string) => string[];
15
- type RoomGuard<T extends WithRooms> = (ws: ServerWebSocket<T>, room: string) => boolean | Promise<boolean>;
16
- export declare const handleRoomActions: <T extends WithSocketId>(ws: ServerWebSocket<T>, message: string | Buffer, onSubscribe?: RoomGuard<T>) => Promise<boolean>;
17
- export declare const subscribe: <T extends WithSocketId>(ws: ServerWebSocket<T>, room: string) => void;
18
- export declare const unsubscribe: <T extends WithSocketId>(ws: ServerWebSocket<T>, room: string) => void;
19
- export declare const getSubscriptions: <T extends WithRooms>(ws: ServerWebSocket<T>) => string[];
20
- /** Called on socket close to prune the registry. Internal use only. */
21
- export declare const cleanupSocket: (socketId: string, rooms: Set<string>) => void;
22
- export {};
package/dist/lib/ws.js DELETED
@@ -1,89 +0,0 @@
1
- import { addPresence, removePresence, cleanupPresence } from "./wsPresence";
2
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
3
- let _server = null;
4
- let _presenceEnabled = false;
5
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
6
- export const setWsServer = (server) => { _server = server; };
7
- export const setPresenceEnabled = (enabled) => { _presenceEnabled = enabled; };
8
- export const publish = (topic, data) => {
9
- _server?.publish(topic, JSON.stringify(data));
10
- };
11
- /** room → Set of socket IDs */
12
- const _roomRegistry = new Map();
13
- /** All rooms that currently have at least one subscriber */
14
- export const getRooms = () => [..._roomRegistry.keys()];
15
- /** Socket IDs subscribed to a given room */
16
- export const getRoomSubscribers = (room) => [...(_roomRegistry.get(room) ?? [])];
17
- const MAX_ROOM_ACTION_SIZE = 4096; // 4 KB — room actions are small JSON payloads
18
- export const handleRoomActions = async (ws, message, onSubscribe) => {
19
- try {
20
- const raw = typeof message === "string" ? message : Buffer.from(message).toString();
21
- if (raw.length > MAX_ROOM_ACTION_SIZE)
22
- return false; // not a room action
23
- const data = JSON.parse(raw);
24
- if (data.action === "subscribe" && typeof data.room === "string") {
25
- if (onSubscribe && !(await onSubscribe(ws, data.room))) {
26
- ws.send(JSON.stringify({ event: "subscribe_denied", room: data.room }));
27
- }
28
- else {
29
- subscribe(ws, data.room);
30
- ws.send(JSON.stringify({ event: "subscribed", room: data.room }));
31
- }
32
- return true;
33
- }
34
- if (data.action === "unsubscribe" && typeof data.room === "string") {
35
- unsubscribe(ws, data.room);
36
- ws.send(JSON.stringify({ event: "unsubscribed", room: data.room }));
37
- return true;
38
- }
39
- }
40
- catch { /* not JSON */ }
41
- return false;
42
- };
43
- export const subscribe = (ws, room) => {
44
- ws.subscribe(room);
45
- ws.data.rooms.add(room);
46
- if (!_roomRegistry.has(room))
47
- _roomRegistry.set(room, new Set());
48
- _roomRegistry.get(room).add(ws.data.id);
49
- if (_presenceEnabled) {
50
- const result = addPresence(ws.data.id, room);
51
- if (result?.isNewUser) {
52
- publish(room, { event: "presence_join", room, userId: result.userId });
53
- }
54
- }
55
- };
56
- export const unsubscribe = (ws, room) => {
57
- ws.unsubscribe(room);
58
- ws.data.rooms.delete(room);
59
- const ids = _roomRegistry.get(room);
60
- if (ids) {
61
- ids.delete(ws.data.id);
62
- if (ids.size === 0)
63
- _roomRegistry.delete(room);
64
- }
65
- if (_presenceEnabled) {
66
- const result = removePresence(ws.data.id, room);
67
- if (result?.isLastSocket) {
68
- publish(room, { event: "presence_leave", room, userId: result.userId });
69
- }
70
- }
71
- };
72
- export const getSubscriptions = (ws) => [...ws.data.rooms];
73
- /** Called on socket close to prune the registry. Internal use only. */
74
- export const cleanupSocket = (socketId, rooms) => {
75
- if (_presenceEnabled) {
76
- const departed = cleanupPresence(socketId, rooms);
77
- for (const { room, userId } of departed) {
78
- publish(room, { event: "presence_leave", room, userId });
79
- }
80
- }
81
- for (const room of rooms) {
82
- const ids = _roomRegistry.get(room);
83
- if (ids) {
84
- ids.delete(socketId);
85
- if (ids.size === 0)
86
- _roomRegistry.delete(room);
87
- }
88
- }
89
- };
@@ -1,12 +0,0 @@
1
- import type { ServerWebSocket } from "bun";
2
- export interface HeartbeatConfig {
3
- intervalMs?: number;
4
- timeoutMs?: number;
5
- }
6
- export declare const registerSocket: (ws: ServerWebSocket<any>, id: string) => void;
7
- export declare const deregisterSocket: (id: string) => void;
8
- export declare const handlePong: (id: string) => void;
9
- export declare const startHeartbeat: (config?: HeartbeatConfig | boolean) => void;
10
- export declare const stopHeartbeat: () => void;
11
- /** Reset all heartbeat state. Useful for test isolation. */
12
- export declare const clearHeartbeatState: () => void;
@@ -1,57 +0,0 @@
1
- // ---------------------------------------------------------------------------
2
- // State
3
- // ---------------------------------------------------------------------------
4
- /** All live sockets — socketId → ServerWebSocket */
5
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
6
- const _activeSockets = new Map();
7
- /** socketId → last pong timestamp (epoch ms) */
8
- const _lastPong = new Map();
9
- let _pingInterval = null;
10
- const DEFAULT_INTERVAL_MS = 30_000;
11
- const DEFAULT_TIMEOUT_MS = 10_000;
12
- // ---------------------------------------------------------------------------
13
- // Public API
14
- // ---------------------------------------------------------------------------
15
- export const registerSocket = (ws, id) => {
16
- _activeSockets.set(id, ws);
17
- _lastPong.set(id, Date.now());
18
- };
19
- export const deregisterSocket = (id) => {
20
- _activeSockets.delete(id);
21
- _lastPong.delete(id);
22
- };
23
- export const handlePong = (id) => {
24
- _lastPong.set(id, Date.now());
25
- };
26
- export const startHeartbeat = (config) => {
27
- if (_pingInterval)
28
- return; // already running
29
- const opts = typeof config === "object" ? config : {};
30
- const intervalMs = opts.intervalMs ?? DEFAULT_INTERVAL_MS;
31
- const timeoutMs = opts.timeoutMs ?? DEFAULT_TIMEOUT_MS;
32
- _pingInterval = setInterval(() => {
33
- const now = Date.now();
34
- for (const [id, ws] of _activeSockets) {
35
- const lastPong = _lastPong.get(id) ?? 0;
36
- if (now - lastPong > timeoutMs) {
37
- ws.close(1001, "Heartbeat timeout");
38
- // deregisterSocket will be called by the close handler
39
- }
40
- else {
41
- ws.ping();
42
- }
43
- }
44
- }, intervalMs);
45
- };
46
- export const stopHeartbeat = () => {
47
- if (_pingInterval) {
48
- clearInterval(_pingInterval);
49
- _pingInterval = null;
50
- }
51
- };
52
- /** Reset all heartbeat state. Useful for test isolation. */
53
- export const clearHeartbeatState = () => {
54
- stopHeartbeat();
55
- _activeSockets.clear();
56
- _lastPong.clear();
57
- };
@@ -1,40 +0,0 @@
1
- export interface StoredMessage {
2
- id: string;
3
- room: string;
4
- senderId: string | null;
5
- payload: unknown;
6
- createdAt: number;
7
- }
8
- export type WsMessageStore = "redis" | "mongo" | "sqlite" | "memory";
9
- export interface WsMessageDefaults {
10
- maxCount?: number;
11
- ttlSeconds?: number;
12
- }
13
- export interface RoomPersistenceConfig {
14
- persist: boolean;
15
- maxCount?: number;
16
- ttlSeconds?: number;
17
- }
18
- export declare const setWsMessageStore: (store: WsMessageStore) => void;
19
- export declare const setWsMessageDefaults: (defaults: WsMessageDefaults) => void;
20
- /** Opt a room into message persistence. */
21
- export declare const configureRoom: (room: string, options: RoomPersistenceConfig) => void;
22
- /**
23
- * Persist a message to a room. Returns null if room is not configured for persistence.
24
- * On store errors, logs a warning and returns null (non-blocking).
25
- */
26
- export declare const persistMessage: (room: string, data: {
27
- senderId?: string | null;
28
- payload: unknown;
29
- }) => Promise<StoredMessage | null>;
30
- /**
31
- * Get message history for a room.
32
- * Cursor-based pagination using message `id` as cursor.
33
- */
34
- export declare const getMessageHistory: (room: string, opts?: {
35
- limit?: number;
36
- before?: string;
37
- after?: string;
38
- }) => Promise<StoredMessage[]>;
39
- /** Reset memory store. Useful for test isolation. */
40
- export declare const clearWsMessageMemoryStore: () => void;
@@ -1,330 +0,0 @@
1
- // ---------------------------------------------------------------------------
2
- // Types
3
- // ---------------------------------------------------------------------------
4
- // ---------------------------------------------------------------------------
5
- // State
6
- // ---------------------------------------------------------------------------
7
- const DEFAULT_MAX_COUNT = 100;
8
- const DEFAULT_TTL_SECONDS = 86_400; // 24 hours
9
- let _store = "memory";
10
- let _defaults = { maxCount: DEFAULT_MAX_COUNT, ttlSeconds: DEFAULT_TTL_SECONDS };
11
- const _roomConfigs = new Map();
12
- // Memory store
13
- const _memoryMessages = new Map();
14
- // SQLite trim counters — tracks inserts since last trim per room.
15
- // Resets on server restart; rooms may temporarily exceed maxCount by up to trimInterval rows.
16
- // This is a soft cap by design to avoid a DELETE on every INSERT under high throughput.
17
- const _sqliteTrimCounters = new Map();
18
- // ---------------------------------------------------------------------------
19
- // Configuration
20
- // ---------------------------------------------------------------------------
21
- export const setWsMessageStore = (store) => { _store = store; };
22
- export const setWsMessageDefaults = (defaults) => {
23
- _defaults = {
24
- maxCount: defaults.maxCount ?? DEFAULT_MAX_COUNT,
25
- ttlSeconds: defaults.ttlSeconds ?? DEFAULT_TTL_SECONDS,
26
- };
27
- };
28
- /** Opt a room into message persistence. */
29
- export const configureRoom = (room, options) => {
30
- if (!options.persist) {
31
- _roomConfigs.delete(room);
32
- return;
33
- }
34
- _roomConfigs.set(room, {
35
- maxCount: options.maxCount ?? _defaults.maxCount,
36
- ttlSeconds: options.ttlSeconds ?? _defaults.ttlSeconds,
37
- });
38
- };
39
- // ---------------------------------------------------------------------------
40
- // Public API
41
- // ---------------------------------------------------------------------------
42
- /**
43
- * Persist a message to a room. Returns null if room is not configured for persistence.
44
- * On store errors, logs a warning and returns null (non-blocking).
45
- */
46
- export const persistMessage = async (room, data) => {
47
- const config = _roomConfigs.get(room);
48
- if (!config)
49
- return null;
50
- const message = {
51
- id: crypto.randomUUID(),
52
- room,
53
- senderId: data.senderId ?? null,
54
- payload: data.payload,
55
- createdAt: Date.now(),
56
- };
57
- try {
58
- switch (_store) {
59
- case "memory":
60
- return memoryPersist(message, config);
61
- case "redis":
62
- return await redisPersist(message, config);
63
- case "mongo":
64
- return await mongoPersist(message, config);
65
- case "sqlite":
66
- return sqlitePersist(message, config);
67
- }
68
- }
69
- catch (err) {
70
- console.warn(`[wsMessages] failed to persist message to ${room}:`, err);
71
- return null;
72
- }
73
- };
74
- /**
75
- * Get message history for a room.
76
- * Cursor-based pagination using message `id` as cursor.
77
- */
78
- export const getMessageHistory = async (room, opts) => {
79
- const limit = opts?.limit ?? 50;
80
- switch (_store) {
81
- case "memory":
82
- return memoryGetHistory(room, limit, opts?.before, opts?.after);
83
- case "redis":
84
- return await redisGetHistory(room, limit, opts?.before, opts?.after);
85
- case "mongo":
86
- return await mongoGetHistory(room, limit, opts?.before, opts?.after);
87
- case "sqlite":
88
- return sqliteGetHistory(room, limit, opts?.before, opts?.after);
89
- }
90
- };
91
- /** Reset memory store. Useful for test isolation. */
92
- export const clearWsMessageMemoryStore = () => {
93
- _memoryMessages.clear();
94
- _roomConfigs.clear();
95
- _sqliteTrimCounters.clear();
96
- };
97
- // ---------------------------------------------------------------------------
98
- // Memory backend
99
- // ---------------------------------------------------------------------------
100
- function memoryPersist(msg, config) {
101
- if (!_memoryMessages.has(msg.room))
102
- _memoryMessages.set(msg.room, []);
103
- const msgs = _memoryMessages.get(msg.room);
104
- msgs.push(msg);
105
- // Trim to maxCount
106
- if (msgs.length > config.maxCount) {
107
- msgs.splice(0, msgs.length - config.maxCount);
108
- }
109
- return msg;
110
- }
111
- function memoryGetHistory(room, limit, before, after) {
112
- const msgs = _memoryMessages.get(room) ?? [];
113
- const now = Date.now();
114
- const config = _roomConfigs.get(room);
115
- const ttlMs = (config?.ttlSeconds ?? _defaults.ttlSeconds) * 1000;
116
- // Filter expired
117
- let filtered = msgs.filter((m) => now - m.createdAt < ttlMs);
118
- if (before) {
119
- const cursorIdx = filtered.findIndex((m) => m.id === before);
120
- if (cursorIdx > 0)
121
- filtered = filtered.slice(0, cursorIdx);
122
- }
123
- else if (after) {
124
- const cursorIdx = filtered.findIndex((m) => m.id === after);
125
- if (cursorIdx >= 0)
126
- filtered = filtered.slice(cursorIdx + 1);
127
- }
128
- // Return last N messages (most recent)
129
- return filtered.slice(-limit);
130
- }
131
- // ---------------------------------------------------------------------------
132
- // Redis backend
133
- // ---------------------------------------------------------------------------
134
- async function redisPersist(msg, config) {
135
- const { getRedis } = await import("./redis");
136
- const redis = getRedis();
137
- const key = `wsmsg:${msg.room}`;
138
- const serialized = JSON.stringify(msg);
139
- await redis.lpush(key, serialized);
140
- await redis.ltrim(key, 0, config.maxCount - 1);
141
- await redis.expire(key, config.ttlSeconds);
142
- return msg;
143
- }
144
- async function redisGetHistory(room, limit, before, after) {
145
- const { getRedis } = await import("./redis");
146
- const redis = getRedis();
147
- const key = `wsmsg:${room}`;
148
- // Redis list is newest-first (LPUSH)
149
- const raw = await redis.lrange(key, 0, -1);
150
- let msgs = raw.map((s) => JSON.parse(s)).reverse(); // oldest-first
151
- if (before) {
152
- const idx = msgs.findIndex((m) => m.id === before);
153
- if (idx > 0)
154
- msgs = msgs.slice(0, idx);
155
- }
156
- else if (after) {
157
- const idx = msgs.findIndex((m) => m.id === after);
158
- if (idx >= 0)
159
- msgs = msgs.slice(idx + 1);
160
- }
161
- return msgs.slice(-limit);
162
- }
163
- // ---------------------------------------------------------------------------
164
- // MongoDB backend
165
- // ---------------------------------------------------------------------------
166
- let _mongoModel = null;
167
- async function getWsMessageModel() {
168
- if (_mongoModel)
169
- return _mongoModel;
170
- const { authConnection } = await import("./mongo");
171
- const { default: mongoose } = await import("mongoose");
172
- const schema = new mongoose.Schema({
173
- _id: { type: String, default: () => crypto.randomUUID() },
174
- room: { type: String, required: true, index: true },
175
- senderId: { type: String, default: null },
176
- payload: { type: mongoose.Schema.Types.Mixed },
177
- createdAt: { type: Number, required: true, index: true },
178
- }, { collection: "ws_messages" });
179
- schema.index({ room: 1, createdAt: 1, _id: 1 });
180
- // TTL index — Mongo's TTL monitor runs ~every 60s, so messages may briefly
181
- // outlive their TTL. Acceptable for chat history.
182
- schema.index({ createdAt: 1 }, { expireAfterSeconds: DEFAULT_TTL_SECONDS });
183
- _mongoModel = authConnection.model("WsMessage", schema);
184
- return _mongoModel;
185
- }
186
- async function mongoPersist(msg, config) {
187
- const Model = await getWsMessageModel();
188
- await Model.create({
189
- _id: msg.id,
190
- room: msg.room,
191
- senderId: msg.senderId,
192
- payload: msg.payload,
193
- createdAt: msg.createdAt,
194
- });
195
- // Trim to maxCount
196
- const count = await Model.countDocuments({ room: msg.room });
197
- if (count > config.maxCount) {
198
- const oldest = await Model.find({ room: msg.room })
199
- .sort({ createdAt: 1, _id: 1 })
200
- .limit(count - config.maxCount)
201
- .select("_id");
202
- if (oldest.length > 0) {
203
- await Model.deleteMany({ _id: { $in: oldest.map((d) => d._id) } });
204
- }
205
- }
206
- return msg;
207
- }
208
- async function mongoGetHistory(room, limit, before, after) {
209
- const Model = await getWsMessageModel();
210
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
211
- const filter = { room };
212
- if (before) {
213
- const cursor = await Model.findById(before).lean();
214
- if (cursor) {
215
- filter.$or = [
216
- { createdAt: { $lt: cursor.createdAt } },
217
- { createdAt: cursor.createdAt, _id: { $lt: before } },
218
- ];
219
- }
220
- }
221
- else if (after) {
222
- const cursor = await Model.findById(after).lean();
223
- if (cursor) {
224
- filter.$or = [
225
- { createdAt: { $gt: cursor.createdAt } },
226
- { createdAt: cursor.createdAt, _id: { $gt: after } },
227
- ];
228
- }
229
- }
230
- const docs = await Model.find(filter)
231
- .sort({ createdAt: -1, _id: -1 })
232
- .limit(limit)
233
- .lean();
234
- return docs.reverse().map((d) => ({
235
- id: d._id,
236
- room: d.room,
237
- senderId: d.senderId,
238
- payload: d.payload,
239
- createdAt: d.createdAt,
240
- }));
241
- }
242
- // ---------------------------------------------------------------------------
243
- // SQLite backend
244
- // ---------------------------------------------------------------------------
245
- function getSqliteDb() {
246
- // Re-use the sqlite DB set via setSqliteDb
247
- // eslint-disable-next-line @typescript-eslint/no-var-requires
248
- const { getSqliteDatabase } = require("../adapters/sqliteAuth");
249
- return getSqliteDatabase();
250
- }
251
- let _sqliteInitialized = false;
252
- function ensureSqliteTable() {
253
- if (_sqliteInitialized)
254
- return;
255
- const db = getSqliteDb();
256
- db.run(`
257
- CREATE TABLE IF NOT EXISTS ws_messages (
258
- id TEXT PRIMARY KEY,
259
- room TEXT NOT NULL,
260
- sender_id TEXT,
261
- payload TEXT,
262
- created_at INTEGER NOT NULL
263
- )
264
- `);
265
- db.run(`CREATE INDEX IF NOT EXISTS idx_ws_messages_room_created ON ws_messages (room, created_at, id)`);
266
- _sqliteInitialized = true;
267
- }
268
- function sqlitePersist(msg, config) {
269
- ensureSqliteTable();
270
- const db = getSqliteDb();
271
- db.run(`INSERT INTO ws_messages (id, room, sender_id, payload, created_at) VALUES (?, ?, ?, ?, ?)`, [msg.id, msg.room, msg.senderId, JSON.stringify(msg.payload), msg.createdAt]);
272
- // Modulo-based trimming to avoid DELETE on every INSERT.
273
- const counter = (_sqliteTrimCounters.get(msg.room) ?? 0) + 1;
274
- const trimInterval = Math.max(10, Math.floor(config.maxCount * 0.1));
275
- _sqliteTrimCounters.set(msg.room, counter);
276
- if (counter >= trimInterval) {
277
- _sqliteTrimCounters.set(msg.room, 0);
278
- // Delete oldest beyond maxCount
279
- db.run(`DELETE FROM ws_messages WHERE room = ? AND id NOT IN (
280
- SELECT id FROM ws_messages WHERE room = ? ORDER BY created_at DESC, id DESC LIMIT ?
281
- )`, [msg.room, msg.room, config.maxCount]);
282
- // TTL cleanup
283
- const ttlMs = config.ttlSeconds * 1000;
284
- db.run(`DELETE FROM ws_messages WHERE room = ? AND created_at < ?`, [msg.room, Date.now() - ttlMs]);
285
- }
286
- return msg;
287
- }
288
- function sqliteGetHistory(room, limit, before, after) {
289
- ensureSqliteTable();
290
- const db = getSqliteDb();
291
- let sql;
292
- let params;
293
- if (before) {
294
- sql = `
295
- SELECT * FROM ws_messages
296
- WHERE room = ? AND (created_at, id) < (
297
- (SELECT created_at FROM ws_messages WHERE id = ?),
298
- ?
299
- )
300
- ORDER BY created_at DESC, id DESC LIMIT ?
301
- `;
302
- params = [room, before, before, limit];
303
- }
304
- else if (after) {
305
- sql = `
306
- SELECT * FROM ws_messages
307
- WHERE room = ? AND (created_at, id) > (
308
- (SELECT created_at FROM ws_messages WHERE id = ?),
309
- ?
310
- )
311
- ORDER BY created_at ASC, id ASC LIMIT ?
312
- `;
313
- params = [room, after, after, limit];
314
- }
315
- else {
316
- sql = `SELECT * FROM ws_messages WHERE room = ? ORDER BY created_at DESC, id DESC LIMIT ?`;
317
- params = [room, limit];
318
- }
319
- const rows = db.query(sql).all(...params);
320
- // Normalize to oldest-first
321
- if (!after)
322
- rows.reverse();
323
- return rows.map((r) => ({
324
- id: r.id,
325
- room: r.room,
326
- senderId: r.sender_id,
327
- payload: JSON.parse(r.payload),
328
- createdAt: r.created_at,
329
- }));
330
- }
@@ -1,25 +0,0 @@
1
- /** Track an authenticated socket. Skips if userId is null/undefined. */
2
- export declare const trackSocket: (socketId: string, userId: string | null) => void;
3
- /** Untrack a socket on disconnect. */
4
- export declare const untrackSocket: (socketId: string) => void;
5
- /** Called when a socket subscribes to a room. Returns join info or null if unauthenticated. */
6
- export declare const addPresence: (socketId: string, room: string) => {
7
- userId: string;
8
- isNewUser: boolean;
9
- } | null;
10
- /** Called when a socket unsubscribes from a room. Returns leave info or null if unauthenticated. */
11
- export declare const removePresence: (socketId: string, room: string) => {
12
- userId: string;
13
- isLastSocket: boolean;
14
- } | null;
15
- /** Called on disconnect — cleans up all rooms for a socket. Returns rooms where user fully departed. */
16
- export declare const cleanupPresence: (socketId: string, rooms: Set<string>) => Array<{
17
- room: string;
18
- userId: string;
19
- }>;
20
- /** Deduplicated userIds present in a room. */
21
- export declare const getRoomPresence: (room: string) => string[];
22
- /** Rooms where a user is present. */
23
- export declare const getUserPresence: (userId: string) => string[];
24
- /** Reset all presence state. Useful for test isolation. */
25
- export declare const clearPresenceStore: () => void;