node-cqrs 0.17.0 → 1.0.0-beta.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 (608) hide show
  1. package/CHANGELOG.md +583 -92
  2. package/LICENSE +202 -21
  3. package/NOTICE +15 -0
  4. package/README.md +429 -113
  5. package/dist/cjs/AbstractAggregate.js +193 -0
  6. package/dist/cjs/AbstractAggregate.js.map +1 -0
  7. package/dist/cjs/AbstractProjection.js +165 -0
  8. package/dist/cjs/AbstractProjection.js.map +1 -0
  9. package/dist/cjs/AbstractSaga.js +109 -0
  10. package/dist/cjs/AbstractSaga.js.map +1 -0
  11. package/dist/cjs/AggregateCommandHandler.js +182 -0
  12. package/dist/cjs/AggregateCommandHandler.js.map +1 -0
  13. package/dist/cjs/CommandBus.js +9 -0
  14. package/dist/cjs/CommandBus.js.map +1 -0
  15. package/dist/cjs/CqrsContainerBuilder.js +97 -0
  16. package/dist/cjs/CqrsContainerBuilder.js.map +1 -0
  17. package/dist/cjs/Event.js +19 -0
  18. package/dist/cjs/Event.js.map +1 -0
  19. package/dist/cjs/EventDispatchPipeline.js +83 -0
  20. package/dist/cjs/EventDispatchPipeline.js.map +1 -0
  21. package/dist/cjs/EventDispatcher.js +93 -0
  22. package/dist/cjs/EventDispatcher.js.map +1 -0
  23. package/dist/cjs/EventIdAugmentor.js +30 -0
  24. package/dist/cjs/EventIdAugmentor.js.map +1 -0
  25. package/dist/cjs/EventStore.js +106 -0
  26. package/dist/cjs/EventStore.js.map +1 -0
  27. package/dist/cjs/SagaEventHandler.js +153 -0
  28. package/dist/cjs/SagaEventHandler.js.map +1 -0
  29. package/dist/cjs/errors/ConcurrencyError.js +21 -0
  30. package/dist/cjs/errors/ConcurrencyError.js.map +1 -0
  31. package/dist/{infrastructure/utils → cjs/errors}/index.js +1 -2
  32. package/dist/cjs/errors/index.js.map +1 -0
  33. package/dist/cjs/in-memory/InMemoryEventStorage.js +106 -0
  34. package/dist/cjs/in-memory/InMemoryEventStorage.js.map +1 -0
  35. package/dist/cjs/in-memory/InMemoryLock.js +44 -0
  36. package/dist/cjs/in-memory/InMemoryLock.js.map +1 -0
  37. package/dist/cjs/in-memory/InMemoryMessageBus.js +93 -0
  38. package/dist/cjs/in-memory/InMemoryMessageBus.js.map +1 -0
  39. package/dist/cjs/in-memory/InMemorySnapshotStorage.js +101 -0
  40. package/dist/cjs/in-memory/InMemorySnapshotStorage.js.map +1 -0
  41. package/dist/{infrastructure → cjs/in-memory}/InMemoryView.js +26 -45
  42. package/dist/cjs/in-memory/InMemoryView.js.map +1 -0
  43. package/dist/{utils → cjs/in-memory}/index.js +5 -8
  44. package/dist/cjs/in-memory/index.js.map +1 -0
  45. package/dist/cjs/in-memory/utils/index.js +18 -0
  46. package/dist/cjs/in-memory/utils/index.js.map +1 -0
  47. package/dist/{infrastructure → cjs/in-memory}/utils/nextCycle.js +1 -1
  48. package/dist/cjs/in-memory/utils/nextCycle.js.map +1 -0
  49. package/dist/cjs/index.js +58 -0
  50. package/dist/cjs/index.js.map +1 -0
  51. package/dist/{interfaces.js → cjs/interfaces/IAggregate.js} +1 -2
  52. package/dist/cjs/interfaces/IAggregate.js.map +1 -0
  53. package/dist/cjs/interfaces/IAggregateSnapshotStorage.js +13 -0
  54. package/dist/cjs/interfaces/IAggregateSnapshotStorage.js.map +1 -0
  55. package/dist/cjs/interfaces/ICommand.js +3 -0
  56. package/dist/cjs/interfaces/ICommand.js.map +1 -0
  57. package/dist/cjs/interfaces/ICommandBus.js +3 -0
  58. package/dist/cjs/interfaces/ICommandBus.js.map +1 -0
  59. package/dist/cjs/interfaces/IContainer.js +3 -0
  60. package/dist/cjs/interfaces/IContainer.js.map +1 -0
  61. package/dist/cjs/interfaces/IDispatchPipelineProcessor.js +9 -0
  62. package/dist/cjs/interfaces/IDispatchPipelineProcessor.js.map +1 -0
  63. package/dist/cjs/interfaces/IEvent.js +10 -0
  64. package/dist/cjs/interfaces/IEvent.js.map +1 -0
  65. package/dist/cjs/interfaces/IEventBus.js +9 -0
  66. package/dist/cjs/interfaces/IEventBus.js.map +1 -0
  67. package/dist/cjs/interfaces/IEventDispatcher.js +3 -0
  68. package/dist/cjs/interfaces/IEventDispatcher.js.map +1 -0
  69. package/dist/cjs/interfaces/IEventLocker.js +15 -0
  70. package/dist/cjs/interfaces/IEventLocker.js.map +1 -0
  71. package/dist/cjs/interfaces/IEventReceptor.js +3 -0
  72. package/dist/cjs/interfaces/IEventReceptor.js.map +1 -0
  73. package/dist/cjs/interfaces/IEventSet.js +8 -0
  74. package/dist/cjs/interfaces/IEventSet.js.map +1 -0
  75. package/dist/cjs/interfaces/IEventStorageReader.js +13 -0
  76. package/dist/cjs/interfaces/IEventStorageReader.js.map +1 -0
  77. package/dist/cjs/interfaces/IEventStore.js +3 -0
  78. package/dist/cjs/interfaces/IEventStore.js.map +1 -0
  79. package/dist/cjs/interfaces/IEventStream.js +3 -0
  80. package/dist/cjs/interfaces/IEventStream.js.map +1 -0
  81. package/dist/cjs/interfaces/IIdentifierProvider.js +9 -0
  82. package/dist/cjs/interfaces/IIdentifierProvider.js.map +1 -0
  83. package/dist/cjs/interfaces/ILocker.js +9 -0
  84. package/dist/cjs/interfaces/ILocker.js.map +1 -0
  85. package/dist/cjs/interfaces/ILogger.js +3 -0
  86. package/dist/cjs/interfaces/ILogger.js.map +1 -0
  87. package/dist/cjs/interfaces/IMessage.js +10 -0
  88. package/dist/cjs/interfaces/IMessage.js.map +1 -0
  89. package/dist/cjs/interfaces/IMutableState.js +3 -0
  90. package/dist/cjs/interfaces/IMutableState.js.map +1 -0
  91. package/dist/cjs/interfaces/IObjectStorage.js +3 -0
  92. package/dist/cjs/interfaces/IObjectStorage.js.map +1 -0
  93. package/dist/cjs/interfaces/IObservable.js +11 -0
  94. package/dist/cjs/interfaces/IObservable.js.map +1 -0
  95. package/dist/cjs/interfaces/IObservableQueueProvider.js +9 -0
  96. package/dist/cjs/interfaces/IObservableQueueProvider.js.map +1 -0
  97. package/dist/cjs/interfaces/IObserver.js +3 -0
  98. package/dist/cjs/interfaces/IObserver.js.map +1 -0
  99. package/dist/cjs/interfaces/IProjection.js +3 -0
  100. package/dist/cjs/interfaces/IProjection.js.map +1 -0
  101. package/dist/cjs/interfaces/ISaga.js +3 -0
  102. package/dist/cjs/interfaces/ISaga.js.map +1 -0
  103. package/dist/cjs/interfaces/ISnapshotEvent.js +10 -0
  104. package/dist/cjs/interfaces/ISnapshotEvent.js.map +1 -0
  105. package/dist/cjs/interfaces/IViewLocker.js +21 -0
  106. package/dist/cjs/interfaces/IViewLocker.js.map +1 -0
  107. package/dist/cjs/interfaces/Identifier.js +3 -0
  108. package/dist/cjs/interfaces/Identifier.js.map +1 -0
  109. package/dist/cjs/interfaces/index.js +46 -0
  110. package/dist/cjs/interfaces/index.js.map +1 -0
  111. package/dist/cjs/interfaces/isObject.js +9 -0
  112. package/dist/cjs/interfaces/isObject.js.map +1 -0
  113. package/dist/cjs/package.json +3 -0
  114. package/dist/cjs/rabbitmq/IContainer.js +3 -0
  115. package/dist/cjs/rabbitmq/IContainer.js.map +1 -0
  116. package/dist/cjs/rabbitmq/RabbitMqCommandBus.js +84 -0
  117. package/dist/cjs/rabbitmq/RabbitMqCommandBus.js.map +1 -0
  118. package/dist/cjs/rabbitmq/RabbitMqEventBus.js +121 -0
  119. package/dist/cjs/rabbitmq/RabbitMqEventBus.js.map +1 -0
  120. package/dist/cjs/rabbitmq/RabbitMqGateway.js +578 -0
  121. package/dist/cjs/rabbitmq/RabbitMqGateway.js.map +1 -0
  122. package/dist/cjs/rabbitmq/index.js +21 -0
  123. package/dist/cjs/rabbitmq/index.js.map +1 -0
  124. package/dist/cjs/rabbitmq/utils/index.js +19 -0
  125. package/dist/cjs/rabbitmq/utils/index.js.map +1 -0
  126. package/dist/cjs/rabbitmq/utils/registerExitCleanup.js +28 -0
  127. package/dist/cjs/rabbitmq/utils/registerExitCleanup.js.map +1 -0
  128. package/dist/cjs/rabbitmq/utils/resolveProvider.js +9 -0
  129. package/dist/cjs/rabbitmq/utils/resolveProvider.js.map +1 -0
  130. package/dist/cjs/sqlite/AbstractSqliteAccessor.js +50 -0
  131. package/dist/cjs/sqlite/AbstractSqliteAccessor.js.map +1 -0
  132. package/dist/cjs/sqlite/AbstractSqliteObjectProjection.js +26 -0
  133. package/dist/cjs/sqlite/AbstractSqliteObjectProjection.js.map +1 -0
  134. package/dist/cjs/sqlite/AbstractSqliteView.js +50 -0
  135. package/dist/cjs/sqlite/AbstractSqliteView.js.map +1 -0
  136. package/dist/cjs/sqlite/IContainer.js +3 -0
  137. package/dist/cjs/sqlite/IContainer.js.map +1 -0
  138. package/dist/cjs/sqlite/SqliteEventLocker.js +93 -0
  139. package/dist/cjs/sqlite/SqliteEventLocker.js.map +1 -0
  140. package/dist/cjs/sqlite/SqliteObjectStorage.js +114 -0
  141. package/dist/cjs/sqlite/SqliteObjectStorage.js.map +1 -0
  142. package/dist/cjs/sqlite/SqliteObjectView.js +48 -0
  143. package/dist/cjs/sqlite/SqliteObjectView.js.map +1 -0
  144. package/dist/cjs/sqlite/SqliteProjectionDataParams.js +3 -0
  145. package/dist/cjs/sqlite/SqliteProjectionDataParams.js.map +1 -0
  146. package/dist/cjs/sqlite/SqliteViewLocker.js +119 -0
  147. package/dist/cjs/sqlite/SqliteViewLocker.js.map +1 -0
  148. package/dist/cjs/sqlite/index.js +26 -0
  149. package/dist/cjs/sqlite/index.js.map +1 -0
  150. package/dist/cjs/sqlite/queries/eventLockTableInit.js +15 -0
  151. package/dist/cjs/sqlite/queries/eventLockTableInit.js.map +1 -0
  152. package/dist/cjs/sqlite/queries/index.js +19 -0
  153. package/dist/cjs/sqlite/queries/index.js.map +1 -0
  154. package/dist/cjs/sqlite/queries/viewLockTableInit.js +14 -0
  155. package/dist/cjs/sqlite/queries/viewLockTableInit.js.map +1 -0
  156. package/dist/cjs/sqlite/utils/getEventId.js +14 -0
  157. package/dist/cjs/sqlite/utils/getEventId.js.map +1 -0
  158. package/dist/cjs/sqlite/utils/guid.js +9 -0
  159. package/dist/cjs/sqlite/utils/guid.js.map +1 -0
  160. package/dist/cjs/sqlite/utils/index.js +19 -0
  161. package/dist/cjs/sqlite/utils/index.js.map +1 -0
  162. package/dist/cjs/utils/Deferred.js.map +1 -0
  163. package/dist/cjs/utils/Lock.js +102 -0
  164. package/dist/cjs/utils/Lock.js.map +1 -0
  165. package/dist/cjs/utils/MapAssertable.js +30 -0
  166. package/dist/cjs/utils/MapAssertable.js.map +1 -0
  167. package/dist/cjs/utils/assert.js +88 -0
  168. package/dist/cjs/utils/assert.js.map +1 -0
  169. package/dist/cjs/utils/clone.js +13 -0
  170. package/dist/cjs/utils/clone.js.map +1 -0
  171. package/dist/cjs/utils/extractErrorDetails.js +37 -0
  172. package/dist/cjs/utils/extractErrorDetails.js.map +1 -0
  173. package/dist/cjs/utils/getClassName.js.map +1 -0
  174. package/dist/{utils → cjs/utils}/getHandler.js +5 -7
  175. package/dist/cjs/utils/getHandler.js.map +1 -0
  176. package/dist/{utils → cjs/utils}/getMessageHandlerNames.js +2 -10
  177. package/dist/cjs/utils/getMessageHandlerNames.js.map +1 -0
  178. package/dist/cjs/utils/index.js +31 -0
  179. package/dist/cjs/utils/index.js.map +1 -0
  180. package/dist/cjs/utils/isClass.js.map +1 -0
  181. package/dist/cjs/utils/sagaId.js +23 -0
  182. package/dist/cjs/utils/sagaId.js.map +1 -0
  183. package/dist/{utils → cjs/utils}/setupOneTimeEmitterSubscription.js +7 -8
  184. package/dist/cjs/utils/setupOneTimeEmitterSubscription.js.map +1 -0
  185. package/dist/cjs/utils/subscribe.js +43 -0
  186. package/dist/cjs/utils/subscribe.js.map +1 -0
  187. package/dist/{utils → cjs/utils}/validateHandlers.js +6 -6
  188. package/dist/cjs/utils/validateHandlers.js.map +1 -0
  189. package/dist/cjs/workers/AbstractWorkerProjection.js +56 -0
  190. package/dist/cjs/workers/AbstractWorkerProjection.js.map +1 -0
  191. package/dist/cjs/workers/WorkerProxyProjection.js +142 -0
  192. package/dist/cjs/workers/WorkerProxyProjection.js.map +1 -0
  193. package/dist/cjs/workers/index.js +20 -0
  194. package/dist/cjs/workers/index.js.map +1 -0
  195. package/dist/cjs/workers/interfaces/IProxyProjection.js +3 -0
  196. package/dist/cjs/workers/interfaces/IProxyProjection.js.map +1 -0
  197. package/dist/cjs/workers/interfaces/IWorkerProjection.js +3 -0
  198. package/dist/cjs/workers/interfaces/IWorkerProjection.js.map +1 -0
  199. package/dist/cjs/workers/interfaces/index.js +3 -0
  200. package/dist/cjs/workers/interfaces/index.js.map +1 -0
  201. package/dist/cjs/workers/protocol.js +16 -0
  202. package/dist/cjs/workers/protocol.js.map +1 -0
  203. package/dist/cjs/workers/utils/ProjectionView.js +3 -0
  204. package/dist/cjs/workers/utils/ProjectionView.js.map +1 -0
  205. package/dist/cjs/workers/utils/createWorker.js +87 -0
  206. package/dist/cjs/workers/utils/createWorker.js.map +1 -0
  207. package/dist/cjs/workers/utils/createWorkerInstance.js +59 -0
  208. package/dist/cjs/workers/utils/createWorkerInstance.js.map +1 -0
  209. package/dist/cjs/workers/utils/index.js +21 -0
  210. package/dist/cjs/workers/utils/index.js.map +1 -0
  211. package/dist/cjs/workers/utils/nodeEndpoint.js +8 -0
  212. package/dist/cjs/workers/utils/nodeEndpoint.js.map +1 -0
  213. package/dist/cjs/workers/utils/workerProxyFactory.js +21 -0
  214. package/dist/cjs/workers/utils/workerProxyFactory.js.map +1 -0
  215. package/dist/esm/AbstractAggregate.js +189 -0
  216. package/dist/esm/AbstractAggregate.js.map +1 -0
  217. package/dist/esm/AbstractProjection.js +161 -0
  218. package/dist/esm/AbstractProjection.js.map +1 -0
  219. package/dist/esm/AbstractSaga.js +105 -0
  220. package/dist/esm/AbstractSaga.js.map +1 -0
  221. package/dist/esm/AggregateCommandHandler.js +178 -0
  222. package/dist/esm/AggregateCommandHandler.js.map +1 -0
  223. package/dist/esm/CommandBus.js +5 -0
  224. package/dist/esm/CommandBus.js.map +1 -0
  225. package/dist/esm/CqrsContainerBuilder.js +93 -0
  226. package/dist/esm/CqrsContainerBuilder.js.map +1 -0
  227. package/dist/esm/Event.js +15 -0
  228. package/dist/esm/Event.js.map +1 -0
  229. package/dist/esm/EventDispatchPipeline.js +79 -0
  230. package/dist/esm/EventDispatchPipeline.js.map +1 -0
  231. package/dist/esm/EventDispatcher.js +89 -0
  232. package/dist/esm/EventDispatcher.js.map +1 -0
  233. package/dist/esm/EventIdAugmentor.js +26 -0
  234. package/dist/esm/EventIdAugmentor.js.map +1 -0
  235. package/dist/esm/EventStore.js +102 -0
  236. package/dist/esm/EventStore.js.map +1 -0
  237. package/dist/esm/SagaEventHandler.js +116 -0
  238. package/dist/esm/SagaEventHandler.js.map +1 -0
  239. package/dist/esm/errors/ConcurrencyError.js +17 -0
  240. package/dist/esm/errors/ConcurrencyError.js.map +1 -0
  241. package/dist/esm/errors/index.js +2 -0
  242. package/dist/esm/errors/index.js.map +1 -0
  243. package/dist/esm/in-memory/InMemoryEventStorage.js +102 -0
  244. package/dist/esm/in-memory/InMemoryEventStorage.js.map +1 -0
  245. package/dist/esm/in-memory/InMemoryLock.js +40 -0
  246. package/dist/esm/in-memory/InMemoryLock.js.map +1 -0
  247. package/dist/esm/in-memory/InMemoryMessageBus.js +89 -0
  248. package/dist/esm/in-memory/InMemoryMessageBus.js.map +1 -0
  249. package/dist/esm/in-memory/InMemorySnapshotStorage.js +64 -0
  250. package/dist/esm/in-memory/InMemorySnapshotStorage.js.map +1 -0
  251. package/dist/esm/in-memory/InMemoryView.js +150 -0
  252. package/dist/esm/in-memory/InMemoryView.js.map +1 -0
  253. package/dist/esm/in-memory/index.js +6 -0
  254. package/dist/esm/in-memory/index.js.map +1 -0
  255. package/dist/esm/in-memory/utils/index.js +2 -0
  256. package/dist/esm/in-memory/utils/index.js.map +1 -0
  257. package/dist/esm/in-memory/utils/nextCycle.js +5 -0
  258. package/dist/esm/in-memory/utils/nextCycle.js.map +1 -0
  259. package/dist/esm/index.js +16 -0
  260. package/dist/esm/index.js.map +1 -0
  261. package/dist/esm/interfaces/IAggregate.js +2 -0
  262. package/dist/esm/interfaces/IAggregate.js.map +1 -0
  263. package/dist/esm/interfaces/IAggregateSnapshotStorage.js +9 -0
  264. package/dist/esm/interfaces/IAggregateSnapshotStorage.js.map +1 -0
  265. package/dist/esm/interfaces/ICommand.js +2 -0
  266. package/dist/esm/interfaces/ICommand.js.map +1 -0
  267. package/dist/esm/interfaces/ICommandBus.js +2 -0
  268. package/dist/esm/interfaces/ICommandBus.js.map +1 -0
  269. package/dist/esm/interfaces/IContainer.js +2 -0
  270. package/dist/esm/interfaces/IContainer.js.map +1 -0
  271. package/dist/esm/interfaces/IDispatchPipelineProcessor.js +5 -0
  272. package/dist/esm/interfaces/IDispatchPipelineProcessor.js.map +1 -0
  273. package/dist/esm/interfaces/IEvent.js +6 -0
  274. package/dist/esm/interfaces/IEvent.js.map +1 -0
  275. package/dist/esm/interfaces/IEventBus.js +5 -0
  276. package/dist/esm/interfaces/IEventBus.js.map +1 -0
  277. package/dist/esm/interfaces/IEventDispatcher.js +2 -0
  278. package/dist/esm/interfaces/IEventDispatcher.js.map +1 -0
  279. package/dist/esm/interfaces/IEventLocker.js +11 -0
  280. package/dist/esm/interfaces/IEventLocker.js.map +1 -0
  281. package/dist/esm/interfaces/IEventReceptor.js +2 -0
  282. package/dist/esm/interfaces/IEventReceptor.js.map +1 -0
  283. package/dist/esm/interfaces/IEventSet.js +4 -0
  284. package/dist/esm/interfaces/IEventSet.js.map +1 -0
  285. package/dist/esm/interfaces/IEventStorageReader.js +9 -0
  286. package/dist/esm/interfaces/IEventStorageReader.js.map +1 -0
  287. package/dist/esm/interfaces/IEventStore.js +2 -0
  288. package/dist/esm/interfaces/IEventStore.js.map +1 -0
  289. package/dist/esm/interfaces/IEventStream.js +2 -0
  290. package/dist/esm/interfaces/IEventStream.js.map +1 -0
  291. package/dist/esm/interfaces/IIdentifierProvider.js +5 -0
  292. package/dist/esm/interfaces/IIdentifierProvider.js.map +1 -0
  293. package/dist/esm/interfaces/ILocker.js +5 -0
  294. package/dist/esm/interfaces/ILocker.js.map +1 -0
  295. package/dist/esm/interfaces/ILogger.js +2 -0
  296. package/dist/esm/interfaces/ILogger.js.map +1 -0
  297. package/dist/esm/interfaces/IMessage.js +6 -0
  298. package/dist/esm/interfaces/IMessage.js.map +1 -0
  299. package/dist/esm/interfaces/IMutableState.js +2 -0
  300. package/dist/esm/interfaces/IMutableState.js.map +1 -0
  301. package/dist/esm/interfaces/IObjectStorage.js +2 -0
  302. package/dist/esm/interfaces/IObjectStorage.js.map +1 -0
  303. package/dist/esm/interfaces/IObservable.js +7 -0
  304. package/dist/esm/interfaces/IObservable.js.map +1 -0
  305. package/dist/esm/interfaces/IObservableQueueProvider.js +5 -0
  306. package/dist/esm/interfaces/IObservableQueueProvider.js.map +1 -0
  307. package/dist/esm/interfaces/IObserver.js +2 -0
  308. package/dist/esm/interfaces/IObserver.js.map +1 -0
  309. package/dist/esm/interfaces/IProjection.js +2 -0
  310. package/dist/esm/interfaces/IProjection.js.map +1 -0
  311. package/dist/esm/interfaces/ISaga.js +2 -0
  312. package/dist/esm/interfaces/ISaga.js.map +1 -0
  313. package/dist/esm/interfaces/ISnapshotEvent.js +6 -0
  314. package/dist/esm/interfaces/ISnapshotEvent.js.map +1 -0
  315. package/dist/esm/interfaces/IViewLocker.js +17 -0
  316. package/dist/esm/interfaces/IViewLocker.js.map +1 -0
  317. package/dist/esm/interfaces/Identifier.js +2 -0
  318. package/dist/esm/interfaces/Identifier.js.map +1 -0
  319. package/dist/esm/interfaces/index.js +30 -0
  320. package/dist/esm/interfaces/index.js.map +1 -0
  321. package/dist/esm/interfaces/isObject.js +5 -0
  322. package/dist/esm/interfaces/isObject.js.map +1 -0
  323. package/dist/esm/rabbitmq/IContainer.js +2 -0
  324. package/dist/esm/rabbitmq/IContainer.js.map +1 -0
  325. package/dist/esm/rabbitmq/RabbitMqCommandBus.js +80 -0
  326. package/dist/esm/rabbitmq/RabbitMqCommandBus.js.map +1 -0
  327. package/dist/esm/rabbitmq/RabbitMqEventBus.js +117 -0
  328. package/dist/esm/rabbitmq/RabbitMqEventBus.js.map +1 -0
  329. package/dist/esm/rabbitmq/RabbitMqGateway.js +541 -0
  330. package/dist/esm/rabbitmq/RabbitMqGateway.js.map +1 -0
  331. package/dist/esm/rabbitmq/index.js +5 -0
  332. package/dist/esm/rabbitmq/index.js.map +1 -0
  333. package/dist/esm/rabbitmq/utils/index.js +3 -0
  334. package/dist/esm/rabbitmq/utils/index.js.map +1 -0
  335. package/dist/esm/rabbitmq/utils/registerExitCleanup.js +24 -0
  336. package/dist/esm/rabbitmq/utils/registerExitCleanup.js.map +1 -0
  337. package/dist/esm/rabbitmq/utils/resolveProvider.js +6 -0
  338. package/dist/esm/rabbitmq/utils/resolveProvider.js.map +1 -0
  339. package/dist/esm/sqlite/AbstractSqliteAccessor.js +46 -0
  340. package/dist/esm/sqlite/AbstractSqliteAccessor.js.map +1 -0
  341. package/dist/esm/sqlite/AbstractSqliteObjectProjection.js +22 -0
  342. package/dist/esm/sqlite/AbstractSqliteObjectProjection.js.map +1 -0
  343. package/dist/esm/sqlite/AbstractSqliteView.js +46 -0
  344. package/dist/esm/sqlite/AbstractSqliteView.js.map +1 -0
  345. package/dist/esm/sqlite/IContainer.js +2 -0
  346. package/dist/esm/sqlite/IContainer.js.map +1 -0
  347. package/dist/esm/sqlite/SqliteEventLocker.js +89 -0
  348. package/dist/esm/sqlite/SqliteEventLocker.js.map +1 -0
  349. package/dist/esm/sqlite/SqliteObjectStorage.js +110 -0
  350. package/dist/esm/sqlite/SqliteObjectStorage.js.map +1 -0
  351. package/dist/esm/sqlite/SqliteObjectView.js +44 -0
  352. package/dist/esm/sqlite/SqliteObjectView.js.map +1 -0
  353. package/dist/esm/sqlite/SqliteProjectionDataParams.js +2 -0
  354. package/dist/esm/sqlite/SqliteProjectionDataParams.js.map +1 -0
  355. package/dist/esm/sqlite/SqliteViewLocker.js +115 -0
  356. package/dist/esm/sqlite/SqliteViewLocker.js.map +1 -0
  357. package/dist/esm/sqlite/index.js +10 -0
  358. package/dist/esm/sqlite/index.js.map +1 -0
  359. package/dist/esm/sqlite/queries/eventLockTableInit.js +11 -0
  360. package/dist/esm/sqlite/queries/eventLockTableInit.js.map +1 -0
  361. package/dist/esm/sqlite/queries/index.js +3 -0
  362. package/dist/esm/sqlite/queries/index.js.map +1 -0
  363. package/dist/esm/sqlite/queries/viewLockTableInit.js +10 -0
  364. package/dist/esm/sqlite/queries/viewLockTableInit.js.map +1 -0
  365. package/dist/esm/sqlite/utils/getEventId.js +7 -0
  366. package/dist/esm/sqlite/utils/getEventId.js.map +1 -0
  367. package/dist/esm/sqlite/utils/guid.js +5 -0
  368. package/dist/esm/sqlite/utils/guid.js.map +1 -0
  369. package/dist/esm/sqlite/utils/index.js +3 -0
  370. package/dist/esm/sqlite/utils/index.js.map +1 -0
  371. package/dist/esm/utils/Deferred.js +34 -0
  372. package/dist/esm/utils/Deferred.js.map +1 -0
  373. package/dist/esm/utils/Lock.js +97 -0
  374. package/dist/esm/utils/Lock.js.map +1 -0
  375. package/dist/esm/utils/MapAssertable.js +26 -0
  376. package/dist/esm/utils/MapAssertable.js.map +1 -0
  377. package/dist/esm/utils/assert.js +70 -0
  378. package/dist/esm/utils/assert.js.map +1 -0
  379. package/dist/esm/utils/clone.js +10 -0
  380. package/dist/esm/utils/clone.js.map +1 -0
  381. package/dist/esm/utils/extractErrorDetails.js +33 -0
  382. package/dist/esm/utils/extractErrorDetails.js.map +1 -0
  383. package/dist/esm/utils/getClassName.js +7 -0
  384. package/dist/esm/utils/getClassName.js.map +1 -0
  385. package/dist/esm/utils/getHandler.js +15 -0
  386. package/dist/esm/utils/getHandler.js.map +1 -0
  387. package/dist/esm/utils/getMessageHandlerNames.js +27 -0
  388. package/dist/esm/utils/getMessageHandlerNames.js.map +1 -0
  389. package/dist/esm/utils/index.js +15 -0
  390. package/dist/esm/utils/index.js.map +1 -0
  391. package/dist/esm/utils/isClass.js +5 -0
  392. package/dist/esm/utils/isClass.js.map +1 -0
  393. package/dist/esm/utils/sagaId.js +18 -0
  394. package/dist/esm/utils/sagaId.js.map +1 -0
  395. package/dist/esm/utils/setupOneTimeEmitterSubscription.js +42 -0
  396. package/dist/esm/utils/setupOneTimeEmitterSubscription.js.map +1 -0
  397. package/dist/esm/utils/subscribe.js +40 -0
  398. package/dist/esm/utils/subscribe.js.map +1 -0
  399. package/dist/esm/utils/validateHandlers.js +18 -0
  400. package/dist/esm/utils/validateHandlers.js.map +1 -0
  401. package/dist/esm/workers/AbstractWorkerProjection.js +52 -0
  402. package/dist/esm/workers/AbstractWorkerProjection.js.map +1 -0
  403. package/dist/esm/workers/WorkerProxyProjection.js +105 -0
  404. package/dist/esm/workers/WorkerProxyProjection.js.map +1 -0
  405. package/dist/esm/workers/index.js +4 -0
  406. package/dist/esm/workers/index.js.map +1 -0
  407. package/dist/esm/workers/interfaces/IProxyProjection.js +2 -0
  408. package/dist/esm/workers/interfaces/IProxyProjection.js.map +1 -0
  409. package/dist/esm/workers/interfaces/IWorkerProjection.js +2 -0
  410. package/dist/esm/workers/interfaces/IWorkerProjection.js.map +1 -0
  411. package/dist/esm/workers/interfaces/index.js +2 -0
  412. package/dist/esm/workers/interfaces/index.js.map +1 -0
  413. package/dist/esm/workers/protocol.js +11 -0
  414. package/dist/esm/workers/protocol.js.map +1 -0
  415. package/dist/esm/workers/utils/ProjectionView.js +2 -0
  416. package/dist/esm/workers/utils/ProjectionView.js.map +1 -0
  417. package/dist/esm/workers/utils/createWorker.js +51 -0
  418. package/dist/esm/workers/utils/createWorker.js.map +1 -0
  419. package/dist/esm/workers/utils/createWorkerInstance.js +23 -0
  420. package/dist/esm/workers/utils/createWorkerInstance.js.map +1 -0
  421. package/dist/esm/workers/utils/index.js +5 -0
  422. package/dist/esm/workers/utils/index.js.map +1 -0
  423. package/dist/esm/workers/utils/nodeEndpoint.js +5 -0
  424. package/dist/esm/workers/utils/nodeEndpoint.js.map +1 -0
  425. package/dist/esm/workers/utils/workerProxyFactory.js +18 -0
  426. package/dist/esm/workers/utils/workerProxyFactory.js.map +1 -0
  427. package/dist/types/AbstractAggregate.d.ts +80 -0
  428. package/dist/types/AbstractProjection.d.ts +77 -0
  429. package/dist/types/AbstractSaga.d.ts +42 -0
  430. package/dist/types/AggregateCommandHandler.d.ts +22 -0
  431. package/dist/types/CommandBus.d.ts +4 -0
  432. package/dist/types/CqrsContainerBuilder.d.ts +21 -0
  433. package/dist/types/Event.d.ts +9 -0
  434. package/dist/types/EventDispatchPipeline.d.ts +16 -0
  435. package/dist/types/EventDispatcher.d.ts +39 -0
  436. package/dist/types/EventIdAugmentor.d.ts +12 -0
  437. package/dist/types/EventStore.d.ts +29 -0
  438. package/dist/types/SagaEventHandler.d.ts +22 -0
  439. package/dist/types/errors/ConcurrencyError.d.ts +9 -0
  440. package/dist/types/errors/index.d.ts +1 -0
  441. package/dist/types/in-memory/InMemoryEventStorage.d.ts +24 -0
  442. package/dist/types/in-memory/InMemoryLock.d.ts +23 -0
  443. package/dist/types/in-memory/InMemoryMessageBus.d.ts +45 -0
  444. package/dist/types/in-memory/InMemorySnapshotStorage.d.ts +37 -0
  445. package/dist/types/in-memory/InMemoryView.d.ts +53 -0
  446. package/dist/types/in-memory/index.d.ts +5 -0
  447. package/dist/types/in-memory/utils/index.d.ts +1 -0
  448. package/dist/types/in-memory/utils/nextCycle.d.ts +4 -0
  449. package/dist/types/index.d.ts +15 -0
  450. package/dist/types/interfaces/IAggregate.d.ts +78 -0
  451. package/dist/types/interfaces/IAggregateSnapshotStorage.d.ts +8 -0
  452. package/dist/types/interfaces/ICommand.d.ts +2 -0
  453. package/dist/types/interfaces/ICommandBus.d.ts +15 -0
  454. package/dist/types/interfaces/IContainer.d.ts +37 -0
  455. package/dist/types/interfaces/IDispatchPipelineProcessor.d.ts +29 -0
  456. package/dist/types/interfaces/IEvent.d.ts +7 -0
  457. package/dist/types/interfaces/IEventBus.d.ts +6 -0
  458. package/dist/types/interfaces/IEventDispatcher.d.ts +6 -0
  459. package/dist/types/interfaces/IEventLocker.d.ts +28 -0
  460. package/dist/types/interfaces/IEventReceptor.d.ts +5 -0
  461. package/dist/types/interfaces/IEventSet.d.ts +3 -0
  462. package/dist/types/interfaces/IEventStorageReader.d.ts +48 -0
  463. package/dist/types/interfaces/IEventStore.d.ts +9 -0
  464. package/dist/types/interfaces/IEventStream.d.ts +2 -0
  465. package/dist/types/interfaces/IIdentifierProvider.d.ts +10 -0
  466. package/dist/types/interfaces/ILocker.d.ts +8 -0
  467. package/dist/types/interfaces/ILogger.d.ts +22 -0
  468. package/dist/types/interfaces/IMessage.d.ts +23 -0
  469. package/dist/types/interfaces/IMutableState.d.ts +14 -0
  470. package/dist/types/interfaces/IObjectStorage.d.ts +8 -0
  471. package/dist/types/interfaces/IObservable.d.ts +15 -0
  472. package/dist/types/interfaces/IObservableQueueProvider.d.ts +8 -0
  473. package/dist/types/interfaces/IObserver.d.ts +4 -0
  474. package/dist/types/interfaces/IProjection.d.ts +17 -0
  475. package/dist/types/interfaces/ISaga.d.ts +38 -0
  476. package/dist/types/interfaces/ISnapshotEvent.d.ts +7 -0
  477. package/dist/types/interfaces/IViewLocker.d.ts +34 -0
  478. package/dist/types/interfaces/Identifier.d.ts +1 -0
  479. package/dist/types/interfaces/index.d.ts +29 -0
  480. package/dist/types/interfaces/isObject.d.ts +1 -0
  481. package/dist/types/rabbitmq/IContainer.d.ts +19 -0
  482. package/dist/types/rabbitmq/RabbitMqCommandBus.d.ts +38 -0
  483. package/dist/types/rabbitmq/RabbitMqEventBus.d.ts +44 -0
  484. package/dist/types/rabbitmq/RabbitMqGateway.d.ts +133 -0
  485. package/dist/types/rabbitmq/index.d.ts +4 -0
  486. package/dist/types/rabbitmq/utils/index.d.ts +2 -0
  487. package/dist/types/rabbitmq/utils/registerExitCleanup.d.ts +10 -0
  488. package/dist/types/rabbitmq/utils/resolveProvider.d.ts +3 -0
  489. package/dist/types/sqlite/AbstractSqliteAccessor.d.ts +25 -0
  490. package/dist/types/sqlite/AbstractSqliteObjectProjection.d.ts +8 -0
  491. package/dist/types/sqlite/AbstractSqliteView.d.ts +23 -0
  492. package/dist/types/sqlite/IContainer.d.ts +7 -0
  493. package/dist/types/sqlite/SqliteEventLocker.d.ts +30 -0
  494. package/dist/types/sqlite/SqliteObjectStorage.d.ts +17 -0
  495. package/dist/types/sqlite/SqliteObjectView.d.ts +19 -0
  496. package/dist/types/sqlite/SqliteProjectionDataParams.d.ts +14 -0
  497. package/dist/types/sqlite/SqliteViewLocker.d.ts +31 -0
  498. package/dist/types/sqlite/index.d.ts +9 -0
  499. package/dist/types/sqlite/queries/eventLockTableInit.d.ts +1 -0
  500. package/dist/types/sqlite/queries/index.d.ts +2 -0
  501. package/dist/types/sqlite/queries/viewLockTableInit.d.ts +1 -0
  502. package/dist/types/sqlite/utils/getEventId.d.ts +5 -0
  503. package/dist/types/sqlite/utils/guid.d.ts +4 -0
  504. package/dist/types/sqlite/utils/index.d.ts +2 -0
  505. package/dist/types/utils/Deferred.d.ts +13 -0
  506. package/dist/types/utils/Lock.d.ts +30 -0
  507. package/dist/types/utils/MapAssertable.d.ts +11 -0
  508. package/dist/types/utils/assert.d.ts +20 -0
  509. package/dist/types/utils/clone.d.ts +1 -0
  510. package/dist/types/utils/extractErrorDetails.d.ts +8 -0
  511. package/dist/types/utils/getClassName.d.ts +4 -0
  512. package/dist/types/utils/getHandler.d.ts +7 -0
  513. package/dist/types/utils/getMessageHandlerNames.d.ts +12 -0
  514. package/dist/types/utils/index.d.ts +14 -0
  515. package/dist/types/utils/isClass.d.ts +1 -0
  516. package/dist/types/utils/sagaId.d.ts +6 -0
  517. package/dist/types/utils/setupOneTimeEmitterSubscription.d.ts +12 -0
  518. package/dist/types/utils/subscribe.d.ts +9 -0
  519. package/dist/types/utils/validateHandlers.d.ts +4 -0
  520. package/dist/types/workers/AbstractWorkerProjection.d.ts +25 -0
  521. package/dist/types/workers/WorkerProxyProjection.d.ts +25 -0
  522. package/dist/types/workers/index.d.ts +3 -0
  523. package/dist/types/workers/interfaces/IProxyProjection.d.ts +15 -0
  524. package/dist/types/workers/interfaces/IWorkerProjection.d.ts +19 -0
  525. package/dist/types/workers/interfaces/index.d.ts +2 -0
  526. package/dist/types/workers/protocol.d.ts +10 -0
  527. package/dist/types/workers/utils/ProjectionView.d.ts +2 -0
  528. package/dist/types/workers/utils/createWorker.d.ts +10 -0
  529. package/dist/types/workers/utils/createWorkerInstance.d.ts +11 -0
  530. package/dist/types/workers/utils/index.d.ts +5 -0
  531. package/dist/types/workers/utils/nodeEndpoint.d.ts +2 -0
  532. package/dist/types/workers/utils/workerProxyFactory.d.ts +14 -0
  533. package/package.json +124 -35
  534. package/dist/AbstractAggregate.js +0 -178
  535. package/dist/AbstractAggregate.js.map +0 -1
  536. package/dist/AbstractProjection.js +0 -121
  537. package/dist/AbstractProjection.js.map +0 -1
  538. package/dist/AbstractSaga.js +0 -99
  539. package/dist/AbstractSaga.js.map +0 -1
  540. package/dist/AggregateCommandHandler.js +0 -85
  541. package/dist/AggregateCommandHandler.js.map +0 -1
  542. package/dist/CommandBus.js +0 -77
  543. package/dist/CommandBus.js.map +0 -1
  544. package/dist/CqrsContainerBuilder.js +0 -77
  545. package/dist/CqrsContainerBuilder.js.map +0 -1
  546. package/dist/Event.js +0 -43
  547. package/dist/Event.js.map +0 -1
  548. package/dist/EventStore.js +0 -229
  549. package/dist/EventStore.js.map +0 -1
  550. package/dist/SagaEventHandler.js +0 -117
  551. package/dist/SagaEventHandler.js.map +0 -1
  552. package/dist/index.js +0 -39
  553. package/dist/index.js.map +0 -1
  554. package/dist/infrastructure/InMemoryEventStorage.js +0 -53
  555. package/dist/infrastructure/InMemoryEventStorage.js.map +0 -1
  556. package/dist/infrastructure/InMemoryLock.js +0 -68
  557. package/dist/infrastructure/InMemoryLock.js.map +0 -1
  558. package/dist/infrastructure/InMemoryMessageBus.js +0 -95
  559. package/dist/infrastructure/InMemoryMessageBus.js.map +0 -1
  560. package/dist/infrastructure/InMemorySnapshotStorage.js +0 -26
  561. package/dist/infrastructure/InMemorySnapshotStorage.js.map +0 -1
  562. package/dist/infrastructure/InMemoryView.js.map +0 -1
  563. package/dist/infrastructure/utils/Deferred.js.map +0 -1
  564. package/dist/infrastructure/utils/index.js.map +0 -1
  565. package/dist/infrastructure/utils/nextCycle.js.map +0 -1
  566. package/dist/interfaces.js.map +0 -1
  567. package/dist/utils/getClassName.js.map +0 -1
  568. package/dist/utils/getHandledMessageTypes.js +0 -18
  569. package/dist/utils/getHandledMessageTypes.js.map +0 -1
  570. package/dist/utils/getHandler.js.map +0 -1
  571. package/dist/utils/getMessageHandlerNames.js.map +0 -1
  572. package/dist/utils/index.js.map +0 -1
  573. package/dist/utils/isClass.js.map +0 -1
  574. package/dist/utils/setupOneTimeEmitterSubscription.js.map +0 -1
  575. package/dist/utils/subscribe.js +0 -39
  576. package/dist/utils/subscribe.js.map +0 -1
  577. package/dist/utils/validateHandlers.js.map +0 -1
  578. package/src/AbstractAggregate.ts +0 -223
  579. package/src/AbstractProjection.ts +0 -172
  580. package/src/AbstractSaga.ts +0 -118
  581. package/src/AggregateCommandHandler.ts +0 -129
  582. package/src/CommandBus.ts +0 -98
  583. package/src/CqrsContainerBuilder.ts +0 -120
  584. package/src/Event.ts +0 -43
  585. package/src/EventStore.ts +0 -315
  586. package/src/SagaEventHandler.ts +0 -161
  587. package/src/index.ts +0 -26
  588. package/src/infrastructure/InMemoryEventStorage.ts +0 -68
  589. package/src/infrastructure/InMemoryLock.ts +0 -73
  590. package/src/infrastructure/InMemoryMessageBus.ts +0 -118
  591. package/src/infrastructure/InMemorySnapshotStorage.ts +0 -27
  592. package/src/infrastructure/InMemoryView.ts +0 -221
  593. package/src/infrastructure/utils/Deferred.ts +0 -41
  594. package/src/infrastructure/utils/index.ts +0 -2
  595. package/src/infrastructure/utils/nextCycle.ts +0 -4
  596. package/src/interfaces.ts +0 -328
  597. package/src/utils/getClassName.ts +0 -6
  598. package/src/utils/getHandledMessageTypes.ts +0 -20
  599. package/src/utils/getHandler.ts +0 -20
  600. package/src/utils/getMessageHandlerNames.ts +0 -44
  601. package/src/utils/index.ts +0 -8
  602. package/src/utils/isClass.ts +0 -4
  603. package/src/utils/setupOneTimeEmitterSubscription.ts +0 -57
  604. package/src/utils/subscribe.ts +0 -51
  605. package/src/utils/validateHandlers.ts +0 -19
  606. /package/dist/{infrastructure → cjs}/utils/Deferred.js +0 -0
  607. /package/dist/{utils → cjs/utils}/getClassName.js +0 -0
  608. /package/dist/{utils → cjs/utils}/isClass.js +0 -0
