@rapidrest/service-core 1.0.0-rc.7 → 1.0.0

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 (380) hide show
  1. package/LICENSE +382 -23
  2. package/README.md +79 -5
  3. package/dist/lib/ApiErrors.js +10 -0
  4. package/dist/lib/ApiErrors.js.map +1 -1
  5. package/dist/lib/BackgroundService.js +1 -4
  6. package/dist/lib/BackgroundService.js.map +1 -1
  7. package/dist/lib/BackgroundServiceManager.js +47 -6
  8. package/dist/lib/BackgroundServiceManager.js.map +1 -1
  9. package/dist/lib/BulkError.js +4 -0
  10. package/dist/lib/BulkError.js.map +1 -1
  11. package/dist/lib/EventListenerManager.js +53 -18
  12. package/dist/lib/EventListenerManager.js.map +1 -1
  13. package/dist/lib/NetUtils.js +1 -0
  14. package/dist/lib/NetUtils.js.map +1 -1
  15. package/dist/lib/NotificationUtils.js +27 -8
  16. package/dist/lib/NotificationUtils.js.map +1 -1
  17. package/dist/lib/ObjectFactory.js +25 -44
  18. package/dist/lib/ObjectFactory.js.map +1 -1
  19. package/dist/lib/OpenApiSpec.js +31 -11
  20. package/dist/lib/OpenApiSpec.js.map +1 -1
  21. package/dist/lib/Server.js +74 -110
  22. package/dist/lib/Server.js.map +1 -1
  23. package/dist/lib/auth/AuthMiddleware.js +11 -16
  24. package/dist/lib/auth/AuthMiddleware.js.map +1 -1
  25. package/dist/lib/auth/JWTStrategy.js +68 -17
  26. package/dist/lib/auth/JWTStrategy.js.map +1 -1
  27. package/dist/lib/auth/index.js +0 -1
  28. package/dist/lib/auth/index.js.map +1 -1
  29. package/dist/lib/database/ConnectionKinds.js +15 -0
  30. package/dist/lib/database/ConnectionKinds.js.map +1 -1
  31. package/dist/lib/database/ConnectionManager.js +140 -61
  32. package/dist/lib/database/ConnectionManager.js.map +1 -1
  33. package/dist/lib/database/MongoConnection.js +13 -3
  34. package/dist/lib/database/MongoConnection.js.map +1 -1
  35. package/dist/lib/database/MongoRepository.js +61 -15
  36. package/dist/lib/database/MongoRepository.js.map +1 -1
  37. package/dist/lib/database/MongoSchemaSync.js +3 -3
  38. package/dist/lib/database/MongoSchemaSync.js.map +1 -1
  39. package/dist/lib/database/NamingUtils.js +3 -2
  40. package/dist/lib/database/NamingUtils.js.map +1 -1
  41. package/dist/lib/database/RedisCache.js +64 -0
  42. package/dist/lib/database/RedisCache.js.map +1 -0
  43. package/dist/lib/database/TypeOrmSupport.js +53 -13
  44. package/dist/lib/database/TypeOrmSupport.js.map +1 -1
  45. package/dist/lib/database/index.js +1 -0
  46. package/dist/lib/database/index.js.map +1 -1
  47. package/dist/lib/decorators/DatabaseDecorators.js +264 -20
  48. package/dist/lib/decorators/DatabaseDecorators.js.map +1 -1
  49. package/dist/lib/decorators/DocDecorators.js +30 -9
  50. package/dist/lib/decorators/DocDecorators.js.map +1 -1
  51. package/dist/lib/decorators/EventDecorators.js +1 -0
  52. package/dist/lib/decorators/EventDecorators.js.map +1 -1
  53. package/dist/lib/decorators/ModelDecorators.js +39 -23
  54. package/dist/lib/decorators/ModelDecorators.js.map +1 -1
  55. package/dist/lib/decorators/PersistenceDecorators.js +4 -3
  56. package/dist/lib/decorators/PersistenceDecorators.js.map +1 -1
  57. package/dist/lib/decorators/RouteDecorators.js +139 -36
  58. package/dist/lib/decorators/RouteDecorators.js.map +1 -1
  59. package/dist/lib/http/IWebSocketShim.js +2 -0
  60. package/dist/lib/http/IWebSocketShim.js.map +1 -0
  61. package/dist/lib/http/MiddlewareChain.js +167 -0
  62. package/dist/lib/http/MiddlewareChain.js.map +1 -0
  63. package/dist/lib/http/RuntimeDetect.js +9 -0
  64. package/dist/lib/http/RuntimeDetect.js.map +1 -0
  65. package/dist/lib/http/bun/BunAdapters.js +326 -0
  66. package/dist/lib/http/bun/BunAdapters.js.map +1 -0
  67. package/dist/lib/http/bun/BunRouter.js +391 -0
  68. package/dist/lib/http/bun/BunRouter.js.map +1 -0
  69. package/dist/lib/http/bun/BunWebSocket.js +49 -0
  70. package/dist/lib/http/bun/BunWebSocket.js.map +1 -0
  71. package/dist/lib/http/index.js +16 -3
  72. package/dist/lib/http/index.js.map +1 -1
  73. package/dist/lib/http/session/RedisSessionStore.js +30 -0
  74. package/dist/lib/http/session/RedisSessionStore.js.map +1 -0
  75. package/dist/lib/http/session/SessionManager.js +113 -0
  76. package/dist/lib/http/session/SessionManager.js.map +1 -0
  77. package/dist/lib/http/session/SessionStore.js +6 -0
  78. package/dist/lib/http/session/SessionStore.js.map +1 -0
  79. package/dist/lib/http/session/sessionMiddleware.js +42 -0
  80. package/dist/lib/http/session/sessionMiddleware.js.map +1 -0
  81. package/dist/lib/http/types.js +0 -3
  82. package/dist/lib/http/types.js.map +1 -1
  83. package/dist/lib/http/uWS/Adapters.js +421 -0
  84. package/dist/lib/http/uWS/Adapters.js.map +1 -0
  85. package/dist/lib/http/{Router.js → uWS/Router.js} +73 -173
  86. package/dist/lib/http/uWS/Router.js.map +1 -0
  87. package/dist/lib/http/{WebSocket.js → uWS/WebSocket.js} +4 -1
  88. package/dist/lib/http/uWS/WebSocket.js.map +1 -0
  89. package/dist/lib/models/BaseEntity.js +2 -1
  90. package/dist/lib/models/BaseEntity.js.map +1 -1
  91. package/dist/lib/models/BaseMongoEntity.js +2 -2
  92. package/dist/lib/models/BaseMongoEntity.js.map +1 -1
  93. package/dist/lib/models/ModelUtils.js +248 -101
  94. package/dist/lib/models/ModelUtils.js.map +1 -1
  95. package/dist/lib/models/RecoverableBaseEntity.js +6 -1
  96. package/dist/lib/models/RecoverableBaseEntity.js.map +1 -1
  97. package/dist/lib/models/RecoverableBaseMongoEntity.js +1 -0
  98. package/dist/lib/models/RecoverableBaseMongoEntity.js.map +1 -1
  99. package/dist/lib/models/RepoUtils.js +641 -203
  100. package/dist/lib/models/RepoUtils.js.map +1 -1
  101. package/dist/lib/models/SimpleEntity.js +1 -0
  102. package/dist/lib/models/SimpleEntity.js.map +1 -1
  103. package/dist/lib/models/SimpleMongoEntity.js +2 -1
  104. package/dist/lib/models/SimpleMongoEntity.js.map +1 -1
  105. package/dist/lib/models/StatusExtraData.js +4 -0
  106. package/dist/lib/models/StatusExtraData.js.map +1 -1
  107. package/dist/lib/routes/{AdminRoute.js → BaseAdminRoute.js} +98 -80
  108. package/dist/lib/routes/BaseAdminRoute.js.map +1 -0
  109. package/dist/lib/routes/{MetricsRoute.js → BaseMetricsRoute.js} +29 -15
  110. package/dist/lib/routes/BaseMetricsRoute.js.map +1 -0
  111. package/dist/lib/routes/{OpenAPIRoute.js → BaseOpenAPIRoute.js} +32 -32
  112. package/dist/lib/routes/BaseOpenAPIRoute.js.map +1 -0
  113. package/dist/lib/routes/BasePushRoute.js +305 -0
  114. package/dist/lib/routes/BasePushRoute.js.map +1 -0
  115. package/dist/lib/routes/BaseStaticRoute.js +153 -0
  116. package/dist/lib/routes/BaseStaticRoute.js.map +1 -0
  117. package/dist/lib/routes/BaseStatusRoute.js +80 -0
  118. package/dist/lib/routes/BaseStatusRoute.js.map +1 -0
  119. package/dist/lib/routes/CRUDRoute.js +284 -0
  120. package/dist/lib/routes/CRUDRoute.js.map +1 -0
  121. package/dist/lib/routes/ModelRoute.js +84 -57
  122. package/dist/lib/routes/ModelRoute.js.map +1 -1
  123. package/dist/lib/routes/RouteUtils.js +108 -20
  124. package/dist/lib/routes/RouteUtils.js.map +1 -1
  125. package/dist/lib/routes/index.js +7 -4
  126. package/dist/lib/routes/index.js.map +1 -1
  127. package/dist/lib/security/ACLUtils.js +297 -170
  128. package/dist/lib/security/ACLUtils.js.map +1 -1
  129. package/dist/lib/security/AccessControlList.js +18 -10
  130. package/dist/lib/security/AccessControlList.js.map +1 -1
  131. package/dist/lib/security/AccessControlListMongo.js +19 -68
  132. package/dist/lib/security/AccessControlListMongo.js.map +1 -1
  133. package/dist/lib/security/AccessControlListSQL.js +21 -70
  134. package/dist/lib/security/AccessControlListSQL.js.map +1 -1
  135. package/dist/lib/security/BaseACLRoute.js +239 -0
  136. package/dist/lib/security/BaseACLRoute.js.map +1 -0
  137. package/dist/lib/security/index.js +3 -0
  138. package/dist/lib/security/index.js.map +1 -1
  139. package/dist/lib/test/request.js +62 -5
  140. package/dist/lib/test/request.js.map +1 -1
  141. package/dist/lib/test/requestws.js +34 -10
  142. package/dist/lib/test/requestws.js.map +1 -1
  143. package/dist/types/ApiErrors.d.ts +8 -2
  144. package/dist/types/BackgroundService.d.ts +0 -5
  145. package/dist/types/BackgroundServiceManager.d.ts +2 -1
  146. package/dist/types/EventListenerManager.d.ts +7 -6
  147. package/dist/types/NotificationUtils.d.ts +5 -3
  148. package/dist/types/OpenApiSpec.d.ts +2 -2
  149. package/dist/types/Server.d.ts +28 -10
  150. package/dist/types/auth/AuthMiddleware.d.ts +3 -3
  151. package/dist/types/auth/AuthStrategy.d.ts +10 -7
  152. package/dist/types/auth/JWTStrategy.d.ts +6 -4
  153. package/dist/types/auth/index.d.ts +0 -1
  154. package/dist/types/database/ConnectionKinds.d.ts +7 -0
  155. package/dist/types/database/ConnectionManager.d.ts +29 -4
  156. package/dist/types/database/MongoConnection.d.ts +16 -4
  157. package/dist/types/database/MongoRepository.d.ts +32 -11
  158. package/dist/types/database/RedisCache.d.ts +23 -0
  159. package/dist/types/database/TypeOrmSupport.d.ts +4 -4
  160. package/dist/types/database/index.d.ts +1 -0
  161. package/dist/types/decorators/DatabaseDecorators.d.ts +139 -8
  162. package/dist/types/decorators/DocDecorators.d.ts +11 -2
  163. package/dist/types/decorators/ModelDecorators.d.ts +12 -5
  164. package/dist/types/decorators/PersistenceDecorators.d.ts +11 -4
  165. package/dist/types/decorators/RouteDecorators.d.ts +36 -6
  166. package/dist/types/http/IWebSocketShim.d.ts +11 -0
  167. package/dist/types/http/MiddlewareChain.d.ts +47 -0
  168. package/dist/types/http/RuntimeDetect.d.ts +2 -0
  169. package/dist/types/http/bun/BunAdapters.d.ts +139 -0
  170. package/dist/types/http/bun/BunRouter.d.ts +79 -0
  171. package/dist/types/http/bun/BunWebSocket.d.ts +35 -0
  172. package/dist/types/http/index.d.ts +16 -6
  173. package/dist/types/http/session/RedisSessionStore.d.ts +15 -0
  174. package/dist/types/http/session/SessionManager.d.ts +35 -0
  175. package/dist/types/http/session/SessionStore.d.ts +12 -0
  176. package/dist/types/http/session/sessionMiddleware.d.ts +10 -0
  177. package/dist/types/http/types.d.ts +42 -3
  178. package/dist/types/http/uWS/Adapters.d.ts +129 -0
  179. package/dist/types/http/{Router.d.ts → uWS/Router.d.ts} +14 -38
  180. package/dist/types/http/{WebSocket.d.ts → uWS/WebSocket.d.ts} +6 -5
  181. package/dist/types/models/BaseEntity.d.ts +1 -1
  182. package/dist/types/models/ModelUtils.d.ts +47 -14
  183. package/dist/types/models/RecoverableBaseEntity.d.ts +3 -1
  184. package/dist/types/models/RepoUtils.d.ts +84 -14
  185. package/dist/types/routes/BaseAdminRoute.d.ts +65 -0
  186. package/dist/types/routes/BaseMetricsRoute.d.ts +37 -0
  187. package/dist/types/routes/BaseOpenAPIRoute.d.ts +33 -0
  188. package/dist/types/routes/BasePushRoute.d.ts +53 -0
  189. package/dist/types/routes/BaseStaticRoute.d.ts +44 -0
  190. package/dist/types/routes/BaseStatusRoute.d.ts +37 -0
  191. package/dist/types/routes/CRUDRoute.d.ts +57 -0
  192. package/dist/types/routes/ModelRoute.d.ts +39 -36
  193. package/dist/types/routes/RouteUtils.d.ts +19 -0
  194. package/dist/types/routes/index.d.ts +7 -4
  195. package/dist/types/security/ACLUtils.d.ts +94 -18
  196. package/dist/types/security/AccessControlList.d.ts +37 -59
  197. package/dist/types/security/AccessControlListMongo.d.ts +3 -8
  198. package/dist/types/security/AccessControlListSQL.d.ts +3 -8
  199. package/dist/types/security/BaseACLRoute.d.ts +73 -0
  200. package/dist/types/security/index.d.ts +3 -0
  201. package/dist/types/test/request.d.ts +18 -1
  202. package/package.json +135 -129
  203. package/tsconfig.export.json +17 -0
  204. package/dist/lib/auth/BasicStrategy.js +0 -113
  205. package/dist/lib/auth/BasicStrategy.js.map +0 -1
  206. package/dist/lib/http/Adapters.js +0 -241
  207. package/dist/lib/http/Adapters.js.map +0 -1
  208. package/dist/lib/http/Router.js.map +0 -1
  209. package/dist/lib/http/WebSocket.js.map +0 -1
  210. package/dist/lib/routes/AdminRoute.js.map +0 -1
  211. package/dist/lib/routes/MetricsRoute.js.map +0 -1
  212. package/dist/lib/routes/OpenAPIRoute.js.map +0 -1
  213. package/dist/lib/routes/StatusRoute.js +0 -55
  214. package/dist/lib/routes/StatusRoute.js.map +0 -1
  215. package/dist/lib/security/ACLRouteMongo.js +0 -194
  216. package/dist/lib/security/ACLRouteMongo.js.map +0 -1
  217. package/dist/lib/security/ACLRouteSQL.js +0 -193
  218. package/dist/lib/security/ACLRouteSQL.js.map +0 -1
  219. package/dist/types/auth/BasicStrategy.d.ts +0 -37
  220. package/dist/types/http/Adapters.d.ts +0 -68
  221. package/dist/types/routes/AdminRoute.d.ts +0 -47
  222. package/dist/types/routes/MetricsRoute.d.ts +0 -15
  223. package/dist/types/routes/OpenAPIRoute.d.ts +0 -17
  224. package/dist/types/routes/StatusRoute.d.ts +0 -11
  225. package/dist/types/security/ACLRouteMongo.d.ts +0 -19
  226. package/dist/types/security/ACLRouteSQL.d.ts +0 -19
  227. package/docs/Makefile +0 -20
  228. package/docs/conf.py +0 -58
  229. package/docs/index.rst +0 -17
  230. package/docs/make.bat +0 -35
  231. package/docs/reference/@rapidrest/namespaces/DatabaseDecorators/README.md +0 -13
  232. package/docs/reference/@rapidrest/namespaces/DatabaseDecorators/functions/MongoRepository.md +0 -25
  233. package/docs/reference/@rapidrest/namespaces/DatabaseDecorators/functions/RedisConnection.md +0 -25
  234. package/docs/reference/@rapidrest/namespaces/DatabaseDecorators/functions/Repository.md +0 -25
  235. package/docs/reference/@rapidrest/namespaces/DocDecorators/README.md +0 -23
  236. package/docs/reference/@rapidrest/namespaces/DocDecorators/functions/Default.md +0 -25
  237. package/docs/reference/@rapidrest/namespaces/DocDecorators/functions/Description.md +0 -25
  238. package/docs/reference/@rapidrest/namespaces/DocDecorators/functions/Document.md +0 -25
  239. package/docs/reference/@rapidrest/namespaces/DocDecorators/functions/Example.md +0 -25
  240. package/docs/reference/@rapidrest/namespaces/DocDecorators/functions/Format.md +0 -25
  241. package/docs/reference/@rapidrest/namespaces/DocDecorators/functions/Returns.md +0 -28
  242. package/docs/reference/@rapidrest/namespaces/DocDecorators/functions/Summary.md +0 -25
  243. package/docs/reference/@rapidrest/namespaces/DocDecorators/functions/Tags.md +0 -25
  244. package/docs/reference/@rapidrest/namespaces/DocDecorators/functions/TypeInfo.md +0 -28
  245. package/docs/reference/@rapidrest/namespaces/DocDecorators/interfaces/DocumentsData.md +0 -57
  246. package/docs/reference/@rapidrest/namespaces/EventDecorators/README.md +0 -12
  247. package/docs/reference/@rapidrest/namespaces/EventDecorators/functions/EventListener.md +0 -17
  248. package/docs/reference/@rapidrest/namespaces/EventDecorators/functions/OnEvent.md +0 -26
  249. package/docs/reference/@rapidrest/namespaces/ModelDecorators/README.md +0 -26
  250. package/docs/reference/@rapidrest/namespaces/ModelDecorators/functions/Cache.md +0 -25
  251. package/docs/reference/@rapidrest/namespaces/ModelDecorators/functions/ChildEntity.md +0 -18
  252. package/docs/reference/@rapidrest/namespaces/ModelDecorators/functions/DataStore.md +0 -25
  253. package/docs/reference/@rapidrest/namespaces/ModelDecorators/functions/Identifier.md +0 -27
  254. package/docs/reference/@rapidrest/namespaces/ModelDecorators/functions/Protect.md +0 -35
  255. package/docs/reference/@rapidrest/namespaces/ModelDecorators/functions/Reference.md +0 -25
  256. package/docs/reference/@rapidrest/namespaces/ModelDecorators/functions/Shard.md +0 -27
  257. package/docs/reference/@rapidrest/namespaces/ModelDecorators/functions/TrackChanges.md +0 -26
  258. package/docs/reference/@rapidrest/namespaces/ModelDecorators/interfaces/PendingTypeOrmColumn.md +0 -45
  259. package/docs/reference/@rapidrest/namespaces/ModelDecorators/variables/pendingTypeOrmColumns.md +0 -14
  260. package/docs/reference/@rapidrest/namespaces/PersistenceDecorators/README.md +0 -27
  261. package/docs/reference/@rapidrest/namespaces/PersistenceDecorators/functions/Column.md +0 -25
  262. package/docs/reference/@rapidrest/namespaces/PersistenceDecorators/functions/Entity.md +0 -25
  263. package/docs/reference/@rapidrest/namespaces/PersistenceDecorators/functions/Index.md +0 -119
  264. package/docs/reference/@rapidrest/namespaces/PersistenceDecorators/functions/PrimaryColumn.md +0 -25
  265. package/docs/reference/@rapidrest/namespaces/PersistenceDecorators/functions/Unique.md +0 -68
  266. package/docs/reference/@rapidrest/namespaces/PersistenceDecorators/functions/getColumnMetadata.md +0 -26
  267. package/docs/reference/@rapidrest/namespaces/PersistenceDecorators/functions/getEntityName.md +0 -26
  268. package/docs/reference/@rapidrest/namespaces/PersistenceDecorators/functions/getIndexMetadata.md +0 -27
  269. package/docs/reference/@rapidrest/namespaces/PersistenceDecorators/interfaces/CollationOptions.md +0 -79
  270. package/docs/reference/@rapidrest/namespaces/PersistenceDecorators/interfaces/ColumnInfo.md +0 -41
  271. package/docs/reference/@rapidrest/namespaces/PersistenceDecorators/interfaces/ColumnOptions.md +0 -51
  272. package/docs/reference/@rapidrest/namespaces/PersistenceDecorators/interfaces/EntityOptions.md +0 -32
  273. package/docs/reference/@rapidrest/namespaces/PersistenceDecorators/interfaces/IndexInfo.md +0 -41
  274. package/docs/reference/@rapidrest/namespaces/PersistenceDecorators/interfaces/IndexOptions.md +0 -61
  275. package/docs/reference/@rapidrest/namespaces/RouteDecorators/README.md +0 -36
  276. package/docs/reference/@rapidrest/namespaces/RouteDecorators/functions/After.md +0 -26
  277. package/docs/reference/@rapidrest/namespaces/RouteDecorators/functions/Auth.md +0 -33
  278. package/docs/reference/@rapidrest/namespaces/RouteDecorators/functions/AuthResult.md +0 -31
  279. package/docs/reference/@rapidrest/namespaces/RouteDecorators/functions/Before.md +0 -25
  280. package/docs/reference/@rapidrest/namespaces/RouteDecorators/functions/ContentType.md +0 -25
  281. package/docs/reference/@rapidrest/namespaces/RouteDecorators/functions/Delete.md +0 -25
  282. package/docs/reference/@rapidrest/namespaces/RouteDecorators/functions/Get.md +0 -25
  283. package/docs/reference/@rapidrest/namespaces/RouteDecorators/functions/Head.md +0 -25
  284. package/docs/reference/@rapidrest/namespaces/RouteDecorators/functions/Header.md +0 -25
  285. package/docs/reference/@rapidrest/namespaces/RouteDecorators/functions/Method.md +0 -31
  286. package/docs/reference/@rapidrest/namespaces/RouteDecorators/functions/Model.md +0 -25
  287. package/docs/reference/@rapidrest/namespaces/RouteDecorators/functions/Options.md +0 -25
  288. package/docs/reference/@rapidrest/namespaces/RouteDecorators/functions/Param.md +0 -26
  289. package/docs/reference/@rapidrest/namespaces/RouteDecorators/functions/Patch.md +0 -25
  290. package/docs/reference/@rapidrest/namespaces/RouteDecorators/functions/Post.md +0 -25
  291. package/docs/reference/@rapidrest/namespaces/RouteDecorators/functions/Protect.md +0 -31
  292. package/docs/reference/@rapidrest/namespaces/RouteDecorators/functions/Put.md +0 -25
  293. package/docs/reference/@rapidrest/namespaces/RouteDecorators/functions/Query.md +0 -26
  294. package/docs/reference/@rapidrest/namespaces/RouteDecorators/functions/Request.md +0 -31
  295. package/docs/reference/@rapidrest/namespaces/RouteDecorators/functions/RequiresRole.md +0 -26
  296. package/docs/reference/@rapidrest/namespaces/RouteDecorators/functions/Response.md +0 -31
  297. package/docs/reference/@rapidrest/namespaces/RouteDecorators/functions/Route.md +0 -25
  298. package/docs/reference/@rapidrest/namespaces/RouteDecorators/functions/Socket.md +0 -33
  299. package/docs/reference/@rapidrest/namespaces/RouteDecorators/functions/User.md +0 -31
  300. package/docs/reference/@rapidrest/namespaces/RouteDecorators/functions/Validate.md +0 -25
  301. package/docs/reference/@rapidrest/namespaces/RouteDecorators/functions/WebSocket.md +0 -25
  302. package/docs/reference/README.md +0 -20
  303. package/docs/reference/classes/ACLUtils.md +0 -263
  304. package/docs/reference/classes/AdminRoute.md +0 -51
  305. package/docs/reference/classes/AuthMiddleware.md +0 -173
  306. package/docs/reference/classes/BackgroundService.md +0 -117
  307. package/docs/reference/classes/BackgroundServiceManager.md +0 -172
  308. package/docs/reference/classes/BaseEntity.md +0 -82
  309. package/docs/reference/classes/BaseMongoEntity.md +0 -107
  310. package/docs/reference/classes/BasicStrategy.md +0 -131
  311. package/docs/reference/classes/BasicStrategyOptions.md +0 -115
  312. package/docs/reference/classes/BulkError.md +0 -271
  313. package/docs/reference/classes/ConnectionManager.md +0 -75
  314. package/docs/reference/classes/EventListenerManager.md +0 -88
  315. package/docs/reference/classes/HttpRouter.md +0 -343
  316. package/docs/reference/classes/JWTStrategy.md +0 -100
  317. package/docs/reference/classes/JWTStrategyOptions.md +0 -97
  318. package/docs/reference/classes/MetricsRoute.md +0 -27
  319. package/docs/reference/classes/ModelRoute.md +0 -527
  320. package/docs/reference/classes/ModelUtils.md +0 -446
  321. package/docs/reference/classes/MongoConnection.md +0 -218
  322. package/docs/reference/classes/MongoRepository.md +0 -390
  323. package/docs/reference/classes/MongoSchemaSync.md +0 -97
  324. package/docs/reference/classes/NetUtils.md +0 -90
  325. package/docs/reference/classes/NotificationUtils.md +0 -77
  326. package/docs/reference/classes/ObjectFactory.md +0 -336
  327. package/docs/reference/classes/OpenAPIRoute.md +0 -77
  328. package/docs/reference/classes/OpenApiSpec.md +0 -892
  329. package/docs/reference/classes/RecoverableBaseEntity.md +0 -114
  330. package/docs/reference/classes/RecoverableBaseMongoEntity.md +0 -124
  331. package/docs/reference/classes/RedisTransport.md +0 -2202
  332. package/docs/reference/classes/RepoUtils.md +0 -482
  333. package/docs/reference/classes/RouteUtils.md +0 -191
  334. package/docs/reference/classes/Server.md +0 -408
  335. package/docs/reference/classes/SimpleEntity.md +0 -48
  336. package/docs/reference/classes/SimpleMongoEntity.md +0 -66
  337. package/docs/reference/classes/StatusExtraData.md +0 -57
  338. package/docs/reference/classes/StatusRoute.md +0 -26
  339. package/docs/reference/classes/UWSRequest.md +0 -226
  340. package/docs/reference/classes/UWSResponse.md +0 -257
  341. package/docs/reference/classes/UWSWebSocketShim.md +0 -958
  342. package/docs/reference/enumerations/ACLAction.md +0 -63
  343. package/docs/reference/enumerations/ApiErrorMessages.md +0 -123
  344. package/docs/reference/enumerations/ApiErrors.md +0 -123
  345. package/docs/reference/functions/createWebSocketStream.md +0 -27
  346. package/docs/reference/functions/isSqlDataSource.md +0 -26
  347. package/docs/reference/functions/readBody.md +0 -29
  348. package/docs/reference/functions/resolveCollectionName.md +0 -33
  349. package/docs/reference/functions/runChain.md +0 -40
  350. package/docs/reference/functions/snakeCase.md +0 -28
  351. package/docs/reference/globals.md +0 -106
  352. package/docs/reference/interfaces/ACLRecord.md +0 -96
  353. package/docs/reference/interfaces/AccessControlList.md +0 -76
  354. package/docs/reference/interfaces/AuthResult.md +0 -55
  355. package/docs/reference/interfaces/AuthStrategy.md +0 -95
  356. package/docs/reference/interfaces/CreateRequestOptions.md +0 -121
  357. package/docs/reference/interfaces/DeleteRequestOptions.md +0 -137
  358. package/docs/reference/interfaces/FindRequestOptions.md +0 -133
  359. package/docs/reference/interfaces/HttpRequest.md +0 -147
  360. package/docs/reference/interfaces/HttpResponse.md +0 -164
  361. package/docs/reference/interfaces/JWTAuthResult.md +0 -84
  362. package/docs/reference/interfaces/RepoCreateOptions.md +0 -95
  363. package/docs/reference/interfaces/RepoDeleteOptions.md +0 -105
  364. package/docs/reference/interfaces/RepoFindOptions.md +0 -125
  365. package/docs/reference/interfaces/RepoOperationOptions.md +0 -69
  366. package/docs/reference/interfaces/RepoUpdateOptions.md +0 -101
  367. package/docs/reference/interfaces/RequestOptions.md +0 -112
  368. package/docs/reference/interfaces/RequestWS.md +0 -225
  369. package/docs/reference/interfaces/TruncateRequestOptions.md +0 -161
  370. package/docs/reference/interfaces/UpdateRequestOptions.md +0 -139
  371. package/docs/reference/type-aliases/ErrorHandler.md +0 -35
  372. package/docs/reference/type-aliases/NextFunction.md +0 -23
  373. package/docs/reference/type-aliases/OneOrMany.md +0 -19
  374. package/docs/reference/type-aliases/OneOrNull.md +0 -19
  375. package/docs/reference/type-aliases/PartialBaseEntity.md +0 -17
  376. package/docs/reference/type-aliases/PartialSimpleEntity.md +0 -17
  377. package/docs/reference/type-aliases/RequestHandler.md +0 -31
  378. package/docs/reference/type-aliases/UpdateObject.md +0 -19
  379. package/docs/reference/type-aliases/WsUpgradeAuth.md +0 -27
  380. package/docs/reference/type-aliases/WsUpgradeAuthResult.md +0 -47
