@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,43 @@
1
+ import { Aggregate, Command, CommandExecutionResponse, CommandHandlerState, Ports } from '@bett3r-dev/pv3-types';
2
+ import { defaultEventsourcingLoad, reduceEventsIntoState } from '../commandHandlers';
3
+
4
+ export type SnapshotType<T = any> = {
5
+ id:string,
6
+ eventId: number,
7
+ version: number,
8
+ data: T,
9
+ }
10
+
11
+ export const snapshot = ( ports: Pick<Ports, 'database' | 'eventstore'>, collection: string, frequency: number = 500 ): Command => {
12
+ const coll = ports.database.getCollection<SnapshotType>( collection );
13
+ coll.ensureIndex(['stream']);
14
+ coll.ensureIndex(['eventId']);
15
+ return {
16
+ load: async <Model, Payload>( commandHandlerState: CommandHandlerState<Model,Payload> ): Promise<CommandHandlerState<Model, Payload>> => {
17
+ return coll.readById( commandHandlerState.stream )
18
+ .then(( snapshot ) => {
19
+ return defaultEventsourcingLoad( ports.eventstore )( commandHandlerState as any, {
20
+ stream: commandHandlerState.stream,
21
+ from: snapshot?.eventId || 0
22
+ }, snapshot?.data )
23
+ .then(( state ) => ({
24
+ ...state,
25
+ snapshot,
26
+ }));
27
+ }) as Promise<CommandHandlerState<Model,Payload>>;
28
+ },
29
+ format: async <Model, Payload>( commandHandlerState: CommandHandlerState<Model,Payload> ): Promise<CommandExecutionResponse<Model>> => {
30
+ const { state, commandHandler, committedEvents } = commandHandlerState;
31
+ const formattedResult = reduceEventsIntoState( state, commandHandler as Aggregate, committedEvents! );
32
+ if ( commandHandlerState.committedEvents ){
33
+ const lastEvent = commandHandlerState.committedEvents?.slice( -1 )[0];
34
+ const lastVersion = ( commandHandlerState as any ).snapshot?.version || 0;
35
+ if ( lastEvent.version - lastVersion >= frequency ){
36
+ // Not waiting for the operation since this is not required to be consistent
37
+ coll.upsert( commandHandlerState.stream, { id: lastEvent.stream, version: lastEvent.version, eventId: lastEvent.id, data: formattedResult.state });
38
+ }
39
+ }
40
+ return formattedResult as CommandExecutionResponse<Model>;
41
+ }
42
+ } as Command;
43
+ };
@@ -0,0 +1,429 @@
1
+ import { ensureArray } from '@bett3r-dev/bett3r-utils';
2
+ import S, { BaseSchema, ObjectSchema } from '@bett3r-dev/jsonschema-definer';
3
+ import {
4
+ AppErrorInstance,
5
+ Collection,
6
+ CollectionFilter,
7
+ CollectionQueryParams,
8
+ CollectionSort,
9
+ CommandExecutionResponse,
10
+ CommittedEvent,
11
+ CommittedEventSchema,
12
+ Document,
13
+ EndpointActionParams,
14
+ EndpointSchemas,
15
+ EndpointsPort,
16
+ EventHandler,
17
+ ExecuteCommandFunction,
18
+ LoggerType,
19
+ Policy,
20
+ PolicyResponse,
21
+ Query,
22
+ QueryHandler,
23
+ ReadModel,
24
+ ReadModelDefaultParams,
25
+ ReadModelDefaultQuery,
26
+ RequestObject,
27
+ ResponseObject,
28
+ defaultParamsSchemas,
29
+ defaultQuerySchemas,
30
+ } from '@bett3r-dev/pv3-types';
31
+ import { QueueObject, queue } from 'async';
32
+ import { paramCase } from 'change-case';
33
+ import { dieOnError, validateSchema } from '../../../libraries/validation';
34
+
35
+ //TODO: Consider Objects
36
+ export const coerceFilterType = (
37
+ value: string[],
38
+ targetType: string,
39
+ op: string
40
+ ) => {
41
+ const inOrNin = op === 'in' || op === 'nin';
42
+ if ( !value.length || [ 'exists', 'notExists' ].includes( op )) return undefined;
43
+ if ( targetType === 'string' ) return !inOrNin ? value[0] : value;
44
+ else if ( targetType === 'number' )
45
+ return !inOrNin ? Number( value[0]) : value.map(( v ) => Number( v ));
46
+ else if ( targetType === 'boolean' )
47
+ return !inOrNin ? value[0] === 'true' : value.map(( v ) => v === 'true' );
48
+ };
49
+
50
+ export const formatFilter = <Model extends Document>(
51
+ filters: string[],
52
+ schema: ObjectSchema<Model>
53
+ ): CollectionFilter<Model>[] => {
54
+ return (
55
+ filters &&
56
+ ensureArray( filters ).map(( f ) => {
57
+ const operands = f.split( ',' );
58
+ const [ field, op, ...value ] = operands;
59
+ return {
60
+ field,
61
+ op,
62
+ value: coerceFilterType(
63
+ value,
64
+ ((( schema.plain.properties as {})[field] || {}).type as string ) ||
65
+ 'string',
66
+ op
67
+ ),
68
+ } as CollectionFilter<Model>;
69
+ })
70
+ );
71
+ };
72
+
73
+ export const formatSort = <Model extends Document>( sorts: string[]) => {
74
+ return (
75
+ sorts &&
76
+ ensureArray( sorts ).map(( s ) => {
77
+ const operands = s.split( ',' );
78
+ const [ field, direction ] = operands;
79
+ return {
80
+ field,
81
+ direction: direction || 'asc',
82
+ } as CollectionSort<Model>;
83
+ })
84
+ );
85
+ };
86
+
87
+ export const formatSelect = <Model extends Document>(
88
+ select: string[],
89
+ schema: ObjectSchema<Model>
90
+ ) => {
91
+ select = ensureArray( select );
92
+ const omit = select.filter(( s ) => s[0] === '!' ).map(( s ) => s.slice( 1 ));
93
+ if ( omit?.length ) {
94
+ return Object.keys( schema.plain.properties as {}).filter(
95
+ ( key ) => !omit.includes( key )
96
+ );
97
+ }
98
+ return select;
99
+ };
100
+
101
+ export const defaultQueryParamsTranslator = <
102
+ Model extends Document = any,
103
+ Query extends ReadModelDefaultQuery = ReadModelDefaultQuery,
104
+ Params extends ReadModelDefaultParams = ReadModelDefaultParams
105
+ >(
106
+ schema: ObjectSchema<Model>,
107
+ {
108
+ params,
109
+ query,
110
+ }: Pick<EndpointActionParams<Model, Query, Params>, 'params' | 'query'>
111
+ ): CollectionQueryParams<Model> => {
112
+ return {
113
+ id: params?.id,
114
+ limit: query?.limit ? Number( query.limit ) : undefined,
115
+ after: query?.after,
116
+ select: query?.select
117
+ ? formatSelect( query?.select as string[], schema )
118
+ : undefined,
119
+ filter: query?.filter
120
+ ? formatFilter( query?.filter as string[], schema )
121
+ : undefined,
122
+ sort: query?.sort ? formatSort( query?.sort as string[]) : undefined,
123
+ };
124
+ };
125
+
126
+ export const createEventHandlers = ( logger: LoggerType, endpoints: EndpointsPort ) => {
127
+ const activeSubscriptions: Record<string, string> = {};
128
+
129
+ const eventHandlerMap: {
130
+ [name: string]: {
131
+ eventHandler: Partial<Policy>;
132
+ events: string[];
133
+ queue: QueueObject<CommittedEvent>;
134
+ };
135
+ } = {};
136
+
137
+ const processEvent =
138
+ ( eventHandlerName: string ) =>
139
+ ( event: CommittedEvent ): Promise<CommandExecutionResponse> => {
140
+ return new Promise(( resolve, reject ) => {
141
+ eventHandlerMap[eventHandlerName].queue.push(
142
+ event,
143
+ ( err: AppErrorInstance, result: CommandExecutionResponse ) => {
144
+ if ( err ) {
145
+ logger.error( err );
146
+ return reject( err );
147
+ }
148
+ return resolve( result );
149
+ }
150
+ );
151
+ });
152
+ };
153
+
154
+ const pauseQueue = ( eventHandlerName: string, value: boolean ) =>
155
+ value
156
+ ? eventHandlerMap[eventHandlerName].queue.pause()
157
+ : eventHandlerMap[eventHandlerName].queue.resume();
158
+
159
+ const getEventHandlerLabel = ( eventHandler: EventHandler ) =>
160
+ `${( eventHandler as Policy ).eventHandlers ? 'Policy' : 'Projector'}`;
161
+
162
+ const isReadModel = ( eventHandler: EventHandler ) =>
163
+ !!( eventHandler as ReadModel ).isReadModel;
164
+
165
+ const handleEvent =
166
+ ( eventHandler: EventHandler, executeCommand: ExecuteCommandFunction ) =>
167
+ ( event: CommittedEvent ) => {
168
+ const _isReadModel = isReadModel( eventHandler );
169
+ return Promise.resolve( event )
170
+ .then( validateSchema( getEventSchema( eventHandler )( event.name )))
171
+ .then<PolicyResponse | void>(
172
+ _isReadModel
173
+ ? (( eventHandler as ReadModel ).eventProjectors || {})[
174
+ event.name as string
175
+ ]
176
+ : ( eventHandler as Policy ).eventHandlers[event.name as string]
177
+ )
178
+ .then(( response ) => {
179
+ if ( !response || _isReadModel ) return Promise.resolve();
180
+ const policy = eventHandler as Policy;
181
+ if ( policy.commandHandler && response.name ) {
182
+ return executeCommand(
183
+ policy.commandHandler,
184
+ response.name
185
+ )({
186
+ context: {
187
+ user: event.metadata.user,
188
+ },
189
+ body: response.data,
190
+ params: { id: response.id },
191
+ query: {
192
+ correlationId: event.metadata.correlationId,
193
+ causationId: event.id.toString(),
194
+ },
195
+ } as EndpointActionParams );
196
+ }
197
+ })
198
+ .catch(( error ) => {
199
+ logger.debug( 'Handling error for event', event.name );
200
+ if (
201
+ eventHandler.errorHandlers &&
202
+ eventHandler.errorHandlers[event.name] &&
203
+ typeof eventHandler.errorHandlers[event.name] === 'function'
204
+ )
205
+ return eventHandler.errorHandlers[event.name]!( error, event );
206
+ return Promise.reject( error );
207
+ });
208
+ };
209
+
210
+ const addEventHandlerToMap = (
211
+ eventHandler: EventHandler,
212
+ q: QueueObject<CommittedEvent<any>>
213
+ ) => {
214
+ eventHandlerMap[eventHandler.name] = {
215
+ eventHandler: {
216
+ ...eventHandler,
217
+ },
218
+ events: Object.keys( eventHandler.events ),
219
+ queue: q,
220
+ };
221
+ };
222
+
223
+ const EventHandlerQueueFunction =
224
+ (
225
+ executeCommand: ExecuteCommandFunction,
226
+ eventHandler: EventHandler,
227
+ label: string
228
+ ) =>
229
+ ( event: CommittedEvent, callback ) => {
230
+ return Promise.resolve( event )
231
+ .then(( event ) => {
232
+ if ( !eventHandler.events[event.name || ''])
233
+ return Promise.reject(
234
+ Error(
235
+ `Event ${event.name} Not recognized for ${label} ${eventHandler.name}`
236
+ )
237
+ );
238
+ logger.log(
239
+ 'Handling Event',
240
+ event.name,
241
+ 'in',
242
+ label,
243
+ eventHandler.name
244
+ );
245
+ logger.debug( 'with payload:', event );
246
+ return event;
247
+ })
248
+ .then( handleEvent( eventHandler, executeCommand ))
249
+ .then(() => callback(), callback );
250
+ };
251
+
252
+ const getEventSchema =
253
+ ( eventHandler: EventHandler ) => ( eventName: string ) => {
254
+ return CommittedEventSchema(
255
+ eventHandler.events[eventName]().schema?.copyWith({
256
+ plain: { $id: eventName },
257
+ }) as BaseSchema,
258
+ eventName
259
+ ).required( 'name', 'data' );
260
+ };
261
+
262
+ const registerEventHandlerEndpoint = (
263
+ eventHandler: EventHandler,
264
+ label: string,
265
+ tags?: string[]
266
+ ) => {
267
+ const route = `/${paramCase( eventHandler.name )}`;
268
+
269
+ endpoints.registerEndpoint({
270
+ module: eventHandler.name,
271
+ name: `Subscription endpoint for ${eventHandler.name}`,
272
+ description: `Process events sent to the ${label}`,
273
+ tags,
274
+ schemas: {
275
+ body: S.anyOf(
276
+ ...Object.keys( eventHandler.events ).map( getEventSchema( eventHandler ))
277
+ ),
278
+ },
279
+ shouldValidate: false,
280
+ route,
281
+ method: 'POST',
282
+ action: ({ body }) => processEvent( eventHandler.name )( body ),
283
+ });
284
+
285
+ return route;
286
+ };
287
+
288
+ const defaultQueryHandler: QueryHandler = <Model extends Document>(
289
+ repository: Collection<Model>,
290
+ { id, limit, after, filter, sort, select }: CollectionQueryParams<Model>
291
+ ) => {
292
+ if ( id ) return repository.readById( id as string );
293
+
294
+ return repository.query({
295
+ limit,
296
+ after,
297
+ filter,
298
+ sort,
299
+ select,
300
+ });
301
+ };
302
+
303
+ const registerReadModelQueryEndpoint = (
304
+ query: Query,
305
+ readModel: ReadModel
306
+ ) => {
307
+ const route = query.route || `/${paramCase( readModel.name )}`;
308
+ const schema = readModel.schema.id( readModel.name );
309
+ const schemas: EndpointSchemas<any, any, any> = {
310
+ ...defaultParamsSchemas,
311
+ ...defaultQuerySchemas,
312
+ ...( query.schemas ? query.schemas : {}),
313
+ responses: {
314
+ 200: [
315
+ {
316
+ name: 'OK',
317
+ schema: S.oneOf( schema, S.array().items( schema )),
318
+ },
319
+ ],
320
+ },
321
+ };
322
+ if ( readModel.database && query.subscriptions ) {
323
+ const subscriptions = query.subscriptions?.map(( s ) => {
324
+ // FIXME: Esto esta pasando por cada request de subscription
325
+ s.readModelSubscriptionCloseEmitter.on( 'close', ( id ) => {
326
+ logger.debug( 'Subscription Closed for id', id, 'in subscription' );
327
+ delete activeSubscriptions[id];
328
+ if ( Object.keys( activeSubscriptions ).length === 0 )
329
+ endpoints.callEventConnectionsInactive();
330
+ });
331
+ return s.notifySubscriptions( logger, readModel.collection! );
332
+ });
333
+ readModel.database.onStarted(() => {
334
+ readModel
335
+ .database!.getCollection( readModel.collection! )
336
+ .watch([ 'delete', 'insert', 'update' ], ( data ) => {
337
+ subscriptions?.forEach(( s ) => {
338
+ s( data );
339
+ });
340
+ });
341
+ });
342
+ }
343
+
344
+ endpoints.registerEndpoint({
345
+ method: 'GET',
346
+ module: readModel.name,
347
+ name: `Readmodel Query endpoint for ${readModel.name}`,
348
+ description: query.description,
349
+ schemas,
350
+ tags: ['readmodel'],
351
+ route: `${route}/:id?`,
352
+ action: async ( params ) => {
353
+ const projectionParams = (
354
+ query.translator || defaultQueryParamsTranslator
355
+ )( readModel.schema, params );
356
+ const transformedProjectionParams = !query.transformers
357
+ ? projectionParams
358
+ : await query.transformers.reduce(( promise, transformer ) => {
359
+ return promise.then(( projectionParams ) =>
360
+ transformer( projectionParams, params )
361
+ );
362
+ }, Promise.resolve( projectionParams ));
363
+ const data = await ( query.queryHandler || defaultQueryHandler )(
364
+ readModel.database?.getCollection( readModel.collection || readModel.name ) as any,
365
+ { ...transformedProjectionParams, params }
366
+ );
367
+ readModel.database &&
368
+ query.subscriptions?.forEach(( s ) => {
369
+ const id = s.startSubscription(
370
+ transformedProjectionParams,
371
+ params.context?.req as RequestObject,
372
+ params.context?.res as ResponseObject
373
+ );
374
+ if ( id ) {
375
+ activeSubscriptions[id] = s.type;
376
+ endpoints.callEventConnectionsActive();
377
+ ensureArray( data ).forEach(( data: any ) => {
378
+ s.notifySubscriptions( logger, readModel.collection! )(
379
+ { changeType: 'update', data },
380
+ id
381
+ );
382
+ });
383
+ }
384
+ });
385
+ return data;
386
+ },
387
+ });
388
+
389
+ return route;
390
+ };
391
+
392
+ const registerEventHandler = (
393
+ eventHandler: EventHandler,
394
+ executeCommand: ExecuteCommandFunction
395
+ ): string => {
396
+ const isReadmodel = isReadModel( eventHandler );
397
+ if ( eventHandlerMap[eventHandler.name]) {
398
+ dieOnError( logger )(
399
+ `A policy or projector with the name ${eventHandler.name} already exists on this instance.`
400
+ );
401
+ }
402
+ const label = getEventHandlerLabel( eventHandler );
403
+ const q = queue(
404
+ EventHandlerQueueFunction( executeCommand, eventHandler, label ),
405
+ eventHandler.concurrency || 1
406
+ );
407
+ addEventHandlerToMap( eventHandler, q );
408
+ const eventHandlerRoute = registerEventHandlerEndpoint(
409
+ eventHandler,
410
+ label,
411
+ isReadmodel ? ['readmodel'] : ['policy']
412
+ );
413
+
414
+ if ( isReadmodel ) {
415
+ const qs = ( eventHandler as ReadModel ).queries || [{}];
416
+ qs.forEach(( q ) => {
417
+ registerReadModelQueryEndpoint( q, eventHandler as ReadModel );
418
+ });
419
+ }
420
+
421
+ return eventHandlerRoute;
422
+ };
423
+
424
+ return {
425
+ handleEvent,
426
+ pauseQueue,
427
+ registerEventHandler,
428
+ };
429
+ };
@@ -0,0 +1,98 @@
1
+ import { map } from '@bett3r-dev/bett3r-utils';
2
+ import { Aggregate, Builder, EndpointsPort, EventHandler, EventSourcingPort, EventStorePort, LoggerPort, ReadModel, System } from '@bett3r-dev/pv3-types';
3
+ import c from 'ansi-colors';
4
+ import { createPort } from '../base';
5
+ import { createCommandHandlers } from './commandHandlers';
6
+ import { createEventHandlers } from './eventHandlers';
7
+ export * from './commandHandlers';
8
+ export * from './commandTemplates';
9
+ export * from './eventHandlers';
10
+ export * from './invariants';
11
+ export * from './subscriptions';
12
+ export * from './utils';
13
+
14
+ export const EventSourcing = ( loggerPort: LoggerPort, eventstore: EventStorePort, endpoints: EndpointsPort ): EventSourcingPort => {
15
+ const logger = loggerPort.createLoggerInstance( 'eventsourcing' );
16
+
17
+ const commandHandlersManager = createCommandHandlers( logger, endpoints, eventstore );
18
+ const eventHandlersManager = createEventHandlers( logger, endpoints );
19
+ const registeredEndpoints: {
20
+ aggregates: Record<string,any>,
21
+ systems: Record<string,any>,
22
+ policies: Record<string,any>,
23
+ projectors: Record<string,any>
24
+ } = {
25
+ aggregates: {},
26
+ systems: {},
27
+ policies: {},
28
+ projectors: {},
29
+ };
30
+
31
+ const logRoute = ( name: string, { route, events }, inverse = false ) => {
32
+ logger.log( name, c.underline( route ), inverse ? '<=' : '=>', events.join( ', ' ));
33
+ };
34
+
35
+ const logEventsourcingRoutes = () => {
36
+ Object.keys( registeredEndpoints.aggregates ).forEach(( aggregate ) => {
37
+ logger.log( c.bgYellowBright( c.bold.blackBright( aggregate )));
38
+ Object.keys( registeredEndpoints.aggregates[aggregate].commands ).forEach(( command ) => {
39
+ logRoute( `\t${ c.bold( command )}`, registeredEndpoints.aggregates[aggregate].commands[command]);
40
+ });
41
+ });
42
+ Object.keys( registeredEndpoints.systems ).forEach(( system ) => {
43
+ logger.log( c.bgMagentaBright( c.bold.whiteBright( system )));
44
+ Object.keys( registeredEndpoints.systems[system].commands ).forEach(( command ) => {
45
+ logRoute( `\t${ c.bold( command )}`, registeredEndpoints.systems[system].commands[command]);
46
+ });
47
+ });
48
+ Object.keys( registeredEndpoints.policies ).forEach(( policy ) => {
49
+ logger.log( c.bgMagenta( c.bold.whiteBright( policy )));
50
+ logRoute( `\t${ c.bold( policy )}`, registeredEndpoints.policies[policy], true );
51
+ });
52
+ Object.keys( registeredEndpoints.projectors ).forEach(( projector ) => {
53
+ logger.log( c.bgGreenBright( c.bold.whiteBright( projector )));
54
+ logRoute( `\t${ c.bold( projector )}`, registeredEndpoints.projectors[projector], true );
55
+ });
56
+ };
57
+
58
+ const routeCommandHandler = ( commandHandler: System ): void => {
59
+ const commands = commandHandler.commands;
60
+ const getEndpoints = commandHandlersManager.registerCommandHandlerGetEndpoints( commandHandler );
61
+ const commandEndpoints = commandHandlersManager.registerCommandHandlerPostEndpoints( commandHandler );
62
+ const c = map(( route, command ) => ({
63
+ route,
64
+ events: ( commands[command].build ? commands[command].build() : commands[command]).events
65
+ }), commandEndpoints );
66
+ if (( commandHandler as Aggregate ).isAggregate )
67
+ registeredEndpoints.aggregates[commandHandler.name] = { getEndpoints, commands:c };
68
+ else
69
+ registeredEndpoints.systems[commandHandler.name] = { getEndpoints, commands:c };
70
+ };
71
+
72
+ const routeEventHandler = (
73
+ eventHandler: EventHandler | Builder<EventHandler>
74
+ ) :void => {
75
+ const eh = ( eventHandler as Builder ).build ? ( eventHandler as Builder ).build() : eventHandler;
76
+ const route = eventHandlersManager.registerEventHandler( eh, commandHandlersManager.executeCommand );
77
+ if (( eh as ReadModel ).isReadModel )
78
+ registeredEndpoints.projectors[eh.name] = { route, events: Object.keys( eh.events ) };
79
+ else
80
+ registeredEndpoints.policies[eh.name] = { route, events: Object.keys( eh.events ) };
81
+ };
82
+
83
+ const eventsourcingPort = createPort({
84
+ _eventstore: eventstore,
85
+ routeEventHandler,
86
+ routeCommandHandler,
87
+
88
+ loadStream: commandHandlersManager.loadStream,
89
+ loadAggregateState: commandHandlersManager.loadAggregateState,
90
+
91
+ handleEvent: eventHandlersManager.handleEvent,
92
+ executeCommand: commandHandlersManager.executeCommand,
93
+
94
+ logEventsourcingRoutes
95
+ });
96
+
97
+ return eventsourcingPort;
98
+ };
@@ -0,0 +1,25 @@
1
+ import { noop } from '@bett3r-dev/bett3r-utils';
2
+ import { InvariantType } from '@bett3r-dev/pv3-types';
3
+ import { createInvariant } from '.';
4
+
5
+ export const and = ( ...invariants: InvariantType[]): InvariantType => {
6
+ return createInvariant(
7
+ async ( handlerState ) => {
8
+ return Promise.all(
9
+ invariants.map( i => i.check( handlerState ))
10
+ )
11
+ .then( noop );
12
+ }
13
+ );
14
+ };
15
+
16
+ export const or = ( ...invariants: InvariantType[]): InvariantType => {
17
+ return createInvariant(
18
+ async ( handlerState ) => {
19
+ return Promise.any(
20
+ invariants.map( i => i.check( handlerState ))
21
+ )
22
+ .then( noop );
23
+ }
24
+ );
25
+ };
@@ -0,0 +1,42 @@
1
+ import S, { BaseSchema } from '@bett3r-dev/jsonschema-definer';
2
+ import { CommandHandlerState, ErrorTypes, InvariantType } from '@bett3r-dev/pv3-types';
3
+ import { always } from 'ramda';
4
+ import { AppError, createError } from '../../../utils';
5
+
6
+ export function createInvariant<Model, Payload, Error = any>(
7
+ check: ( handlerState: CommandHandlerState<any, Payload, Model> ) => Promise<void>,
8
+ error: {
9
+ name?: string,
10
+ description?: string,
11
+ type?: ErrorTypes,
12
+ details?: Error,
13
+ schema?: BaseSchema<Error>
14
+ } = {
15
+ name: 'Invariant Error',
16
+ description: 'Invariant Validation Failed',
17
+ details: null as Error,
18
+ type: 'BadRequestError',
19
+ schema: S.shape<any>({})
20
+ }
21
+ ): InvariantType<Model, Payload> {
22
+ const GenericError = AppError({
23
+ schema: error.schema,
24
+ error: error.name,
25
+ type: error.type || 'BadRequestError'
26
+ });
27
+ return {
28
+ rejects: [GenericError],
29
+ check: async ( handlerState ) => {
30
+ return check( handlerState )
31
+ .then( always( handlerState ))
32
+ .catch(( err ) => {
33
+ return Promise.reject(
34
+ createError( GenericError, {
35
+ ...error,
36
+ ...err
37
+ })
38
+ );
39
+ });
40
+ }
41
+ };
42
+ }