@bett3r-dev/pv3 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 (393) hide show
  1. package/build/adapters/cache/index.d.ts +2 -0
  2. package/build/adapters/cache/index.d.ts.map +1 -0
  3. package/build/adapters/cache/index.js +18 -0
  4. package/build/adapters/cache/index.js.map +1 -0
  5. package/build/adapters/cache/memory/__tests__/memoryCache.test.d.ts +1 -0
  6. package/build/adapters/cache/memory/__tests__/memoryCache.test.d.ts.map +1 -0
  7. package/build/adapters/cache/memory/__tests__/memoryCache.test.js +6 -0
  8. package/build/adapters/cache/memory/__tests__/memoryCache.test.js.map +1 -0
  9. package/build/adapters/cache/memory/index.d.ts +3 -0
  10. package/build/adapters/cache/memory/index.d.ts.map +1 -0
  11. package/build/adapters/cache/memory/index.js +119 -0
  12. package/build/adapters/cache/memory/index.js.map +1 -0
  13. package/build/adapters/configuration/__tests__/dotEnv.test.d.ts +2 -0
  14. package/build/adapters/configuration/__tests__/dotEnv.test.d.ts.map +1 -0
  15. package/build/adapters/configuration/__tests__/dotEnv.test.js +43 -0
  16. package/build/adapters/configuration/__tests__/dotEnv.test.js.map +1 -0
  17. package/build/adapters/configuration/dotEnv.d.ts +3 -0
  18. package/build/adapters/configuration/dotEnv.d.ts.map +1 -0
  19. package/build/adapters/configuration/dotEnv.js +35 -0
  20. package/build/adapters/configuration/dotEnv.js.map +1 -0
  21. package/build/adapters/configuration/index.d.ts +2 -0
  22. package/build/adapters/configuration/index.d.ts.map +1 -0
  23. package/build/adapters/configuration/index.js +18 -0
  24. package/build/adapters/configuration/index.js.map +1 -0
  25. package/build/adapters/database/index.d.ts +2 -0
  26. package/build/adapters/database/index.d.ts.map +1 -0
  27. package/build/adapters/database/index.js +18 -0
  28. package/build/adapters/database/index.js.map +1 -0
  29. package/build/adapters/database/memory/__tests__/memoryDb.test.d.ts +1 -0
  30. package/build/adapters/database/memory/__tests__/memoryDb.test.d.ts.map +1 -0
  31. package/build/adapters/database/memory/__tests__/memoryDb.test.js +36 -0
  32. package/build/adapters/database/memory/__tests__/memoryDb.test.js.map +1 -0
  33. package/build/adapters/database/memory/index.d.ts +3 -0
  34. package/build/adapters/database/memory/index.d.ts.map +1 -0
  35. package/build/adapters/database/memory/index.js +241 -0
  36. package/build/adapters/database/memory/index.js.map +1 -0
  37. package/build/adapters/endpoints/addAuthUser/index.d.ts +8 -0
  38. package/build/adapters/endpoints/addAuthUser/index.d.ts.map +1 -0
  39. package/build/adapters/endpoints/addAuthUser/index.js +57 -0
  40. package/build/adapters/endpoints/addAuthUser/index.js.map +1 -0
  41. package/build/adapters/endpoints/endpointValidation/index.d.ts +4 -0
  42. package/build/adapters/endpoints/endpointValidation/index.d.ts.map +1 -0
  43. package/build/adapters/endpoints/endpointValidation/index.js +27 -0
  44. package/build/adapters/endpoints/endpointValidation/index.js.map +1 -0
  45. package/build/adapters/endpoints/index.d.ts +4 -0
  46. package/build/adapters/endpoints/index.d.ts.map +1 -0
  47. package/build/adapters/endpoints/index.js +21 -0
  48. package/build/adapters/endpoints/index.js.map +1 -0
  49. package/build/adapters/endpoints/localAuthorization/index.d.ts +1 -0
  50. package/build/adapters/endpoints/localAuthorization/index.d.ts.map +1 -0
  51. package/build/adapters/endpoints/localAuthorization/index.js +68 -0
  52. package/build/adapters/endpoints/localAuthorization/index.js.map +1 -0
  53. package/build/adapters/endpoints/tcpConsumer/index.d.ts +3 -0
  54. package/build/adapters/endpoints/tcpConsumer/index.d.ts.map +1 -0
  55. package/build/adapters/endpoints/tcpConsumer/index.js +64 -0
  56. package/build/adapters/endpoints/tcpConsumer/index.js.map +1 -0
  57. package/build/adapters/endpoints/userSession/index.d.ts +8 -0
  58. package/build/adapters/endpoints/userSession/index.d.ts.map +1 -0
  59. package/build/adapters/endpoints/userSession/index.js +43 -0
  60. package/build/adapters/endpoints/userSession/index.js.map +1 -0
  61. package/build/adapters/eventstore/database.d.ts +3 -0
  62. package/build/adapters/eventstore/database.d.ts.map +1 -0
  63. package/build/adapters/eventstore/database.js +156 -0
  64. package/build/adapters/eventstore/database.js.map +1 -0
  65. package/build/adapters/eventstore/index.d.ts +2 -0
  66. package/build/adapters/eventstore/index.d.ts.map +1 -0
  67. package/build/adapters/eventstore/index.js +18 -0
  68. package/build/adapters/eventstore/index.js.map +1 -0
  69. package/build/adapters/infrastructure/index.d.ts +2 -0
  70. package/build/adapters/infrastructure/index.d.ts.map +1 -0
  71. package/build/adapters/infrastructure/index.js +18 -0
  72. package/build/adapters/infrastructure/index.js.map +1 -0
  73. package/build/adapters/infrastructure/local/index.d.ts +4 -0
  74. package/build/adapters/infrastructure/local/index.d.ts.map +1 -0
  75. package/build/adapters/infrastructure/local/index.js +37 -0
  76. package/build/adapters/infrastructure/local/index.js.map +1 -0
  77. package/build/adapters/logger/console.d.ts +3 -0
  78. package/build/adapters/logger/console.d.ts.map +1 -0
  79. package/build/adapters/logger/console.js +38 -0
  80. package/build/adapters/logger/console.js.map +1 -0
  81. package/build/adapters/logger/index.d.ts +2 -0
  82. package/build/adapters/logger/index.d.ts.map +1 -0
  83. package/build/adapters/logger/index.js +18 -0
  84. package/build/adapters/logger/index.js.map +1 -0
  85. package/build/index.d.ts +23 -0
  86. package/build/index.d.ts.map +1 -0
  87. package/build/index.js +39 -0
  88. package/build/index.js.map +1 -0
  89. package/build/libraries/modules/fs.d.ts +12 -0
  90. package/build/libraries/modules/fs.d.ts.map +1 -0
  91. package/build/libraries/modules/fs.js +103 -0
  92. package/build/libraries/modules/fs.js.map +1 -0
  93. package/build/libraries/modules/index.d.ts +2 -0
  94. package/build/libraries/modules/index.d.ts.map +1 -0
  95. package/build/libraries/modules/index.js +18 -0
  96. package/build/libraries/modules/index.js.map +1 -0
  97. package/build/libraries/openApi/index.d.ts +2 -0
  98. package/build/libraries/openApi/index.d.ts.map +1 -0
  99. package/build/libraries/openApi/index.js +18 -0
  100. package/build/libraries/openApi/index.js.map +1 -0
  101. package/build/libraries/openApi/pruneUnusedRef.d.ts +3 -0
  102. package/build/libraries/openApi/pruneUnusedRef.d.ts.map +1 -0
  103. package/build/libraries/openApi/pruneUnusedRef.js +30 -0
  104. package/build/libraries/openApi/pruneUnusedRef.js.map +1 -0
  105. package/build/libraries/tcp/index.d.ts +8 -0
  106. package/build/libraries/tcp/index.d.ts.map +1 -0
  107. package/build/libraries/tcp/index.js +108 -0
  108. package/build/libraries/tcp/index.js.map +1 -0
  109. package/build/libraries/tcp/types.d.ts +45 -0
  110. package/build/libraries/tcp/types.d.ts.map +1 -0
  111. package/build/libraries/tcp/types.js +3 -0
  112. package/build/libraries/tcp/types.js.map +1 -0
  113. package/build/libraries/validation/__tests__/validation.test.d.ts +2 -0
  114. package/build/libraries/validation/__tests__/validation.test.d.ts.map +1 -0
  115. package/build/libraries/validation/__tests__/validation.test.js +53 -0
  116. package/build/libraries/validation/__tests__/validation.test.js.map +1 -0
  117. package/build/libraries/validation/index.d.ts +8 -0
  118. package/build/libraries/validation/index.d.ts.map +1 -0
  119. package/build/libraries/validation/index.js +51 -0
  120. package/build/libraries/validation/index.js.map +1 -0
  121. package/build/ports/authentication/index.d.ts +12 -0
  122. package/build/ports/authentication/index.d.ts.map +1 -0
  123. package/build/ports/authentication/index.js +23 -0
  124. package/build/ports/authentication/index.js.map +1 -0
  125. package/build/ports/base.d.ts +7 -0
  126. package/build/ports/base.d.ts.map +1 -0
  127. package/build/ports/base.js +25 -0
  128. package/build/ports/base.js.map +1 -0
  129. package/build/ports/cache/index.d.ts +3 -0
  130. package/build/ports/cache/index.d.ts.map +1 -0
  131. package/build/ports/cache/index.js +19 -0
  132. package/build/ports/cache/index.js.map +1 -0
  133. package/build/ports/configuration/__tests__/configurationPort.test.d.ts +2 -0
  134. package/build/ports/configuration/__tests__/configurationPort.test.d.ts.map +1 -0
  135. package/build/ports/configuration/__tests__/configurationPort.test.js +51 -0
  136. package/build/ports/configuration/__tests__/configurationPort.test.js.map +1 -0
  137. package/build/ports/configuration/args.d.ts +57 -0
  138. package/build/ports/configuration/args.d.ts.map +1 -0
  139. package/build/ports/configuration/args.js +44 -0
  140. package/build/ports/configuration/args.js.map +1 -0
  141. package/build/ports/configuration/common.d.ts +2 -0
  142. package/build/ports/configuration/common.d.ts.map +1 -0
  143. package/build/ports/configuration/common.js +19 -0
  144. package/build/ports/configuration/common.js.map +1 -0
  145. package/build/ports/configuration/index.d.ts +10 -0
  146. package/build/ports/configuration/index.d.ts.map +1 -0
  147. package/build/ports/configuration/index.js +96 -0
  148. package/build/ports/configuration/index.js.map +1 -0
  149. package/build/ports/configuration/localConfig.d.ts +3 -0
  150. package/build/ports/configuration/localConfig.d.ts.map +1 -0
  151. package/build/ports/configuration/localConfig.js +108 -0
  152. package/build/ports/configuration/localConfig.js.map +1 -0
  153. package/build/ports/database/index.d.ts +4 -0
  154. package/build/ports/database/index.d.ts.map +1 -0
  155. package/build/ports/database/index.js +27 -0
  156. package/build/ports/database/index.js.map +1 -0
  157. package/build/ports/endpoints/__tests__/endpointsCall.test.d.ts +2 -0
  158. package/build/ports/endpoints/__tests__/endpointsCall.test.d.ts.map +1 -0
  159. package/build/ports/endpoints/__tests__/endpointsCall.test.js +21 -0
  160. package/build/ports/endpoints/__tests__/endpointsCall.test.js.map +1 -0
  161. package/build/ports/endpoints/__tests__/test-client-library/base.d.ts +77 -0
  162. package/build/ports/endpoints/__tests__/test-client-library/base.d.ts.map +1 -0
  163. package/build/ports/endpoints/__tests__/test-client-library/base.js +91 -0
  164. package/build/ports/endpoints/__tests__/test-client-library/base.js.map +1 -0
  165. package/build/ports/endpoints/__tests__/test-client-library/index.d.ts +29 -0
  166. package/build/ports/endpoints/__tests__/test-client-library/index.d.ts.map +1 -0
  167. package/build/ports/endpoints/__tests__/test-client-library/index.js +43 -0
  168. package/build/ports/endpoints/__tests__/test-client-library/index.js.map +1 -0
  169. package/build/ports/endpoints/__tests__/test-client-library/services/service.d.ts +106 -0
  170. package/build/ports/endpoints/__tests__/test-client-library/services/service.d.ts.map +1 -0
  171. package/build/ports/endpoints/__tests__/test-client-library/services/service.js +62 -0
  172. package/build/ports/endpoints/__tests__/test-client-library/services/service.js.map +1 -0
  173. package/build/ports/endpoints/__tests__/utils.test.d.ts +1 -0
  174. package/build/ports/endpoints/__tests__/utils.test.d.ts.map +1 -0
  175. package/build/ports/endpoints/__tests__/utils.test.js +53 -0
  176. package/build/ports/endpoints/__tests__/utils.test.js.map +1 -0
  177. package/build/ports/endpoints/index.d.ts +29 -0
  178. package/build/ports/endpoints/index.d.ts.map +1 -0
  179. package/build/ports/endpoints/index.js +263 -0
  180. package/build/ports/endpoints/index.js.map +1 -0
  181. package/build/ports/endpoints/openApi.d.ts +16 -0
  182. package/build/ports/endpoints/openApi.d.ts.map +1 -0
  183. package/build/ports/endpoints/openApi.js +187 -0
  184. package/build/ports/endpoints/openApi.js.map +1 -0
  185. package/build/ports/endpoints/utils.d.ts +17 -0
  186. package/build/ports/endpoints/utils.d.ts.map +1 -0
  187. package/build/ports/endpoints/utils.js +31 -0
  188. package/build/ports/endpoints/utils.js.map +1 -0
  189. package/build/ports/eventsourcing/__tests__/eventhandlers.test.d.ts +2 -0
  190. package/build/ports/eventsourcing/__tests__/eventhandlers.test.d.ts.map +1 -0
  191. package/build/ports/eventsourcing/__tests__/eventhandlers.test.js +35 -0
  192. package/build/ports/eventsourcing/__tests__/eventhandlers.test.js.map +1 -0
  193. package/build/ports/eventsourcing/__tests__/invariants.test.d.ts +2 -0
  194. package/build/ports/eventsourcing/__tests__/invariants.test.d.ts.map +1 -0
  195. package/build/ports/eventsourcing/__tests__/invariants.test.js +210 -0
  196. package/build/ports/eventsourcing/__tests__/invariants.test.js.map +1 -0
  197. package/build/ports/eventsourcing/commandHandlers/index.d.ts +25 -0
  198. package/build/ports/eventsourcing/commandHandlers/index.d.ts.map +1 -0
  199. package/build/ports/eventsourcing/commandHandlers/index.js +392 -0
  200. package/build/ports/eventsourcing/commandHandlers/index.js.map +1 -0
  201. package/build/ports/eventsourcing/commandTemplates/index.d.ts +3 -0
  202. package/build/ports/eventsourcing/commandTemplates/index.d.ts.map +1 -0
  203. package/build/ports/eventsourcing/commandTemplates/index.js +19 -0
  204. package/build/ports/eventsourcing/commandTemplates/index.js.map +1 -0
  205. package/build/ports/eventsourcing/commandTemplates/multiStream.d.ts +4 -0
  206. package/build/ports/eventsourcing/commandTemplates/multiStream.d.ts.map +1 -0
  207. package/build/ports/eventsourcing/commandTemplates/multiStream.js +73 -0
  208. package/build/ports/eventsourcing/commandTemplates/multiStream.js.map +1 -0
  209. package/build/ports/eventsourcing/commandTemplates/snapshot.d.ts +9 -0
  210. package/build/ports/eventsourcing/commandTemplates/snapshot.d.ts.map +1 -0
  211. package/build/ports/eventsourcing/commandTemplates/snapshot.js +39 -0
  212. package/build/ports/eventsourcing/commandTemplates/snapshot.js.map +1 -0
  213. package/build/ports/eventsourcing/eventHandlers/index.d.ts +33 -0
  214. package/build/ports/eventsourcing/eventHandlers/index.d.ts.map +1 -0
  215. package/build/ports/eventsourcing/eventHandlers/index.js +276 -0
  216. package/build/ports/eventsourcing/eventHandlers/index.js.map +1 -0
  217. package/build/ports/eventsourcing/index.d.ts +9 -0
  218. package/build/ports/eventsourcing/index.d.ts.map +1 -0
  219. package/build/ports/eventsourcing/index.js +101 -0
  220. package/build/ports/eventsourcing/index.js.map +1 -0
  221. package/build/ports/eventsourcing/invariants/combinators.d.ts +4 -0
  222. package/build/ports/eventsourcing/invariants/combinators.d.ts.map +1 -0
  223. package/build/ports/eventsourcing/invariants/combinators.js +20 -0
  224. package/build/ports/eventsourcing/invariants/combinators.js.map +1 -0
  225. package/build/ports/eventsourcing/invariants/common.d.ts +10 -0
  226. package/build/ports/eventsourcing/invariants/common.d.ts.map +1 -0
  227. package/build/ports/eventsourcing/invariants/common.js +37 -0
  228. package/build/ports/eventsourcing/invariants/common.js.map +1 -0
  229. package/build/ports/eventsourcing/invariants/comparisons.d.ts +19 -0
  230. package/build/ports/eventsourcing/invariants/comparisons.d.ts.map +1 -0
  231. package/build/ports/eventsourcing/invariants/comparisons.js +83 -0
  232. package/build/ports/eventsourcing/invariants/comparisons.js.map +1 -0
  233. package/build/ports/eventsourcing/invariants/index.d.ts +5 -0
  234. package/build/ports/eventsourcing/invariants/index.d.ts.map +1 -0
  235. package/build/ports/eventsourcing/invariants/index.js +21 -0
  236. package/build/ports/eventsourcing/invariants/index.js.map +1 -0
  237. package/build/ports/eventsourcing/invariants/stateExistance.d.ts +4 -0
  238. package/build/ports/eventsourcing/invariants/stateExistance.d.ts.map +1 -0
  239. package/build/ports/eventsourcing/invariants/stateExistance.js +33 -0
  240. package/build/ports/eventsourcing/invariants/stateExistance.js.map +1 -0
  241. package/build/ports/eventsourcing/subscriptions/index.d.ts +2 -0
  242. package/build/ports/eventsourcing/subscriptions/index.d.ts.map +1 -0
  243. package/build/ports/eventsourcing/subscriptions/index.js +18 -0
  244. package/build/ports/eventsourcing/subscriptions/index.js.map +1 -0
  245. package/build/ports/eventsourcing/subscriptions/sseSubscriptions.d.ts +3 -0
  246. package/build/ports/eventsourcing/subscriptions/sseSubscriptions.d.ts.map +1 -0
  247. package/build/ports/eventsourcing/subscriptions/sseSubscriptions.js +81 -0
  248. package/build/ports/eventsourcing/subscriptions/sseSubscriptions.js.map +1 -0
  249. package/build/ports/eventsourcing/utils/aggregateBuilder.d.ts +4 -0
  250. package/build/ports/eventsourcing/utils/aggregateBuilder.d.ts.map +1 -0
  251. package/build/ports/eventsourcing/utils/aggregateBuilder.js +45 -0
  252. package/build/ports/eventsourcing/utils/aggregateBuilder.js.map +1 -0
  253. package/build/ports/eventsourcing/utils/commandBuilder.d.ts +3 -0
  254. package/build/ports/eventsourcing/utils/commandBuilder.d.ts.map +1 -0
  255. package/build/ports/eventsourcing/utils/commandBuilder.js +102 -0
  256. package/build/ports/eventsourcing/utils/commandBuilder.js.map +1 -0
  257. package/build/ports/eventsourcing/utils/eventHandlerBuilder.d.ts +3 -0
  258. package/build/ports/eventsourcing/utils/eventHandlerBuilder.d.ts.map +1 -0
  259. package/build/ports/eventsourcing/utils/eventHandlerBuilder.js +19 -0
  260. package/build/ports/eventsourcing/utils/eventHandlerBuilder.js.map +1 -0
  261. package/build/ports/eventsourcing/utils/externalSystemBuilder.d.ts +4 -0
  262. package/build/ports/eventsourcing/utils/externalSystemBuilder.d.ts.map +1 -0
  263. package/build/ports/eventsourcing/utils/externalSystemBuilder.js +34 -0
  264. package/build/ports/eventsourcing/utils/externalSystemBuilder.js.map +1 -0
  265. package/build/ports/eventsourcing/utils/index.d.ts +13 -0
  266. package/build/ports/eventsourcing/utils/index.d.ts.map +1 -0
  267. package/build/ports/eventsourcing/utils/index.js +45 -0
  268. package/build/ports/eventsourcing/utils/index.js.map +1 -0
  269. package/build/ports/eventsourcing/utils/policyBuilder.d.ts +3 -0
  270. package/build/ports/eventsourcing/utils/policyBuilder.d.ts.map +1 -0
  271. package/build/ports/eventsourcing/utils/policyBuilder.js +29 -0
  272. package/build/ports/eventsourcing/utils/policyBuilder.js.map +1 -0
  273. package/build/ports/eventsourcing/utils/readmodelBuilder.d.ts +5 -0
  274. package/build/ports/eventsourcing/utils/readmodelBuilder.d.ts.map +1 -0
  275. package/build/ports/eventsourcing/utils/readmodelBuilder.js +45 -0
  276. package/build/ports/eventsourcing/utils/readmodelBuilder.js.map +1 -0
  277. package/build/ports/eventstore/index.d.ts +3 -0
  278. package/build/ports/eventstore/index.d.ts.map +1 -0
  279. package/build/ports/eventstore/index.js +13 -0
  280. package/build/ports/eventstore/index.js.map +1 -0
  281. package/build/ports/infrastructure/__tests__/fixture/index.d.ts +3 -0
  282. package/build/ports/infrastructure/__tests__/fixture/index.d.ts.map +1 -0
  283. package/build/ports/infrastructure/__tests__/fixture/index.js +19 -0
  284. package/build/ports/infrastructure/__tests__/fixture/index.js.map +1 -0
  285. package/build/ports/infrastructure/__tests__/fixture/infrastructureServices.d.ts +19 -0
  286. package/build/ports/infrastructure/__tests__/fixture/infrastructureServices.d.ts.map +1 -0
  287. package/build/ports/infrastructure/__tests__/fixture/infrastructureServices.js +76 -0
  288. package/build/ports/infrastructure/__tests__/fixture/infrastructureServices.js.map +1 -0
  289. package/build/ports/infrastructure/__tests__/fixture/structureState.d.ts +177 -0
  290. package/build/ports/infrastructure/__tests__/fixture/structureState.d.ts.map +1 -0
  291. package/build/ports/infrastructure/__tests__/fixture/structureState.js +258 -0
  292. package/build/ports/infrastructure/__tests__/fixture/structureState.js.map +1 -0
  293. package/build/ports/infrastructure/__tests__/infrastructure.test.d.ts +2 -0
  294. package/build/ports/infrastructure/__tests__/infrastructure.test.d.ts.map +1 -0
  295. package/build/ports/infrastructure/__tests__/infrastructure.test.js +11 -0
  296. package/build/ports/infrastructure/__tests__/infrastructure.test.js.map +1 -0
  297. package/build/ports/infrastructure/index.d.ts +53 -0
  298. package/build/ports/infrastructure/index.d.ts.map +1 -0
  299. package/build/ports/infrastructure/index.js +149 -0
  300. package/build/ports/infrastructure/index.js.map +1 -0
  301. package/build/ports/infrastructure/utils.d.ts +14 -0
  302. package/build/ports/infrastructure/utils.d.ts.map +1 -0
  303. package/build/ports/infrastructure/utils.js +126 -0
  304. package/build/ports/infrastructure/utils.js.map +1 -0
  305. package/build/ports/logger/index.d.ts +3 -0
  306. package/build/ports/logger/index.d.ts.map +1 -0
  307. package/build/ports/logger/index.js +32 -0
  308. package/build/ports/logger/index.js.map +1 -0
  309. package/build/utils/index.d.ts +35 -0
  310. package/build/utils/index.d.ts.map +1 -0
  311. package/build/utils/index.js +190 -0
  312. package/build/utils/index.js.map +1 -0
  313. package/package.json +28 -0
  314. package/src/adapters/cache/index.ts +1 -0
  315. package/src/adapters/cache/memory/__tests__/memoryCache.test.ts +6 -0
  316. package/src/adapters/cache/memory/index.ts +142 -0
  317. package/src/adapters/configuration/__tests__/.env +4 -0
  318. package/src/adapters/configuration/__tests__/dotEnv.test.ts +38 -0
  319. package/src/adapters/configuration/dotEnv.ts +33 -0
  320. package/src/adapters/configuration/index.ts +1 -0
  321. package/src/adapters/database/index.ts +1 -0
  322. package/src/adapters/database/memory/__tests__/memoryDb.test.ts +37 -0
  323. package/src/adapters/database/memory/index.ts +279 -0
  324. package/src/adapters/endpoints/addAuthUser/index.ts +55 -0
  325. package/src/adapters/endpoints/endpointValidation/index.ts +26 -0
  326. package/src/adapters/endpoints/index.ts +4 -0
  327. package/src/adapters/endpoints/localAuthorization/index.ts +75 -0
  328. package/src/adapters/endpoints/tcpConsumer/index.ts +69 -0
  329. package/src/adapters/endpoints/userSession/index.ts +40 -0
  330. package/src/adapters/eventstore/database.ts +178 -0
  331. package/src/adapters/eventstore/index.ts +1 -0
  332. package/src/adapters/infrastructure/index.ts +1 -0
  333. package/src/adapters/infrastructure/local/index.ts +40 -0
  334. package/src/adapters/logger/console.ts +42 -0
  335. package/src/adapters/logger/index.ts +1 -0
  336. package/src/index.ts +25 -0
  337. package/src/libraries/modules/fs.ts +88 -0
  338. package/src/libraries/modules/index.ts +1 -0
  339. package/src/libraries/openApi/index.ts +1 -0
  340. package/src/libraries/openApi/pruneUnusedRef.ts +35 -0
  341. package/src/libraries/tcp/index.ts +98 -0
  342. package/src/libraries/tcp/types.ts +43 -0
  343. package/src/libraries/validation/__tests__/validation.test.ts +25 -0
  344. package/src/libraries/validation/index.ts +48 -0
  345. package/src/ports/authentication/index.ts +25 -0
  346. package/src/ports/base.ts +20 -0
  347. package/src/ports/cache/index.ts +17 -0
  348. package/src/ports/configuration/__tests__/configurationPort.test.ts +47 -0
  349. package/src/ports/configuration/args.ts +39 -0
  350. package/src/ports/configuration/common.ts +12 -0
  351. package/src/ports/configuration/index.ts +110 -0
  352. package/src/ports/configuration/localConfig.ts +117 -0
  353. package/src/ports/database/index.ts +25 -0
  354. package/src/ports/endpoints/__tests__/endpointsCall.test.ts +20 -0
  355. package/src/ports/endpoints/__tests__/test-client-library/base.ts +167 -0
  356. package/src/ports/endpoints/__tests__/test-client-library/index.ts +23 -0
  357. package/src/ports/endpoints/__tests__/test-client-library/services/service.ts +181 -0
  358. package/src/ports/endpoints/__tests__/utils.test.ts +54 -0
  359. package/src/ports/endpoints/index.ts +272 -0
  360. package/src/ports/endpoints/openApi.ts +191 -0
  361. package/src/ports/endpoints/utils.ts +31 -0
  362. package/src/ports/eventsourcing/__tests__/eventhandlers.test.ts +30 -0
  363. package/src/ports/eventsourcing/__tests__/invariants.test.ts +213 -0
  364. package/src/ports/eventsourcing/commandHandlers/index.ts +625 -0
  365. package/src/ports/eventsourcing/commandTemplates/index.ts +2 -0
  366. package/src/ports/eventsourcing/commandTemplates/multiStream.ts +70 -0
  367. package/src/ports/eventsourcing/commandTemplates/snapshot.ts +43 -0
  368. package/src/ports/eventsourcing/eventHandlers/index.ts +429 -0
  369. package/src/ports/eventsourcing/index.ts +98 -0
  370. package/src/ports/eventsourcing/invariants/combinators.ts +25 -0
  371. package/src/ports/eventsourcing/invariants/common.ts +42 -0
  372. package/src/ports/eventsourcing/invariants/comparisons.ts +90 -0
  373. package/src/ports/eventsourcing/invariants/index.ts +4 -0
  374. package/src/ports/eventsourcing/invariants/stateExistance.ts +34 -0
  375. package/src/ports/eventsourcing/subscriptions/index.ts +1 -0
  376. package/src/ports/eventsourcing/subscriptions/sseSubscriptions.ts +103 -0
  377. package/src/ports/eventsourcing/utils/aggregateBuilder.ts +49 -0
  378. package/src/ports/eventsourcing/utils/commandBuilder.ts +113 -0
  379. package/src/ports/eventsourcing/utils/eventHandlerBuilder.ts +22 -0
  380. package/src/ports/eventsourcing/utils/externalSystemBuilder.ts +42 -0
  381. package/src/ports/eventsourcing/utils/index.ts +25 -0
  382. package/src/ports/eventsourcing/utils/policyBuilder.ts +31 -0
  383. package/src/ports/eventsourcing/utils/readmodelBuilder.ts +52 -0
  384. package/src/ports/eventstore/index.ts +11 -0
  385. package/src/ports/infrastructure/__tests__/fixture/index.ts +2 -0
  386. package/src/ports/infrastructure/__tests__/fixture/infrastructureServices.ts +72 -0
  387. package/src/ports/infrastructure/__tests__/fixture/structureState.ts +254 -0
  388. package/src/ports/infrastructure/__tests__/infrastructure.test.ts +11 -0
  389. package/src/ports/infrastructure/index.ts +162 -0
  390. package/src/ports/infrastructure/utils.ts +130 -0
  391. package/src/ports/logger/index.ts +34 -0
  392. package/src/utils/index.ts +186 -0
  393. package/tsconfig.json +19 -0