@@ -9,11 +9,13 @@ var __metadata = (this && this.__metadata) || function (k, v) {
9
9
  };
10
10
  ////////////////////////////////////////////////////////////////////////////////
11
11
  // Copyright (C) 2020-2026 Jean-Philippe Steinmetz
12
+ // SPDX-License-Identifier: MPL-2.0
12
13
  ///////////////////////////////////////////////////////////////////////////////
13
14
  import { JWTUtils, ObjectDecorators } from "@rapidrest/core";
14
15
  import dayjs from "dayjs";
15
16
  import { createRequire } from "module";
16
- const { Config } = ObjectDecorators;
17
+ import { NetUtils } from "../NetUtils.js";
18
+ const { Config, Init, Logger } = ObjectDecorators;
17
19
  const _require = createRequire(process.cwd() + "/package.json");
18
20
  const duration = _require("dayjs/plugin/duration");
19
21
  dayjs.extend(duration);
@@ -61,6 +63,29 @@ export class JWTStrategy {
61
63
  this.options.headerKey = options.headerKey.toLowerCase();
62
64
  this._headerSchemeRegex = new RegExp("^" + this.options.headerScheme + "$", "i");
63
65
  }
66
+ init() {
67
+ // Signed-cookie verification was never implemented (req.signedCookies is always `{}` in both HTTP
68
+ // adapters — see getAuthToken() below), so enabling this option silently disables cookie-based
69
+ // authentication entirely rather than adding the extra verification an operator would expect from the
70
+ // name. Warn loudly at startup instead of letting that be discovered as a confusing runtime auth failure.
71
+ if (this.options.cookieSecure) {
72
+ this.logger?.warn("JWTStrategyOptions.cookieSecure is enabled, but signed-cookie verification is not implemented. " +
73
+ "Cookie-based authentication is disabled while this option is set to true — set it to false " +
74
+ "to authenticate via the plain `jwt` cookie instead.");
75
+ }
76
+ // Defense-in-depth only: the underlying jsonwebtoken library already restricts verification to
77
+ // algorithms compatible with the configured key's type when `options.algorithms` is left unset, so
78
+ // this isn't currently exploitable. Pinning it explicitly for the common case of a plain symmetric
79
+ // secret removes any reliance on that library default. Left untouched for PEM/asymmetric keys —
80
+ // there's no reliable way to guess the intended algorithm family (RS/ES/PS, key size) from the key's
81
+ // runtime shape alone, and guessing wrong would break those apps' verification entirely.
82
+ if (this.config &&
83
+ !this.config.options?.algorithms &&
84
+ typeof this.config.secret === "string" &&
85
+ !this.config.secret.includes("BEGIN")) {
86
+ this.config.options = { ...this.config.options, algorithms: ["HS256"] };
87
+ }
88
+ }
64
89
  /**
65
90
  * Scans the provided request object for an authentication token this strategy can process.
66
91
  * @param req The request to scan for an auth token.
@@ -76,14 +101,16 @@ export class JWTStrategy {
76
101
  this.options.queryKey in req.query) {
77
102
  authToken = req.query[this.options.queryKey];
78
103
  }
79
- // Next check the headers. It's possible there is more than one header value defined. Loop through each of
104
+ // Next check the headers, but only if a higher-precedence source (the query parameter above)
105
+ // hasn't already supplied a token — a later-checked, lower-precedence source must never override
106
+ // an earlier one. It's possible there is more than one header value defined; loop through each of
80
107
  // them until we have a verified token.
81
- if (this.options.headerKey && this.options.headerKey in req.headers) {
108
+ if (!authToken && this.options.headerKey && this.options.headerKey in req.headers) {
82
109
  const value = req.headers[this.options.headerKey];
83
110
  const headers = Array.isArray(value) ? value : typeof value === "string" ? [value] : [];
84
111
  // Loop through the headers looking for Authentication and our scheme
85
- for (const header in headers) {
86
- const parts = headers[header].split(" ");
112
+ for (const header of headers) {
113
+ const parts = header.split(" ");
87
114
  if (parts.length !== 2) {
88
115
  continue;
89
116
  }
@@ -91,17 +118,21 @@ export class JWTStrategy {
91
118
  continue;
92
119
  }
93
120
  authToken = parts[1];
121
+ break;
94
122
  }
95
123
  }
96
- // Check the cookie header — only overwrite if a value is actually present
97
- if (this.options.cookieSecure && this.options.cookieName && req.signedCookies) {
98
- // TODO Decrypt the signed cookie
124
+ // Check the cookie header — lowest precedence, so only consulted if neither the query parameter
125
+ // nor the header supplied a token above.
126
+ // TODO Decrypt the signed cookie — until this is implemented, req.signedCookies is always `{}` (see
127
+ // both HTTP adapters), so this branch never finds a token; init() warns at startup when cookieSecure
128
+ // is enabled so that's not a silent failure.
129
+ if (!authToken && this.options.cookieSecure && this.options.cookieName && req.signedCookies) {
99
130
  const cookieToken = req.signedCookies[this.options.cookieName];
100
131
  if (cookieToken) {
101
132
  authToken = cookieToken;
102
133
  }
103
134
  }
104
- if (!this.options.cookieSecure && this.options.cookieName && req.cookies) {
135
+ if (!authToken && !this.options.cookieSecure && this.options.cookieName && req.cookies) {
105
136
  const cookieToken = req.cookies[this.options.cookieName];
106
137
  if (cookieToken) {
107
138
  authToken = cookieToken;
@@ -109,7 +140,7 @@ export class JWTStrategy {
109
140
  }
110
141
  return authToken;
111
142
  }
112
- async authenticate(req, res, required) {
143
+ async authenticate(req, res) {
113
144
  let user = undefined;
114
145
  let authPayload = undefined;
115
146
  let authToken = this.getAuthToken(req);
@@ -122,6 +153,14 @@ export class JWTStrategy {
122
153
  }
123
154
  authPayload = payload;
124
155
  if (user) {
156
+ // If sessions are enabled, update the stored information about the authenticated user
157
+ if (req.session) {
158
+ const now = Date.now();
159
+ req.session.ip = NetUtils.getIPAddress(req);
160
+ req.session.lastAccess = now;
161
+ req.session.lastLogin = req.session.lastLogin ?? now;
162
+ req.session.userUid = user.uid;
163
+ }
125
164
  return {
126
165
  data: authToken,
127
166
  method: this.name,
@@ -131,12 +170,9 @@ export class JWTStrategy {
131
170
  };
132
171
  }
133
172
  }
134
- if (required) {
135
- throw new Error("Invalid or missing auth token.");
136
- }
137
173
  return undefined;
138
174
  }
139
- authenticateSync(req, res, required) {
175
+ authenticateSync(req, res) {
140
176
  let user = undefined;
141
177
  let authPayload = undefined;
142
178
  let authToken = this.getAuthToken(req);
@@ -149,6 +185,14 @@ export class JWTStrategy {
149
185
  }
150
186
  authPayload = payload;
151
187
  if (user) {
188
+ // If sessions are enabled, update the stored information about the authenticated user
189
+ if (req.session) {
190
+ const now = Date.now();
191
+ req.session.ip = NetUtils.getIPAddress(req);
192
+ req.session.lastAccess = now;
193
+ req.session.lastLogin = req.session.lastLogin ?? now;
194
+ req.session.userUid = user.uid;
195
+ }
152
196
  return {
153
197
  data: authToken,
154
198
  method: this.name,
@@ -158,9 +202,6 @@ export class JWTStrategy {
158
202
  };
159
203
  }
160
204
  }
161
- if (required) {
162
- throw new Error("Invalid or missing auth token.");
163
- }
164
205
  return undefined;
165
206
  }
166
207
  }
@@ -168,4 +209,14 @@ __decorate([
168
209
  Config("auth"),
169
210
  __metadata("design:type", Object)
170
211
  ], JWTStrategy.prototype, "config", void 0);
212
+ __decorate([
213
+ Logger,
214
+ __metadata("design:type", Object)
215
+ ], JWTStrategy.prototype, "logger", void 0);
216
+ __decorate([
217
+ Init,
218
+ __metadata("design:type", Function),
219
+ __metadata("design:paramtypes", []),
220
+ __metadata("design:returntype", void 0)
221
+ ], JWTStrategy.prototype, "init", null);
171
222
  //# sourceMappingURL=JWTStrategy.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"JWTStrategy.js","sourceRoot":"","sources":["../../../src/auth/JWTStrategy.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"JWTStrategy.js","sourceRoot":"","sources":["../../../src/auth/JWTStrategy.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,4 @@
1
1
  export * from "./AuthMiddleware.js";
2
2
  export * from "./AuthStrategy.js";
3
- export * from "./BasicStrategy.js";
4
3
  export * from "./JWTStrategy.js";
5
4
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/auth/index.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/auth/index.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC"}
@@ -1,5 +1,6 @@
1
1
  ///////////////////////////////////////////////////////////////////////////////
2
2
  // Copyright (C) 2020-2026 Jean-Philippe Steinmetz. All rights reserved.
3
+ // SPDX-License-Identifier: MPL-2.0
3
4
  ///////////////////////////////////////////////////////////////////////////////
4
5
  import { MongoConnection } from "./MongoConnection.js";
5
6
  /**
@@ -11,4 +12,18 @@ import { MongoConnection } from "./MongoConnection.js";
11
12
  export function isSqlDataSource(conn) {
12
13
  return !!conn && typeof conn.getRepository === "function" && !(conn instanceof MongoConnection);
13
14
  }
15
+ /**
16
+ * Dynamically imports the `redis` package, throwing a helpful error if it isn't installed. `redis` is a peer
17
+ * dependency (like `mongodb` and `typeorm`) rather than a hard dependency of this package, so it must only be
18
+ * loaded when a consumer actually configures a redis-backed feature — never imported at the top of a module
19
+ * that's always loaded, or every consumer would be forced to install it regardless of whether they use it.
20
+ */
21
+ export async function importRedis() {
22
+ try {
23
+ return await import("redis");
24
+ }
25
+ catch (err) {
26
+ throw new Error("This feature requires the optional peer dependency 'redis'. Install it with: yarn add redis");
27
+ }
28
+ }
14
29
  //# sourceMappingURL=ConnectionKinds.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ConnectionKinds.js","sourceRoot":"","sources":["../../../src/database/ConnectionKinds.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,wEAAwE;AACxE,+EAA+E;AAC/E,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAEvD;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAAC,IAAS;IACrC,OAAO,CAAC,CAAC,IAAI,IAAI,OAAO,IAAI,CAAC,aAAa,KAAK,UAAU,IAAI,CAAC,CAAC,IAAI,YAAY,eAAe,CAAC,CAAC;AACpG,CAAC"}