package/src/EventStore.ts DELETED
@@ -1,315 +0,0 @@
1
- import {
2
- IAggregateSnapshotStorage,
3
- Identifier,
4
- IEvent,
5
- IEventQueryFilter,
6
- IEventStorage,
7
- IEventSet,
8
- IExtendableLogger,
9
- ILogger,
10
- IMessageBus,
11
- IMessageHandler,
12
- IObservable,
13
- IEventStream,
14
- IEventStore
15
- } from "./interfaces";
16
- import { getClassName, setupOneTimeEmitterSubscription } from "./utils";
17
- import * as Event from './Event';
18
-
19
- const isIEventStorage = (storage: IEventStorage): storage is IEventStorage =>
20
- storage
21
- && typeof storage.getNewId === 'function'
22
- && typeof storage.commitEvents === 'function'
23
- && typeof storage.getEvents === 'function'
24
- && typeof storage.getAggregateEvents === 'function'
25
- && typeof storage.getSagaEvents === 'function';
26
-
27
- const isIObservable = (obj: IObservable | any): obj is IObservable =>
28
- obj
29
- && 'on' in obj
30
- && typeof obj.on === 'function'
31
- && 'off' in obj
32
- && typeof obj.off === 'function';
33
-
34
- const isIMessageBus = (bus: IMessageBus | any): bus is IMessageBus =>
35
- bus
36
- && isIObservable(bus)
37
- && 'send' in bus
38
- && typeof bus.send === 'function'
39
- && 'publish' in bus
40
- && typeof bus.publish === 'function';
41
-
42
- const SNAPSHOT_EVENT_TYPE = 'snapshot';
43
-
44
- export class EventStore implements IEventStore {
45
-
46
- #publishAsync: boolean;
47
- #validator: (event: IEvent<any>) => void;
48
- #logger?: ILogger;
49
- #storage: IEventStorage;
50
- #messageBus?: IMessageBus;
51
- #snapshotStorage: IAggregateSnapshotStorage | undefined;
52
- #sagaStarters: string[] = [];
53
- #defaultEventEmitter: IObservable;
54
-
55
- /** Whether storage supports aggregate snapshots */
56
- get snapshotsSupported(): boolean {
57
- return Boolean(this.#snapshotStorage);
58
- }
59
-
60
- constructor({
61
- storage,
62
- messageBus,
63
- snapshotStorage,
64
- eventValidator = Event.validate,
65
- eventStoreConfig,
66
- logger
67
- }: {
68
- storage: IEventStorage,
69
- messageBus?: IMessageBus,
70
- snapshotStorage?: IAggregateSnapshotStorage,
71
- eventValidator?: IMessageHandler,
72
- eventStoreConfig?: {
73
- publishAsync?: boolean
74
- },
75
- logger?: ILogger | IExtendableLogger
76
- }) {
77
- if (!storage)
78
- throw new TypeError('storage argument required');
79
- if (!isIEventStorage(storage))
80
- throw new TypeError('storage does not implement IEventStorage interface');
81
- if (messageBus && !isIMessageBus(messageBus))
82
- throw new TypeError('messageBus does not implement IMessageBus interface');
83
- if (messageBus && isIObservable(storage))
84
- throw new TypeError('both storage and messageBus implement IObservable interface, it is not yet supported');
85
-
86
- const defaultEventEmitter = isIObservable(storage) ? storage : messageBus;
87
- if (!defaultEventEmitter)
88
- throw new TypeError('storage must implement IObservable if messageBus is not injected');
89
-
90
- this.#publishAsync = eventStoreConfig?.publishAsync ?? true;
91
- this.#validator = eventValidator;
92
- this.#logger = logger && 'child' in logger ?
93
- logger.child({ service: getClassName(this) }) :
94
- logger;
95
- this.#storage = storage;
96
- this.#snapshotStorage = snapshotStorage;
97
- this.#messageBus = messageBus;
98
- this.#defaultEventEmitter = defaultEventEmitter;
99
- }
100
-
101
- /** Retrieve new ID from the storage */
102
- async getNewId(): Promise<Identifier> {
103
- return this.#storage.getNewId();
104
- }
105
-
106
- /** Retrieve all events of specific types */
107
- async* getAllEvents(eventTypes?: string[]): IEventStream {
108
- if (eventTypes && !Array.isArray(eventTypes))
109
- throw new TypeError('eventTypes, if specified, must be an Array');
110
-
111
- this.#logger?.debug(`retrieving ${eventTypes ? eventTypes.join(', ') : 'all'} events...`);
112
-
113
- const eventsIterable = await this.#storage.getEvents(eventTypes);
114
-
115
- yield* eventsIterable;
116
-
117
- this.#logger?.debug(`${eventTypes ? eventTypes.join(', ') : 'all'} events retrieved`);
118
- }
119
-
120
- /** Retrieve all events of specific Aggregate */
121
- async getAggregateEvents(aggregateId: Identifier): Promise<IEventSet> {
122
- if (!aggregateId)
123
- throw new TypeError('aggregateId argument required');
124
-
125
- this.#logger?.debug(`retrieving event stream for aggregate ${aggregateId}...`);
126
-
127
- const snapshot = this.#snapshotStorage ?
128
- await this.#snapshotStorage.getAggregateSnapshot(aggregateId) :
129
- undefined;
130
-
131
- const events: IEvent[] = [];
132
- if (snapshot)
133
- events.push(snapshot);
134
-
135
- const eventsIterable = await this.#storage.getAggregateEvents(aggregateId, { snapshot });
136
- for await (const event of eventsIterable)
137
- events.push(event);
138
-
139
- this.#logger?.debug(`${Event.describeMultiple(events)} retrieved`);
140
-
141
- return events;
142
- }
143
-
144
- /** Retrieve events of specific Saga */
145
- async getSagaEvents(sagaId: Identifier, filter: Pick<IEventQueryFilter, "beforeEvent">) {
146
- if (!sagaId)
147
- throw new TypeError('sagaId argument required');
148
- if (!filter)
149
- throw new TypeError('filter argument required');
150
- if (!filter.beforeEvent)
151
- throw new TypeError('filter.beforeEvent argument required');
152
- if (filter.beforeEvent.sagaVersion === undefined)
153
- throw new TypeError('filter.beforeEvent.sagaVersion argument required');
154
-
155
- this.#logger?.debug(`retrieving event stream for saga ${sagaId}, v${filter.beforeEvent.sagaVersion}...`);
156
-
157
- const events: IEvent[] = [];
158
- const eventsIterable = await this.#storage.getSagaEvents(sagaId, filter);
159
- for await (const event of eventsIterable)
160
- events.push(event);
161
-
162
- this.#logger?.debug(`${Event.describeMultiple(events)} retrieved`);
163
-
164
- return events;
165
- }
166
-
167
- /**
168
- * Register event types that start sagas.
169
- * Upon such event commit a new sagaId will be assigned
170
- */
171
- registerSagaStarters(eventTypes: string[] = []) {
172
- const uniqueEventTypes = eventTypes.filter(e => !this.#sagaStarters.includes(e));
173
- this.#sagaStarters.push(...uniqueEventTypes);
174
- }
175
-
176
- /**
177
- * Validate events, commit to storage and publish to messageBus, if needed
178
- *
179
- * @param {IEventSet} events - a set of events to commit
180
- * @returns {Promise<IEventSet>} - resolves to signed and committed events
181
- */
182
- async commit(events) {
183
- if (!Array.isArray(events))
184
- throw new TypeError('events argument must be an Array');
185
-
186
- const containsSagaStarters = this.#sagaStarters.length && events.some(e => this.#sagaStarters.includes(e.type));
187
- const augmentedEvents = containsSagaStarters ?
188
- await this.#attachSagaIdToSagaStarterEvents(events) :
189
- events;
190
-
191
- const eventStreamWithoutSnapshots = await this.save(augmentedEvents);
192
-
193
- // after events are saved to the persistent storage,
194
- // publish them to the event bus (i.e. RabbitMq)
195
- if (this.#messageBus)
196
- await this.#publish(eventStreamWithoutSnapshots);
197
-
198
- return eventStreamWithoutSnapshots;
199
- }
200
-
201
- /** Generate and attach sagaId to events that start new sagas */
202
- async #attachSagaIdToSagaStarterEvents(events: IEventSet): Promise<IEventSet> {
203
- const augmentedEvents: IEvent[] = [];
204
- for (const event of events) {
205
- if (this.#sagaStarters.includes(event.type)) {
206
- if (event.sagaId)
207
- throw new Error(`Event "${event.type}" already contains sagaId. Multiple sagas with same event type are not supported`);
208
-
209
- (event as IEvent).sagaId = await this.getNewId();
210
- (event as IEvent).sagaVersion = 0;
211
-
212
- augmentedEvents.push(event);
213
- }
214
- else {
215
- augmentedEvents.push(event);
216
- }
217
- }
218
- return augmentedEvents;
219
- }
220
-
221
- /** Save events to the persistent storage(s) */
222
- async save(events: IEventSet): Promise<IEventSet> {
223
- if (!Array.isArray(events))
224
- throw new TypeError('events argument must be an Array');
225
-
226
- const snapshotEvents = events.filter(e => e.type === SNAPSHOT_EVENT_TYPE);
227
- if (snapshotEvents.length > 1)
228
- throw new Error(`cannot commit a stream with more than 1 ${SNAPSHOT_EVENT_TYPE} event`);
229
- if (snapshotEvents.length && !this.snapshotsSupported)
230
- throw new Error(`${SNAPSHOT_EVENT_TYPE} event type is not supported by the storage`);
231
-
232
- const snapshot = snapshotEvents[0];
233
- const eventsWithoutSnapshot = events.filter(e => e !== snapshot);
234
-
235
- this.#logger?.debug(`validating ${Event.describeMultiple(eventsWithoutSnapshot)}...`);
236
- eventsWithoutSnapshot.forEach(this.#validator);
237
-
238
- this.#logger?.debug(`saving ${Event.describeMultiple(eventsWithoutSnapshot)}...`);
239
- await Promise.all([
240
- this.#storage.commitEvents(eventsWithoutSnapshot),
241
- snapshot ?
242
- this.#snapshotStorage?.saveAggregateSnapshot(snapshot) :
243
- undefined
244
- ]);
245
-
246
- return eventsWithoutSnapshot;
247
- }
248
-
249
- async #publish(events: IEventSet) {
250
- if (this.#publishAsync) {
251
- this.#logger?.debug(`publishing ${Event.describeMultiple(events)} asynchronously...`);
252
- setImmediate(() => this.#publishEvents(events));
253
- }
254
- else {
255
- this.#logger?.debug(`publishing ${Event.describeMultiple(events)} synchronously...`);
256
- await this.#publishEvents(events);
257
- }
258
- }
259
-
260
- async #publishEvents(events: IEventSet) {
261
- if (!this.#messageBus)
262
- return;
263
-
264
- try {
265
- await Promise.all(events.map(event =>
266
- this.#messageBus?.publish(event)));
267
-
268
- this.#logger?.debug(`${Event.describeMultiple(events)} published`);
269
- }
270
- catch (error: any) {
271
- this.#logger?.error(`${Event.describeMultiple(events)} publishing failed: ${error.message}`, {
272
- stack: error.stack
273
- });
274
- throw error;
275
- }
276
- }
277
-
278
- /** Setup a listener for a specific event type */
279
- on(messageType: string, handler: IMessageHandler) {
280
- if (typeof messageType !== 'string' || !messageType.length)
281
- throw new TypeError('messageType argument must be a non-empty String');
282
- if (typeof handler !== 'function')
283
- throw new TypeError('handler argument must be a Function');
284
- if (arguments.length !== 2)
285
- throw new TypeError(`2 arguments are expected, but ${arguments.length} received`);
286
-
287
- if (isIObservable(this.#storage))
288
- this.#storage.on(messageType, handler);
289
-
290
- this.#messageBus?.on(messageType, handler);
291
- }
292
-
293
- /** Remove previously installed listener */
294
- off(messageType: string, handler: IMessageHandler) {
295
- if (isIObservable(this.#storage))
296
- this.#storage.off(messageType, handler);
297
-
298
- this.#messageBus?.off(messageType, handler);
299
- }
300
-
301
- /** Get or create a named queue, which delivers events to a single handler only */
302
- queue(name: string): IObservable {
303
- if (!this.#defaultEventEmitter.queue)
304
- throw new Error('Named queues are not supported by the underlying message bus');
305
-
306
- return this.#defaultEventEmitter.queue(name);
307
- }
308
-
309
- /** Creates one-time subscription for one or multiple events that match a filter */
310
- once(messageTypes: string | string[], handler: IMessageHandler, filter: (e: IEvent) => boolean): Promise<IEvent> {
311
- const subscribeTo = Array.isArray(messageTypes) ? messageTypes : [messageTypes];
312
-
313
- return setupOneTimeEmitterSubscription(this.#defaultEventEmitter, subscribeTo, filter, handler, this.#logger);
314
- }
315
- }
@@ -1,161 +0,0 @@
1
- import * as Event from './Event';
2
- import {
3
- ICommandBus,
4
- IEvent,
5
- IEventReceptor,
6
- IEventStore,
7
- IExtendableLogger,
8
- ILogger,
9
- IObservable,
10
- ISaga,
11
- ISagaConstructor,
12
- ISagaFactory
13
- } from './interfaces';
14
-
15
- import {
16
- subscribe,
17
- getClassName
18
- } from './utils';
19
-
20
- /**
21
- * Listens to Saga events,
22
- * creates new saga or restores it from event store,
23
- * applies new events
24
- * and passes command(s) to command bus
25
- */
26
- export class SagaEventHandler implements IEventReceptor {
27
-
28
- #eventStore: IEventStore;
29
- #commandBus: ICommandBus;
30
- #queueName?: string;
31
- #logger?: ILogger;
32
- #sagaFactory: (params: any) => ISaga;
33
- #startsWith: string[];
34
- #handles: string[];
35
-
36
- constructor(options: {
37
- sagaType?: ISagaConstructor,
38
- sagaFactory?: ISagaFactory,
39
- eventStore: IEventStore,
40
- commandBus: ICommandBus,
41
- logger?: ILogger | IExtendableLogger,
42
- queueName?: string,
43
- startsWith?: string[],
44
- handles?: string[]
45
- }) {
46
- if (!options)
47
- throw new TypeError('options argument required');
48
- if (!options.eventStore)
49
- throw new TypeError('options.eventStore argument required');
50
- if (!options.commandBus)
51
- throw new TypeError('options.commandBus argument required');
52
-
53
- this.#eventStore = options.eventStore;
54
- this.#commandBus = options.commandBus;
55
- this.#queueName = options.queueName;
56
- this.#logger = options.logger && 'child' in options.logger ?
57
- options.logger.child({ service: getClassName(this) }) :
58
- options.logger;
59
-
60
- if (options.sagaType) {
61
- const SagaType = options.sagaType as ISagaConstructor;
62
-
63
- this.#sagaFactory = params => new SagaType(params);
64
- this.#startsWith = SagaType.startsWith;
65
- this.#handles = SagaType.handles;
66
- }
67
- else if (options.sagaFactory) {
68
- if (!Array.isArray(options.startsWith))
69
- throw new TypeError('options.startsWith argument must be an Array');
70
- if (!Array.isArray(options.handles))
71
- throw new TypeError('options.handles argument must be an Array');
72
-
73
- this.#sagaFactory = options.sagaFactory;
74
- this.#startsWith = options.startsWith;
75
- this.#handles = options.handles;
76
- }
77
- else {
78
- throw new Error('Either sagaType or sagaFactory is required');
79
- }
80
-
81
- this.#eventStore.registerSagaStarters(options.startsWith);
82
- }
83
-
84
- /** Overrides observer subscribe method */
85
- subscribe(eventStore: IObservable) {
86
- subscribe(eventStore, this, {
87
- messageTypes: [...this.#startsWith, ...this.#handles],
88
- masterHandler: e => this.handle(e),
89
- queueName: this.#queueName
90
- });
91
- }
92
-
93
- /** Handle saga event */
94
- async handle(event: IEvent): Promise<void> {
95
- if (!event)
96
- throw new TypeError('event argument required');
97
- if (!event.type)
98
- throw new TypeError('event.type argument required');
99
-
100
- const isSagaStarterEvent = this.#startsWith.includes(event.type);
101
- const saga = isSagaStarterEvent ?
102
- await this.#createSaga() :
103
- await this.#restoreSaga(event);
104
-
105
- const r = saga.apply(event);
106
- if (r instanceof Promise)
107
- await r;
108
-
109
- await this.#sendCommands(saga, event);
110
-
111
- // additional commands can be added by the saga.onError handler
112
- if (saga.uncommittedMessages.length)
113
- await this.#sendCommands(saga, event);
114
- }
115
-
116
- async #sendCommands(saga: ISaga, event: IEvent<any>) {
117
- const commands = saga.uncommittedMessages;
118
- saga.resetUncommittedMessages();
119
-
120
- this.#logger?.debug(`"${Event.describe(event)}" processed, ${commands.map(c => c.type).join(',') || 'no commands'} produced`);
121
-
122
- for (const command of commands) {
123
-
124
- // attach event context to produced command
125
- if (command.context === undefined && event.context !== undefined)
126
- command.context = event.context;
127
-
128
- try {
129
- await this.#commandBus.sendRaw(command);
130
- }
131
- catch (err: any) {
132
- if (typeof saga.onError === 'function') {
133
- // let saga to handle the error
134
- saga.onError(err, { event, command });
135
- }
136
- else {
137
- throw err;
138
- }
139
- }
140
- }
141
- }
142
-
143
- /** Start new saga */
144
- async #createSaga(): Promise<ISaga> {
145
- const id = await this.#eventStore.getNewId();
146
- return this.#sagaFactory.call(null, { id });
147
- }
148
-
149
- /** Restore saga from event store */
150
- async #restoreSaga(event: IEvent): Promise<ISaga> {
151
- if (!event.sagaId)
152
- throw new TypeError(`${Event.describe(event)} does not contain sagaId`);
153
-
154
- const events = await this.#eventStore.getSagaEvents(event.sagaId, { beforeEvent: event });
155
-
156
- const saga = this.#sagaFactory.call(null, { id: event.sagaId, events });
157
- this.#logger?.info(`Saga state restored from ${events.length} event(s)`);
158
-
159
- return saga;
160
- }
161
- }
package/src/index.ts DELETED
@@ -1,26 +0,0 @@
1
- export { CqrsContainerBuilder as ContainerBuilder } from './CqrsContainerBuilder';
2
-
3
- export * from './CommandBus';
4
- export * from './EventStore';
5
-
6
- export * from './AbstractAggregate';
7
- export * from './AggregateCommandHandler';
8
- export * from './AbstractSaga';
9
- export * from './SagaEventHandler';
10
- export * from './AbstractProjection';
11
-
12
- export * from './infrastructure/InMemoryMessageBus';
13
- export * from './infrastructure/InMemoryEventStorage';
14
- export * from './infrastructure/InMemorySnapshotStorage';
15
- export * from './infrastructure/InMemoryView';
16
- export * from './infrastructure/InMemoryLock';
17
- export * from './infrastructure/utils/Deferred';
18
-
19
- export * as Event from './Event';
20
- export {
21
- getMessageHandlerNames,
22
- getHandledMessageTypes,
23
- subscribe
24
- } from './utils';
25
-
26
- export * from './interfaces';
@@ -1,68 +0,0 @@
1
- import { IEvent, IEventStorage, IEventSet, IEventStream } from "../interfaces";
2
- import { nextCycle } from "./utils";
3
-
4
- /**
5
- * A simple event storage implementation intended to use for tests only.
6
- * Storage content resets on each app restart.
7
- *
8
- * @class InMemoryEventStorage
9
- * @implements {IEventStorage}
10
- */
11
- export class InMemoryEventStorage implements IEventStorage {
12
-
13
- #nextId: number = 0;
14
- #events: IEventSet = [];
15
-
16
- async commitEvents(events: IEventSet): Promise<IEventSet> {
17
- await nextCycle();
18
-
19
- this.#events = this.#events.concat(events);
20
-
21
- await nextCycle();
22
-
23
- return events;
24
- }
25
-
26
- async getAggregateEvents(aggregateId, options?: { snapshot: IEvent }): Promise<IEventSet> {
27
- await nextCycle();
28
-
29
- const afterVersion = options?.snapshot?.aggregateVersion;
30
- const result = !afterVersion ?
31
- this.#events.filter(e => e.aggregateId == aggregateId) :
32
- this.#events.filter(e =>
33
- e.aggregateId == aggregateId &&
34
- e.aggregateVersion !== undefined &&
35
- e.aggregateVersion > afterVersion);
36
-
37
- await nextCycle();
38
-
39
- return result;
40
- }
41
-
42
- async getSagaEvents(sagaId, { beforeEvent }): Promise<IEventSet> {
43
- await nextCycle();
44
-
45
- const results = this.#events.filter(e =>
46
- e.sagaId == sagaId &&
47
- e.sagaVersion !== undefined &&
48
- e.sagaVersion < beforeEvent.sagaVersion);
49
-
50
- await nextCycle();
51
-
52
- return results;
53
- }
54
-
55
- async* getEvents(eventTypes): IEventStream {
56
- await nextCycle();
57
-
58
- for await (const event of this.#events) {
59
- if (!eventTypes || eventTypes.includes(event.type))
60
- yield event;
61
- }
62
- }
63
-
64
- getNewId(): number {
65
- this.#nextId += 1;
66
- return this.#nextId;
67
- }
68
- }
@@ -1,73 +0,0 @@
1
- import { ILockable, ILockableWithIndication } from "../interfaces";
2
- import { Deferred } from "./utils";
3
-
4
- export class InMemoryLock implements ILockableWithIndication {
5
-
6
- #lockMarker: Deferred<void> | undefined;
7
- #innerLock: ILockable | undefined;
8
-
9
- /**
10
- * Indicates if lock is acquired
11
- */
12
- get locked(): boolean {
13
- return !!this.#lockMarker;
14
- }
15
-
16
- /**
17
- * Creates an instance of InMemoryLock
18
- *
19
- * @param innerLock ILockable instance that can persist lock state outside of the current process
20
- */
21
- constructor(innerLock?: ILockable) {
22
- this.#innerLock = innerLock;
23
- }
24
-
25
- /**
26
- * Acquire the lock on the current instance.
27
- * Resolves when the lock is successfully acquired
28
- */
29
- async lock(): Promise<void> {
30
- while (this.locked)
31
- await this.once('unlocked');
32
-
33
- try {
34
- this.#lockMarker = new Deferred();
35
- if (this.#innerLock)
36
- await this.#innerLock.lock();
37
- }
38
- catch (err: any) {
39
- try {
40
- await this.unlock();
41
- }
42
- catch (unlockErr: any) {
43
- // unlocking errors are ignored
44
- }
45
- throw err;
46
- }
47
- }
48
-
49
- /**
50
- * Release the lock acquired earlier
51
- */
52
- async unlock(): Promise<void> {
53
- try {
54
- if (this.#innerLock)
55
- await this.#innerLock.unlock();
56
- }
57
- finally {
58
- this.#lockMarker?.resolve();
59
- this.#lockMarker = undefined;
60
- }
61
- }
62
-
63
- /**
64
- * Wait until the lock is released.
65
- * Resolves immediately if the lock is not acquired
66
- */
67
- once(event: 'unlocked'): Promise<void> {
68
- if (event !== 'unlocked')
69
- throw new TypeError(`Unexpected event type: ${event}`);
70
-
71
- return this.#lockMarker?.promise ?? Promise.resolve();
72
- }
73
- }