@@ -0,0 +1,625 @@
1
+ import { ensureArray, map, reduce } from '@bett3r-dev/bett3r-utils';
2
+ import S, { ObjectSchema } from '@bett3r-dev/jsonschema-definer';
3
+ import {
4
+ Aggregate,
5
+ AggregateReducedState, Builder, Command,
6
+ CommandEndpointQuerySchema,
7
+ CommandExecutionResponse,
8
+ CommandHandlerFunction,
9
+ CommandHandlerState, CommittedEvent,
10
+ CommittedEventSchema, DatabasePort, DatabaseTransaction, EndpointActionParams,
11
+ EndpointSchemas,
12
+ EndpointsPort, EventFactory, EventSourcingCommandHandlers, EventStorePort, EventToCommit, InvariantType, LoggerType, ReadStreamOptions, System,
13
+ SystemEndpointParamsSchema,
14
+ SystemGetQuerySchema,
15
+ SystemGetQueryType
16
+ } from '@bett3r-dev/pv3-types';
17
+ import { paramCase, pascalCase } from 'change-case';
18
+ import { randomUUID } from 'crypto';
19
+ import { assoc, clone, mergeRight, objOf, omit, path, pick } from 'ramda';
20
+ import { validateSchema, validateEndpoint } from '../../../libraries/validation';
21
+ import { formatStream } from '../utils';
22
+
23
+ export const formatAggregateGetQueryParams = (
24
+ params: SystemGetQueryType
25
+ ): ReadStreamOptions => ({
26
+ stream: params.stream,
27
+ events: params.names,
28
+ direction: params.backward ? 'backwards' : 'forwards',
29
+ from: params.from,
30
+ limit: params.limit,
31
+ after: params.after,
32
+ before: params.before,
33
+ });
34
+
35
+ export const getEventReducers =
36
+ (
37
+ aggregate: Aggregate,
38
+ reducedState: AggregateReducedState = { state: aggregate.initialValue() }
39
+ ) =>
40
+ ( event: EventToCommit ): AggregateReducedState => {
41
+ return ( reducedState = {
42
+ state: aggregate.eventReducers[event.name as string](
43
+ reducedState.state,
44
+ event.data,
45
+ event.metadata
46
+ ),
47
+ lastEvent: pick([ 'id', 'version' ], event ),
48
+ });
49
+ };
50
+
51
+ export const appendEventsToStream =
52
+ (
53
+ eventstore: EventStorePort,
54
+ expectedVersion?: number,
55
+ transaction?: DatabaseTransaction
56
+ ) =>
57
+ ( events: EventToCommit[]) => {
58
+ const stream = events[0].stream;
59
+ return events.length
60
+ ? eventstore.appendToStream( stream, events, expectedVersion, transaction )
61
+ : Promise.resolve([]);
62
+ };
63
+
64
+ export const addMetadata =
65
+ ({ metadata, context, stream }: CommandHandlerState ) =>
66
+ ( event: ReturnType<EventFactory> ): EventToCommit =>
67
+ ({
68
+ stream,
69
+ metadata: {
70
+ ...metadata,
71
+ ...( context?.user ? { user: context.user } : {}),
72
+ },
73
+ ...event,
74
+ } as EventToCommit );
75
+
76
+ export const prepareEventsToCommit = (
77
+ handlerState: CommandHandlerState
78
+ ): Promise<EventToCommit[]> => {
79
+ return Promise.resolve( handlerState.events )
80
+ .then( ensureArray )
81
+ .then(
82
+ map(( eventFactory: EventFactory ) => {
83
+ return { ...( eventFactory() as ReturnType<EventFactory> ) };
84
+ })
85
+ )
86
+ .then( map( addMetadata( handlerState ))) as Promise<EventToCommit[]>;
87
+ };
88
+
89
+ export const commitEvents =
90
+ ( eventstore: EventStorePort ) =>
91
+ (
92
+ handlerState: CommandHandlerState,
93
+ transaction?: DatabaseTransaction
94
+ ): Promise<CommandHandlerState> => {
95
+ if ( !handlerState.events.length ) return Promise.resolve( handlerState );
96
+ return prepareEventsToCommit( handlerState )
97
+ .then(
98
+ appendEventsToStream(
99
+ eventstore,
100
+ handlerState.expectedVersion,
101
+ transaction
102
+ )
103
+ )
104
+ .then( objOf( 'committedEvents' ))
105
+ .then( mergeRight( handlerState ));
106
+ };
107
+
108
+ export const getStreamReducer =
109
+ ( state: Record<string, any> = {}) =>
110
+ ( event: CommittedEvent ) => {
111
+ state[event.stream] ||= { events: [], state: null };
112
+ state[event.stream].events?.push( event );
113
+ return state;
114
+ };
115
+
116
+ export const loadStream =
117
+ ( eventstore: EventStorePort ) =>
118
+ ( stream: string, options?: ReadStreamOptions ) => {
119
+ return eventstore
120
+ .readStream(
121
+ {
122
+ ...options,
123
+ stream,
124
+ },
125
+ getStreamReducer()
126
+ )
127
+ .then(( state ) =>
128
+ !Object.keys( state ).length
129
+ ? undefined
130
+ : ( state[stream].events as CommittedEvent[])
131
+ );
132
+ };
133
+ export const loadAggregateState =
134
+ ( eventstore: EventStorePort ) =>
135
+ (
136
+ system: Aggregate,
137
+ stream: string,
138
+ options?: ReadStreamOptions,
139
+ state?: any
140
+ ): Promise<AggregateReducedState | null> => {
141
+ return !stream || !system.isAggregate
142
+ ? Promise.resolve( null )
143
+ : eventstore
144
+ .readStream(
145
+ { ...options, stream },
146
+ getEventReducers( system, { state })
147
+ )
148
+ .then(( _state ) => {
149
+ return _state || { state };
150
+ });
151
+ };
152
+
153
+ export const domainModelLoad =
154
+ ( database: DatabasePort, collection: string ) =>
155
+ ( handlerState: CommandHandlerState ) => {
156
+ return database
157
+ .getCollection( collection )
158
+ .readById( handlerState.params.id )
159
+ .then(( state ) => {
160
+ return assoc(
161
+ 'state',
162
+ state
163
+ ? omit(['id'], state )
164
+ : ( handlerState.commandHandler as Aggregate ).initialValue(),
165
+ handlerState
166
+ );
167
+ });
168
+ };
169
+
170
+ export const domainModelCommit =
171
+ ( eventstore: EventStorePort ) =>
172
+ ( database: DatabasePort, collection: string ) =>
173
+ ( handlerState: CommandHandlerState ): Promise<CommandHandlerState> => {
174
+ return database.initTransaction( async ( getCollection ) => {
175
+ const { params, expectedVersion } = handlerState;
176
+ // console.log( 'EXPECTED VERSION AT COMMIT', expectedVersion );
177
+ const initialValue = (
178
+ handlerState.commandHandler as Aggregate
179
+ ).initialValue();
180
+ const eventsToCommit = await prepareEventsToCommit( handlerState );
181
+ if ( eventsToCommit.length === 0 ) {
182
+ return handlerState;
183
+ }
184
+ const { state, events } = reduceEventsIntoState(
185
+ handlerState.state || initialValue,
186
+ handlerState.commandHandler as Aggregate,
187
+ eventsToCommit
188
+ );
189
+
190
+ let lastCommittedVersion = 0;
191
+ if ( eventstore._adapter._adapter() === database ) {
192
+ const state = await ( commitEvents( eventstore )( handlerState, { getCollection }));
193
+ lastCommittedVersion = state.committedEvents?.at( -1 )?.version || 1;
194
+ } else {
195
+ // TODO: Determine how to get the lastCommittedVersion in the outbox scenario
196
+ await getCollection( `${collection}_outbox` ).createMany(
197
+ events.map(( e ) => assoc( 'id', randomUUID(), e ))
198
+ );
199
+ }
200
+ if ( expectedVersion )
201
+ await getCollection( collection ).updateMany(
202
+ [
203
+ { field: 'id', op: 'eq', value: params.id },
204
+ { field: 'version', op: 'eq', value: expectedVersion },
205
+ ],
206
+ { ...state, version: lastCommittedVersion }
207
+ );
208
+ else {
209
+ if ( state !== null ) {
210
+ await getCollection( collection ).upsert( handlerState.params.id, { ...state, version: lastCommittedVersion });
211
+ } else {
212
+ await getCollection( collection ).destroyById( handlerState.params.id );
213
+ }
214
+ }
215
+ return {
216
+ ...handlerState,
217
+ state,
218
+ } as CommandHandlerState;
219
+ });
220
+ };
221
+
222
+ export const defaultHandler =
223
+ ( eventsProducedByCommand: string[]): CommandHandlerFunction =>
224
+ ( _, data ) => {
225
+ return Promise.all(
226
+ ( eventsProducedByCommand || []).map(( e ) => () => ({
227
+ name: e,
228
+ data,
229
+ }))
230
+ );
231
+ };
232
+
233
+ export const defaultCommit =
234
+ ( eventstore: EventStorePort ) => ( state: CommandHandlerState ) =>
235
+ commitEvents( eventstore )( state );
236
+
237
+ export const reduceEventsIntoState = (
238
+ initialState: any,
239
+ commandHandler: Aggregate,
240
+ events: EventToCommit[]
241
+ ) => {
242
+ const reducer = getEventReducers( commandHandler as Aggregate, {
243
+ state: initialState,
244
+ });
245
+ const _state = events.reduce(
246
+ ( _, event ) => reducer( event ),
247
+ {} as AggregateReducedState
248
+ );
249
+ return { events, state: _state.state };
250
+ };
251
+
252
+ export const formatDomainModelCommandResponse = (
253
+ handlerState: CommandHandlerState
254
+ ): Promise<CommandExecutionResponse> => {
255
+ return Promise.resolve({
256
+ state: handlerState.state,
257
+ } as CommandExecutionResponse );
258
+ };
259
+
260
+ export const formatEventSourcedCommandResponse = async (
261
+ handlerState: CommandHandlerState
262
+ ): Promise<CommandExecutionResponse> => {
263
+ const { committedEvents, commandHandler, state } = handlerState;
264
+ if ( !committedEvents || !committedEvents.length )
265
+ return Promise.resolve({ state } as CommandExecutionResponse );
266
+ if ( !commandHandler.isAggregate ) {
267
+ return Promise.resolve({ events: committedEvents });
268
+ }
269
+ return reduceEventsIntoState(
270
+ state,
271
+ commandHandler as Aggregate,
272
+ committedEvents
273
+ ) as CommandExecutionResponse;
274
+ };
275
+
276
+ export const validateInvariants =
277
+ ( invariants: InvariantType[]) => ( state: CommandHandlerState ) => {
278
+ return invariants.reduce(( success, invariant ) => {
279
+ return success
280
+ .then(( state ) => invariant.check( state ))
281
+ .then(( resultState ) => resultState || state );
282
+ }, Promise.resolve( state ));
283
+ };
284
+
285
+ export const defaultEventsourcingLoad =
286
+ ( eventstore: EventStorePort ) =>
287
+ (
288
+ handlerState: CommandHandlerState,
289
+ options?: ReadStreamOptions,
290
+ state?: any
291
+ ) => {
292
+ return loadAggregateState( eventstore )(
293
+ handlerState.commandHandler as Aggregate,
294
+ handlerState.stream,
295
+ options,
296
+ state ||
297
+ handlerState.state ||
298
+ ( handlerState.commandHandler as Aggregate ).initialValue()
299
+ ).then(
300
+ ( reducedState ) =>
301
+ ({
302
+ ...handlerState,
303
+ state: reducedState?.state,
304
+ expectedVersion: reducedState?.lastEvent?.version,
305
+ } as CommandHandlerState )
306
+ );
307
+ };
308
+
309
+ export const handleCommand =
310
+ ( handler: CommandHandlerFunction ) =>
311
+ async ( handlerState: CommandHandlerState ): Promise<CommandHandlerState> => {
312
+ const { state, data } = handlerState;
313
+ handlerState.events = await Promise.resolve()
314
+ .then(() =>
315
+ ( handler as CommandHandlerFunction )(
316
+ state ? clone( state ) : null,
317
+ clone( data ),
318
+ handlerState
319
+ )
320
+ )
321
+ .then(( events ) => {
322
+ return [ ...handlerState.events, ...events ];
323
+ });
324
+ return handlerState;
325
+ };
326
+
327
+ export function createCommandHandlers(
328
+ logger: LoggerType,
329
+ endpoint: EndpointsPort,
330
+ eventstore: EventStorePort
331
+ ): EventSourcingCommandHandlers {
332
+ const internalExecuteCommand =
333
+ <SYSTEM extends System, COMMAND extends keyof SYSTEM['commands']>(
334
+ commandHandler: SYSTEM,
335
+ commandName: COMMAND
336
+ ) =>
337
+ async (
338
+ actionParams: EndpointActionParams
339
+ ): Promise<
340
+ CommandExecutionResponse | Record<string, CommandExecutionResponse>
341
+ > => {
342
+ const command: Command = ( commandHandler.commands[commandName] as Builder )
343
+ .build
344
+ ? commandHandler.commands[commandName].build()
345
+ : commandHandler.commands[commandName];
346
+ command.name = commandName as string;
347
+ logger.log(
348
+ 'Processing Command',
349
+ commandName,
350
+ 'in',
351
+ commandHandler.isAggregate ? 'Aggregate' : 'External System',
352
+ commandHandler.name
353
+ );
354
+ logger.debug(
355
+ 'with payload:',
356
+ pick([ 'body', 'params', 'query' ], actionParams )
357
+ );
358
+ const { body, params, query, context } = actionParams;
359
+ const id = command.dataPropertyId
360
+ ? path( command.dataPropertyId.split( '.' ), body )
361
+ : params.id;
362
+ const stream = formatStream( commandHandler.name, id );
363
+ const handlerState = {
364
+ command,
365
+ data: body,
366
+ query,
367
+ params,
368
+ context,
369
+ stream,
370
+ events: [],
371
+ commandHandler,
372
+ expectedVersion: query?.expectedVersion,
373
+ state: undefined,
374
+ metadata: {
375
+ correlationId: query?.correlationId || randomUUID(),
376
+ ...( query?.causationId ? { causationId: query?.causationId } : {}),
377
+ },
378
+ } as CommandHandlerState;
379
+
380
+ const loadFunction =
381
+ command.load ||
382
+ ( commandHandler.isEventsourced
383
+ ? defaultEventsourcingLoad( eventstore )
384
+ : domainModelLoad(
385
+ ( commandHandler as any ).outboxDatabase,
386
+ ( commandHandler as any ).outboxCollection
387
+ ));
388
+ const commitFunction =
389
+ command.commit ||
390
+ ( commandHandler.isEventsourced
391
+ ? defaultCommit( eventstore )
392
+ : domainModelCommit( eventstore )(
393
+ ( commandHandler as any ).outboxDatabase,
394
+ ( commandHandler as any ).outboxCollection
395
+ ));
396
+ const formatFunction =
397
+ command.format ||
398
+ ( commandHandler.isEventsourced
399
+ ? formatEventSourcedCommandResponse
400
+ : formatDomainModelCommandResponse );
401
+
402
+ return Promise.resolve( handlerState )
403
+ .then( loadFunction )
404
+ .then( validateInvariants( command.invariants || []))
405
+ .then(
406
+ handleCommand(
407
+ command.handler || defaultHandler( command.events as string[])
408
+ )
409
+ )
410
+ .then( commitFunction )
411
+ .then( formatFunction );
412
+ };
413
+
414
+ const executeCommand =
415
+ <SYSTEM extends System, COMMAND extends keyof SYSTEM['commands']>(
416
+ commandHandler: SYSTEM,
417
+ commandName: COMMAND,
418
+ schemas?: EndpointSchemas<any, any, any>
419
+ ) =>
420
+ async (
421
+ actionParams: EndpointActionParams
422
+ ): Promise<
423
+ CommandExecutionResponse | Record<string, CommandExecutionResponse>
424
+ > => {
425
+ const command: Command = ( commandHandler.commands[commandName] as Builder )
426
+ .build
427
+ ? commandHandler.commands[commandName].build()
428
+ : commandHandler.commands[commandName];
429
+ schemas = schemas || getCommandSchemas( commandHandler, command );
430
+ command.name = commandName as string;
431
+ return Promise.resolve( actionParams )
432
+ .then( validateEndpoint( validateSchema, schemas ))
433
+ .then( internalExecuteCommand( commandHandler, commandName ))
434
+ .catch(( err ) => {
435
+ if ( command.onErrorHandler )
436
+ return command.onErrorHandler( err, actionParams.body );
437
+ return Promise.reject( err );
438
+ });
439
+ };
440
+
441
+ const getCommandSchemas = ( commandHandler: System, command: Command ) => {
442
+ const eventsSchemas: Record<string, ObjectSchema> = command.events?.reduce(
443
+ ( schemas, eventName ) => {
444
+ if ( !!commandHandler.events[eventName])
445
+ schemas[eventName] = commandHandler.events[eventName]().schema;
446
+ if ( schemas[eventName])
447
+ schemas[eventName] = schemas[eventName].id( eventName );
448
+ return schemas;
449
+ },
450
+ {} as Record<string, ObjectSchema>
451
+ );
452
+ const responses =
453
+ !eventsSchemas || Object.keys( eventsSchemas ).length === 0
454
+ ? {
455
+ 200: [
456
+ {
457
+ schema: S.shape({
458
+ state: ( commandHandler as Aggregate ).schema.id(
459
+ `${commandHandler.name}State`
460
+ ),
461
+ }),
462
+ name: 'OK',
463
+ },
464
+ ],
465
+ }
466
+ : {
467
+ 200: [
468
+ {
469
+ schema: commandHandler.isAggregate
470
+ ? S.shape({
471
+ state: ( commandHandler as Aggregate ).schema.id(
472
+ `${commandHandler.name}State`
473
+ ),
474
+ events: CommittedEventSchema(
475
+ S.anyOf(
476
+ ...Object.values( eventsSchemas )
477
+ ) as ObjectSchema,
478
+ Object.keys( eventsSchemas )
479
+ ),
480
+ })
481
+ : S.shape({
482
+ events: CommittedEventSchema(
483
+ S.anyOf(
484
+ ...Object.values( eventsSchemas )
485
+ ) as ObjectSchema,
486
+ Object.keys( eventsSchemas )
487
+ ),
488
+ }),
489
+ name: 'OK',
490
+ },
491
+ ],
492
+ };
493
+ return {
494
+ query: CommandEndpointQuerySchema,
495
+ body: command.schema?.copyWith({ plain: { $id: command.name }}),
496
+ responses,
497
+ ...( commandHandler.isStreamable && !command.dataPropertyId
498
+ ? { params: SystemEndpointParamsSchema }
499
+ : {}),
500
+ };
501
+ };
502
+
503
+ const formatCommandRoute = (
504
+ commandName: string,
505
+ transformFn: ( x: string ) => string
506
+ ) => {
507
+ return `${commandName.startsWith( '_' ) ? '_' : ''}${transformFn(
508
+ commandName
509
+ )}`;
510
+ };
511
+
512
+ const registerCommandHandlerGetEndpoints = (
513
+ commandHandler: System,
514
+ name = commandHandler.name
515
+ ): string[] => {
516
+ const isStreamable =
517
+ !!( commandHandler as Aggregate ).eventReducers ||
518
+ ( commandHandler as System ).isStreamable;
519
+ const idRoute = `/${formatCommandRoute( name, paramCase )}/:id/state`;
520
+ const streamRoute = isStreamable
521
+ ? `/${formatCommandRoute( name, paramCase )}/:id/stream`
522
+ : `/${formatCommandRoute( name, paramCase )}/stream`;
523
+ if (
524
+ !commandHandler.isEventsourced &&
525
+ !( commandHandler as Aggregate ).outboxDatabase
526
+ )
527
+ throw Error(
528
+ 'Aggregate declared as Not Eventsourced without Outbox database.'
529
+ );
530
+ isStreamable &&
531
+ endpoint.registerEndpoint({
532
+ name: `Get ${name} state by Id`,
533
+ description: `Get current reduced ${name} state by Id`,
534
+ method: 'GET',
535
+ module: name,
536
+ route: idRoute,
537
+ schemas: {
538
+ params: SystemEndpointParamsSchema,
539
+ query: SystemGetQuerySchema,
540
+ },
541
+ action: ({ params, query }) =>
542
+ loadAggregateState( eventstore )(
543
+ commandHandler as Aggregate,
544
+ formatStream( commandHandler.name, params?.id ),
545
+ formatAggregateGetQueryParams( query )
546
+ ).then(( response ) => response && Object.values( response )[0]),
547
+ });
548
+ endpoint.registerEndpoint({
549
+ name: formatCommandRoute( name, pascalCase ),
550
+ description: `Get the stream of events for ${name} by Id`,
551
+ method: 'GET',
552
+ module: name,
553
+ route: streamRoute,
554
+ schemas: {
555
+ params: isStreamable ? SystemEndpointParamsSchema : undefined,
556
+ query: SystemGetQuerySchema,
557
+ },
558
+ action: ({ params, query }) =>
559
+ ( isStreamable
560
+ ? loadStream( eventstore )(
561
+ formatStream( commandHandler.name, params?.id ),
562
+ query
563
+ )
564
+ : loadStream( eventstore )( name, formatAggregateGetQueryParams( query ))
565
+ ).then(( response ) => ( Array.isArray( response ) ? response : [])),
566
+ });
567
+
568
+ return [ idRoute, streamRoute ];
569
+ };
570
+
571
+ const registerCommandHandlerPostEndpoints = (
572
+ commandHandler: System
573
+ ): Record<string, string> => {
574
+ const commandHandlerName: string = commandHandler.name;
575
+ const isStreamable = commandHandler.isStreamable;
576
+ return !commandHandler.commands
577
+ ? {}
578
+ : reduce(
579
+ ( result, name ) => {
580
+ const command: Command = commandHandler.commands[name]?.build
581
+ ? commandHandler.commands[name]?.build()
582
+ : commandHandler.commands[name];
583
+ const route =
584
+ !isStreamable || !!command.dataPropertyId === true
585
+ ? `/${paramCase( commandHandlerName )}/${formatCommandRoute(
586
+ name,
587
+ paramCase
588
+ )}`
589
+ : `/${paramCase( commandHandlerName )}/:id/${formatCommandRoute(
590
+ name,
591
+ paramCase
592
+ )}`;
593
+ const schemas = getCommandSchemas( commandHandler, command );
594
+ endpoint.registerEndpoint({
595
+ module: commandHandlerName,
596
+ name: formatCommandRoute( name, pascalCase ),
597
+ description: command.description,
598
+ multipartProperties: command.multipartProperties,
599
+ route,
600
+ tags: commandHandler.isAggregate ? ['aggregate'] : ['system'],
601
+ schemas,
602
+ shouldValidate: false,
603
+ method: 'POST',
604
+ action: executeCommand(
605
+ commandHandler as Aggregate,
606
+ name,
607
+ schemas
608
+ ),
609
+ });
610
+ result[name] = route;
611
+ return result;
612
+ },
613
+ {},
614
+ Object.keys( commandHandler.commands )
615
+ );
616
+ };
617
+
618
+ return {
619
+ loadStream: loadStream( eventstore ),
620
+ loadAggregateState: loadAggregateState( eventstore ),
621
+ executeCommand,
622
+ registerCommandHandlerGetEndpoints,
623
+ registerCommandHandlerPostEndpoints,
624
+ };
625
+ }
@@ -0,0 +1,2 @@
1
+ export * from './multiStream';
2
+ export * from './snapshot';
@@ -0,0 +1,70 @@
1
+ import { map } from '@bett3r-dev/bett3r-utils';
2
+ import { Ports, Aggregate, Command, CommandExecutionResponse, CommandHandlerState, CommittedEvent } from '@bett3r-dev/pv3-types';
3
+ import { InternalServerError, createError } from '../../../utils';
4
+ import { objOf, path, pick, prop } from 'ramda';
5
+ import { formatStream } from '..';
6
+
7
+ const getStreams = ( dataPropertyId: string, data: any, formatStream: ( id: string ) => string ): any[] => {
8
+ const pathParts = dataPropertyId.split( '.' );
9
+
10
+ const recursiveExtractor = ( currentObj: any, currentPath: string[]): any[] => {
11
+ if ( !currentObj || currentPath.length === 0 ) return [];
12
+ const part = currentPath[0];
13
+ if ( Array.isArray( currentObj )) {
14
+ return currentObj.flatMap( childObj => recursiveExtractor( childObj, currentPath ));
15
+ }
16
+ if ( currentPath.length === 1 ) {
17
+ return [formatStream( currentObj[part])];
18
+ }
19
+ return recursiveExtractor( currentObj[part], currentPath.slice( 1 ));
20
+ };
21
+
22
+ return recursiveExtractor( data, pathParts );
23
+ };
24
+
25
+ export const getMultipleEventReducers = ( aggregate: Aggregate, reducedState = {}) => ( event: CommittedEvent ): any => {
26
+ reducedState[event.stream] = {
27
+ lastEvent: pick([ 'id', 'version' ], event ),
28
+ state: aggregate.eventReducers[event.name as string](( reducedState && reducedState[event.stream]?.state ) || aggregate.initialValue(), event.data, event.metadata )
29
+ };
30
+ return reducedState;
31
+ };
32
+
33
+ export const multiStream = ( ports: Pick<Ports, 'eventstore'>, dataPropertyId: string, ): Command => {
34
+ return {
35
+ dataPropertyId,
36
+ load: async <Model, Payload>( commandHandlerState: CommandHandlerState<Model,Payload> ): Promise<CommandHandlerState<Model, Payload>> => {
37
+ if ( !ports.eventstore.readMultipleStream ) throw createError( InternalServerError(), { details: { command: commandHandlerState.command.name }, description: 'MultiStream Command: The Eventstore in use does not Support Multiple Streams' });
38
+ const streams = getStreams( dataPropertyId, commandHandlerState.data, formatStream( commandHandlerState.commandHandler.name ));
39
+ return ports.eventstore.readMultipleStream({ streams }, getMultipleEventReducers( commandHandlerState.commandHandler as Aggregate ))
40
+ .then( state => {
41
+ return {
42
+ ...commandHandlerState,
43
+ state: !state || !Object.keys( state ).length ? undefined : map( prop( 'state' ), state ),
44
+ expectedVersion: !state || !Object.keys( state ).length ? undefined : map( path([ 'lastEvent', 'version' ]), state ) as any,
45
+ };
46
+ });
47
+ },
48
+ commit: async <Model, Payload>( commandHandlerState: CommandHandlerState<Model,Payload> ): Promise<CommandHandlerState<Model, Payload>> => {
49
+ if ( !ports.eventstore.appendToMultipleStreams ) throw createError( InternalServerError(), { details: { command: commandHandlerState.command.name }, description: 'MultiStream Command: The Eventstore in use does not Support Multiple Streams' });
50
+ const eventsToCommit = commandHandlerState.events.reduce(( streams, e: any ) => {
51
+ streams[e().stream] ||= { events:[], expectedVersion: commandHandlerState.expectedVersion![e().stream] };
52
+ streams[e().stream].events.push( e());
53
+ return streams;
54
+ }, {} as Record<string, {events: any[], expectedVersion?: number}> );
55
+ const events = await ports.eventstore.appendToMultipleStreams( eventsToCommit );
56
+ const formatedState = map( objOf( 'state' ), commandHandlerState.state );
57
+ const state = events.reduce(( _, event ) => {
58
+ return getMultipleEventReducers( commandHandlerState.commandHandler as Aggregate, formatedState )( event );
59
+ }, {});
60
+ return {
61
+ ...commandHandlerState,
62
+ state: map( prop( 'state' ), state ),
63
+ events
64
+ } as any;
65
+ },
66
+ format: async <Model, Payload>( state: CommandHandlerState<Model,Payload> ): Promise<CommandExecutionResponse<Model>> => {
67
+ return pick([ 'state', 'events' ], state ) as CommandExecutionResponse<Model>;
68
+ }
69
+ } as Command;
70
+ };