1
+ {"version":3,"file":"ConnectionKinds.js","sourceRoot":"","sources":["../../../src/database/ConnectionKinds.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,wEAAwE;AACxE,mCAAmC;AACnC,+EAA+E;AAC/E,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAEvD;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAAC,IAAS;IACrC,OAAO,CAAC,CAAC,IAAI,IAAI,OAAO,IAAI,CAAC,aAAa,KAAK,UAAU,IAAI,CAAC,CAAC,IAAI,YAAY,eAAe,CAAC,CAAC;AACpG,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW;IAC7B,IAAI,CAAC;QACD,OAAO,MAAM,MAAM,CAAC,OAAO,CAAC,CAAC;IACjC,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAChB,MAAM,IAAI,KAAK,CAAC,6FAA6F,CAAC,CAAC;IACnH,CAAC;AACL,CAAC"}
@@ -9,10 +9,10 @@ var __metadata = (this && this.__metadata) || function (k, v) {
9
9
  };
10
10
  ////////////////////////////////////////////////////////////////////////////////
11
11
  // Copyright (C) 2020-2026 Jean-Philippe Steinmetz
12
+ // SPDX-License-Identifier: MPL-2.0
12
13
  ///////////////////////////////////////////////////////////////////////////////
13
14
  import { ObjectDecorators } from "@rapidrest/core";
14
- import { Redis } from "ioredis";
15
- import { isSqlDataSource } from "./ConnectionKinds.js";
15
+ import { importRedis, isSqlDataSource } from "./ConnectionKinds.js";
16
16
  import { MongoConnection } from "./MongoConnection.js";
17
17
  import { MongoSchemaSync } from "./MongoSchemaSync.js";
18
18
  const { Destroy, Logger } = ObjectDecorators;
@@ -35,17 +35,24 @@ export class ConnectionManager {
35
35
  }
36
36
  else {
37
37
  if (!config.type || !config.host) {
38
- throw new Error(`Invalid datastore config: ${JSON.stringify(config)}.`);
38
+ throw new Error(`Invalid datasource config: ${JSON.stringify(config)}.`);
39
39
  }
40
40
  return `${config.protocol ? config.protocol : config.type}://${config.username && config.password ? `${config.username}:${config.password}@` : ""}${config.host}${config.port ? `:${config.port}` : ""}${config.database ? `/${config.database}` : ""}${config.options ? `?${config.options}` : ""}`;
41
41
  }
42
42
  }
