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