43
+ /**
44
+ * Redacts the userinfo (credentials) portion of a connection URI for safe logging, regardless of
45
+ * whether the URI came from a `url` config field or was built from separate username/password fields.
46
+ */
47
+ redactUri(uri) {
48
+ return uri.replace(/:\/\/[^@/]+@/, "://****@");
49
+ }
43
50
  /**
44
51
  * Dynamically imports the given optional peer dependency, throwing a helpful error if it is not installed.
45
52
  *
46
53
  * @param pkg The name of the package to import.
47
- * @param datastoreName The name of the datastore requiring the package.
48
- * @param datastoreType The type of the datastore requiring the package.
54
+ * @param datastoreName The name of the datasource requiring the package.
55
+ * @param datastoreType The type of the datasource requiring the package.
49
56
  */
50
57
  async importOptionalDependency(pkg, datastoreName, datastoreType) {
51
58
  try {
@@ -55,6 +62,33 @@ export class ConnectionManager {
55
62
  throw new Error(`Datastore '${datastoreName}' is of type '${datastoreType}' which requires the optional peer dependency '${pkg}'. Install it with: yarn add ${pkg}`);
56
63
  }
57
64
  }
65
+ /**
66
+ * Determines whether the given MongoDB deployment supports multi-document transactions (i.e. is configured
67
+ * as a replica set or a sharded cluster) by inspecting the `hello` handshake response. A standalone
68
+ * `mongod` responds with neither `setName` (replica set membership) nor `msg: "isdbgrid"` (mongos), and
69
+ * doesn't support transactions at all.
70
+ *
71
+ * @param db The database to check.
72
+ * @param name The name of the datastore, used only for the log message if transactions aren't supported.
73
+ */
74
+ async detectMongoTransactionSupport(db, name) {
75
+ try {
76
+ const hello = await db.admin().command({ hello: 1 });
77
+ const supported = !!hello.setName || hello.msg === "isdbgrid";
78
+ if (!supported) {
79
+ this.logger.warn(`Datastore '${name}' is a standalone MongoDB instance and does not support multi-document ` +
80
+ `transactions. @Transactional will run without a transaction for models on this ` +
81
+ `datastore. Configure MongoDB as a replica set (or sharded cluster) to enable it.`);
82
+ }
83
+ return supported;
84
+ }
85
+ catch (err) {
86
+ this.logger.warn(`Datastore '${name}': failed to determine whether the MongoDB deployment supports ` +
87
+ `transactions (${err.message}). Assuming it does not; @Transactional will run without a ` +
88
+ `transaction for models on this datastore.`);
89
+ return false;
90
+ }
91
+ }
58
92
  /**
59
93
  * Attempts to initiate all database connections as defined in the config.
60
94
  *
@@ -63,65 +97,96 @@ export class ConnectionManager {
63
97
  */
64
98
  async connect(datastores, models) {
65
99
  const processedModels = new Map();
66
- // Go through each datastore in the configuration and attempt to make a connection
100
+ // Redis-type datastores are connected sequentially, separately from the concurrent Promise.all below
101
+ // for every other datastore. Two concurrent *first* dynamic imports of the same module can, under
102
+ // some tooling that mocks dynamic imports (e.g. Vitest), non-deterministically resolve to a mix of
103
+ // the mocked and the real module instead of consistently returning the mock — sequencing avoids ever
104
+ // having two redis connection attempts in flight at once, which is where that surfaces. Redis
105
+ // connections are cheap enough that this isn't a meaningful hit to startup concurrency.
106
+ const redisNames = Object.keys(datastores).filter((name) => datastores[name]?.type === "redis");
107
+ for (const name of redisNames) {
108
+ await this.connectDatastore(name, datastores[name], models, processedModels);
109
+ }
110
+ const pending = [];
67
111
  for (const name in datastores) {
68
- const datastore = datastores[name];
69
- // It's possible that the connection was already configured during a previous run. In that case we will
70
- // attempt to reconnect instead of creating a new connection.
71
- let connection = this.connections.get(name);
72
- if (connection && isSqlDataSource(connection) && !connection.isInitialized) {
73
- this.logger.info(`Reconnecting to database ${name}...`);
74
- await connection.initialize();
112
+ if (!redisNames.includes(name)) {
113
+ pending.push(this.connectDatastore(name, datastores[name], models, processedModels));
75
114
  }
76
- if (!connection) {
77
- datastore.name = name;
78
- const url = this.buildConnectionUri(datastore);
79
- this.logger.info(`Connecting to database ${name} [${url.replace(datastore.username, "****").replace(datastore.password, "****")}]...`);
80
- if (datastore.type === "redis") {
81
- connection = new Redis(url);
82
- }
83
- else {
84
- // Make an array of all entities associated with this connection
85
- const entities = [];
86
- for (const className of models.keys()) {
87
- // Get the class type
88
- const clazz = models.get(className);
89
- const ds = Reflect.getMetadata("rrst:datastore", clazz);
90
- // Search for the associated datastore with the model via either config or @Model decorator
91
- if (ds === name || (datastore.entities && datastore.entities.includes(className))) {
92
- const processedDatastore = processedModels.get(clazz.name);
93
- if (processedDatastore) {
94
- throw new Error(`Model ${clazz.name} already defined as an entity for ${processedDatastore}`);
95
- }
96
- clazz.datastore = name;
97
- entities.push(clazz);
98
- processedModels.set(clazz.name, name);
99
- }
100
- }
101
- if (datastore.type === "mongodb" || datastore.type === "mongodb+srv") {
102
- // Connect using the native MongoDB driver
103
- const { MongoClient } = await this.importOptionalDependency("mongodb", name, datastore.type);
104
- const client = new MongoClient(url, datastore.clientOptions);
105
- await client.connect();
106
- const db = client.db(datastore.database);
107
- connection = new MongoConnection(name, client, db, entities);
108
- // Perform structure synchronization when requested
109
- if (datastore.synchronize) {
110
- const schemaSync = new MongoSchemaSync(db, this.logger);
111
- await schemaSync.synchronize(entities);
115
+ }
116
+ await Promise.all(pending);
117
+ this.logger.info(`Successfully connected to all configured databases.`);
118
+ }
119
+ /**
120
+ * Establishes (or reconnects) a single configured datasource connection and stores it in `this.connections`.
121
+ *
122
+ * @param name The configured name of the datasource.
123
+ * @param datasource The datasource's configuration.
124
+ * @param models A map of model names and associated class definitions to establish database connections for.
125
+ * @param processedModels Tracks which datasource each model class has already been claimed as an entity for,
126
+ * shared across every concurrent call from `connect()` so a model claimed by two datastores is still caught.
127
+ */
128
+ async connectDatastore(name, datasource, models, processedModels) {
129
+ // It's possible that the connection was already configured during a previous run. In that case we will
130
+ // attempt to reconnect instead of creating a new connection.
131
+ let connection = this.connections.get(name);
132
+ if (connection && isSqlDataSource(connection) && !connection.isInitialized) {
133
+ this.logger.info(`Reconnecting to database ${name}...`);
134
+ await connection.initialize();
135
+ }
136
+ if (!connection) {
137
+ datasource.name = name;
138
+ const url = this.buildConnectionUri(datasource);
139
+ this.logger.info(`Connecting to database ${name} [${this.redactUri(url)}]...`);
140
+ if (datasource.type === "redis") {
141
+ // Uses a literal `import("redis")` specifier (via importRedis()) rather than this class's
142
+ // generic importOptionalDependency(pkg, ...) helper, whose variable specifier bundler/test
143
+ // tooling (e.g. Vitest's module mocking) can't always statically analyze and intercept.
144
+ const { createClient } = await importRedis();
145
+ const redisConn = createClient({ url });
146
+ await redisConn.connect();
147
+ connection = redisConn;
148
+ }
149
+ else {
150
+ // Make an array of all entities associated with this connection
151
+ const entities = [];
152
+ for (const className of models.keys()) {
153
+ // Get the class type
154
+ const clazz = models.get(className);
155
+ const ds = Reflect.getMetadata("rrst:datasource", clazz);
156
+ // Search for the associated datasource with the model via either config or @Model decorator
157
+ if (ds === name || (datasource.entities && datasource.entities.includes(className))) {
158
+ const processedDatastore = processedModels.get(clazz.name);
159
+ if (processedDatastore) {
160
+ throw new Error(`Model ${clazz.name} already defined as an entity for ${processedDatastore}`);
112
161
  }
162
+ clazz.datasource = name;
163
+ entities.push(clazz);
164
+ processedModels.set(clazz.name, name);
113
165
  }
114
- else {
115
- // Connect using TypeORM
116
- await this.importOptionalDependency("typeorm", name, datastore.type);
117
- const orm = await import("./TypeOrmSupport.js");
118
- connection = await orm.connect(name, datastore, entities, url);
166
+ }
167
+ if (datasource.type === "mongodb" || datasource.type === "mongodb+srv") {
168
+ // Connect using the native MongoDB driver
169
+ const { MongoClient } = await this.importOptionalDependency("mongodb", name, datasource.type);
170
+ const client = new MongoClient(url, datasource.clientOptions);
171
+ await client.connect();
172
+ const db = client.db(datasource.database);
173
+ const supportsTransactions = await this.detectMongoTransactionSupport(db, name);
174
+ connection = new MongoConnection(name, client, db, entities, supportsTransactions);
175
+ // Perform structure synchronization when requested
176
+ if (datasource.synchronize) {
177
+ const schemaSync = new MongoSchemaSync(db, this.logger);
178
+ await schemaSync.synchronize(entities);
119
179
  }
120
180
  }
181
+ else {
182
+ // Connect using TypeORM
183
+ await this.importOptionalDependency("typeorm", name, datasource.type);
184
+ const orm = await import("./TypeOrmSupport.js");
185
+ connection = await orm.connect(name, datasource, entities, url);
186
+ }
121
187
  }
122
- this.connections.set(name, connection);
123
188
  }
124
- this.logger.info(`Successfully connected to all configured databases.`);
189
+ this.connections.set(name, connection);
125
190
  }
126
191
  /**
127
192
  * Attempts to disconnect all active database connections.
@@ -134,13 +199,27 @@ export class ConnectionManager {
134
199
  await conn.close();
135
200
  }
136
201
  }
137
- else if (conn instanceof Redis) {
138
- if (conn.status === "ready") {
139
- conn.disconnect();
202
+ else if (isSqlDataSource(conn)) {
203
+ const sqlConn = conn;
204
+ if (sqlConn.isInitialized) {
205
+ await sqlConn.destroy();
140
206
  }
141
207
  }
142
- else if (isSqlDataSource(conn) && conn.isInitialized) {
143
- await conn.destroy();
208
+ else if (typeof conn.disconnect === "function") {
209
+ // The only other connection kind this class ever creates is a redis client. Duck-typed
210
+ // (rather than `instanceof RedisClient`) so `redis` doesn't need to be imported here just
211
+ // to identify a connection this class already knows isn't Mongo or SQL — it's a peer
212
+ // dependency, loaded dynamically only where actually needed (see connectDatastore()).
213
+ const redis = conn;
214
+ // Disconnect regardless of whether the connection ever reached "ready" — one
215
+ // stuck retrying against an unreachable server (isOpen stays true while it keeps
216
+ // retrying in the background) must still be torn down here, or it leaks an
217
+ // endlessly-retrying client with active reconnect timers past this
218
+ // ConnectionManager's lifetime. `isOpen` is false only once the client has actually
219
+ // closed, so a redundant disconnect() call is skipped in that case.
220
+ if (redis.isOpen) {
221
+ await redis.disconnect();
222
+ }
144
223
  }
145
224
  }
146
225
  }
@@ -1 +1 @@
1
- {"version":3,"file":"ConnectionManager.js","sourceRoot":"","sources":["../../../src/database/ConnectionManager.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ConnectionManager.js","sourceRoot":"","sources":["../../../src/database/ConnectionManager.ts"],"names":[],"mappings":"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"}
@@ -2,7 +2,7 @@ import { MongoRepository } from "./MongoRepository.js";
2
2
  import { resolveCollectionName } from "./NamingUtils.js";
3
3
  /**
4
4
  * Represents a single named connection to a MongoDB database using the native `mongodb` driver, including the
5
- * registry of all model classes assigned to the connection's datastore.
5
+ * registry of all model classes assigned to the connection's datasource.
6
6
  *
7
7
  * Note that this class only references the `mongodb` package via type-only imports and is therefore safe to load
8
8
  * when the optional `mongodb` peer dependency is not installed.
@@ -10,13 +10,14 @@ import { resolveCollectionName } from "./NamingUtils.js";
10
10
  * @author Jean-Philippe Steinmetz <rapidrests@gmail.com>
11
11
  */
12
12
  export class MongoConnection {
13
- constructor(name, client, db, entities) {
13
+ constructor(name, client, db, entities, supportsTransactions = false) {
14
14
  this.connected = true;
15
15
  this.entities = new Map();
16
16
  this.repos = new Map();
17
17
  this.name = name;
18
18
  this.client = client;
19
19
  this.db = db;
20
+ this.supportsTransactions = supportsTransactions;
20
21
  if (entities) {
21
22
  for (const clazz of entities) {
22
23
  this.entities.set(clazz.name, clazz);
@@ -62,7 +63,7 @@ export class MongoConnection {
62
63
  if (typeof classOrName === "string") {
63
64
  clazz = this.entities.get(classOrName);
64
65
  if (!clazz) {
65
- throw new Error(`No entity named '${classOrName}' is registered with datastore '${this.name}'.`);
66
+ throw new Error(`No entity named '${classOrName}' is registered with datasource '${this.name}'.`);
66
67
  }
67
68
  }
68
69
  let repo = this.repos.get(clazz);
@@ -82,5 +83,14 @@ export class MongoConnection {
82
83
  getMongoRepository(classOrName) {
83
84
  return this.getRepository(classOrName);
84
85
  }
86
+ /**
87
+ * Creates a new client session for performing transactions using the provided options.
88
+ *
89
+ * @param options The options to start the session with.
90
+ * @returns The newly started session.
91
+ */
92
+ startSession(options) {
93
+ return this.client.startSession(options);
94
+ }
85
95
  }
86
96
  //# sourceMappingURL=MongoConnection.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"MongoConnection.js","sourceRoot":"","sources":["../../../src/database/MongoConnection.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAEzD;;;;;;;;GAQG;AACH,MAAM,OAAO,eAAe;IAYxB,YAAY,IAAY,EAAE,MAAmB,EAAE,EAAM,EAAE,QAAwB;QAJvE,cAAS,GAAY,IAAI,CAAC;QAC1B,aAAQ,GAAqB,IAAI,GAAG,EAAE,CAAC;QACvC,UAAK,GAAmC,IAAI,GAAG,EAAE,CAAC;QAGtD,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;QAEb,IAAI,QAAQ,EAAE,CAAC;YACX,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE,CAAC;gBAC3B,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;YACzC,CAAC;QACL,CAAC;IACL,CAAC;IAED,mEAAmE;IACnE,IAAW,WAAW;QAClB,OAAO,IAAI,CAAC,SAAS,CAAC;IAC1B,CAAC;IAED,8DAA8D;IACvD,KAAK;QACR,OAAO,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC;IAC3B,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,KAAK;QACd,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;QACvB,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;IAC9B,CAAC;IAED;;;;OAIG;IACI,iBAAiB,CAAC,KAAU;QAC/B,OAAO,qBAAqB,CAAC,KAAK,CAAC,CAAC;IACxC,CAAC;IAED;;OAEG;IACH,IAAW,aAAa;QACpB,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;IAC9C,CAAC;IAED;;;;OAIG;IACI,aAAa,CAAyB,WAAyB;QAClE,IAAI,KAAK,GAAQ,WAAW,CAAC;QAC7B,IAAI,OAAO,WAAW,KAAK,QAAQ,EAAE,CAAC;YAClC,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;YACvC,IAAI,CAAC,KAAK,EAAE,CAAC;gBACT,MAAM,IAAI,KAAK,CAAC,oBAAoB,WAAW,mCAAmC,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC;YACrG,CAAC;QACL,CAAC;QAED,IAAI,IAAI,GAAqC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACnE,IAAI,CAAC,IAAI,EAAE,CAAC;YACR,MAAM,cAAc,GAAW,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;YAC7D,IAAI,GAAG,IAAI,eAAe,CAAM,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE,KAAK,CAAC,CAAC;YACpF,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QAChC,CAAC;QAED,OAAO,IAA0B,CAAC;IACtC,CAAC;IAED;;;;;OAKG;IACI,kBAAkB,CAAyB,WAAyB;QACvE,OAAO,IAAI,CAAC,aAAa,CAAI,WAAW,CAAC,CAAC;IAC9C,CAAC;CACJ"}
1
+ {"version":3,"file":"MongoConnection.js","sourceRoot":"","sources":["../../../src/database/MongoConnection.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAEzD;;;;;;;;GAQG;AACH,MAAM,OAAO,eAAe;IAkBxB,YACI,IAAY,EACZ,MAAmB,EACnB,EAAM,EACN,QAAwB,EACxB,uBAAgC,KAAK;QATjC,cAAS,GAAY,IAAI,CAAC;QAC1B,aAAQ,GAAqB,IAAI,GAAG,EAAE,CAAC;QACvC,UAAK,GAAmC,IAAI,GAAG,EAAE,CAAC;QAStD,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,oBAAoB,GAAG,oBAAoB,CAAC;QAEjD,IAAI,QAAQ,EAAE,CAAC;YACX,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE,CAAC;gBAC3B,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;YACzC,CAAC;QACL,CAAC;IACL,CAAC;IAED,mEAAmE;IACnE,IAAW,WAAW;QAClB,OAAO,IAAI,CAAC,SAAS,CAAC;IAC1B,CAAC;IAED,8DAA8D;IACvD,KAAK;QACR,OAAO,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC;IAC3B,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,KAAK;QACd,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;QACvB,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;IAC9B,CAAC;IAED;;;;OAIG;IACI,iBAAiB,CAAC,KAAU;QAC/B,OAAO,qBAAqB,CAAC,KAAK,CAAC,CAAC;IACxC,CAAC;IAED;;OAEG;IACH,IAAW,aAAa;QACpB,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;IAC9C,CAAC;IAED;;;;OAIG;IACI,aAAa,CAAyB,WAAyB;QAClE,IAAI,KAAK,GAAQ,WAAW,CAAC;QAC7B,IAAI,OAAO,WAAW,KAAK,QAAQ,EAAE,CAAC;YAClC,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;YACvC,IAAI,CAAC,KAAK,EAAE,CAAC;gBACT,MAAM,IAAI,KAAK,CAAC,oBAAoB,WAAW,oCAAoC,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC;YACtG,CAAC;QACL,CAAC;QAED,IAAI,IAAI,GAAqC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACnE,IAAI,CAAC,IAAI,EAAE,CAAC;YACR,MAAM,cAAc,GAAW,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;YAC7D,IAAI,GAAG,IAAI,eAAe,CAAM,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE,KAAK,CAAC,CAAC;YACpF,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QAChC,CAAC;QAED,OAAO,IAA0B,CAAC;IACtC,CAAC;IAED;;;;;OAKG;IACI,kBAAkB,CAAyB,WAAyB;QACvE,OAAO,IAAI,CAAC,aAAa,CAAI,WAAW,CAAC,CAAC;IAC9C,CAAC;IAED;;;;;OAKG;IACI,YAAY,CAAC,OAA8B;QAC9C,OAAO,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;IAC7C,CAAC;CACJ"}