@cratis/chronicle 3.0.0 → 3.1.1

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 (338) hide show
  1. package/ChronicleClient.ts +4 -3
  2. package/EventStore.ts +20 -3
  3. package/IEventStore.ts +16 -0
  4. package/README.md +40 -28
  5. package/auditing/CausationType.ts +10 -0
  6. package/compliance/ComplianceContracts.ts +84 -0
  7. package/compliance/IPIIManager.ts +17 -0
  8. package/compliance/PIIManager.ts +31 -0
  9. package/compliance/index.ts +2 -0
  10. package/connection/ChronicleConnection.ts +7 -1
  11. package/connection/ChronicleServices.ts +2 -0
  12. package/connection/Guid.ts +18 -0
  13. package/connection/callResults.spec.ts +90 -0
  14. package/connection/callResults.ts +112 -0
  15. package/dist/ChronicleClient.d.ts.map +1 -1
  16. package/dist/ChronicleClient.js +4 -3
  17. package/dist/ChronicleClient.js.map +1 -1
  18. package/dist/EventStore.d.ts +8 -0
  19. package/dist/EventStore.d.ts.map +1 -1
  20. package/dist/EventStore.js +16 -3
  21. package/dist/EventStore.js.map +1 -1
  22. package/dist/IEventStore.d.ts +12 -0
  23. package/dist/IEventStore.d.ts.map +1 -1
  24. package/dist/auditing/CausationType.d.ts +8 -0
  25. package/dist/auditing/CausationType.d.ts.map +1 -1
  26. package/dist/auditing/CausationType.js +8 -0
  27. package/dist/auditing/CausationType.js.map +1 -1
  28. package/dist/compliance/ComplianceContracts.d.ts +40 -0
  29. package/dist/compliance/ComplianceContracts.d.ts.map +1 -1
  30. package/dist/compliance/ComplianceContracts.js +71 -0
  31. package/dist/compliance/ComplianceContracts.js.map +1 -1
  32. package/dist/compliance/IPIIManager.d.ts +15 -0
  33. package/dist/compliance/IPIIManager.d.ts.map +1 -0
  34. package/dist/compliance/IPIIManager.js +4 -0
  35. package/dist/compliance/IPIIManager.js.map +1 -0
  36. package/dist/compliance/PIIManager.d.ts +20 -0
  37. package/dist/compliance/PIIManager.d.ts.map +1 -0
  38. package/dist/compliance/PIIManager.js +30 -0
  39. package/dist/compliance/PIIManager.js.map +1 -0
  40. package/dist/compliance/index.d.ts +2 -0
  41. package/dist/compliance/index.d.ts.map +1 -1
  42. package/dist/compliance/index.js +1 -0
  43. package/dist/compliance/index.js.map +1 -1
  44. package/dist/connection/ChronicleConnection.d.ts +1 -0
  45. package/dist/connection/ChronicleConnection.d.ts.map +1 -1
  46. package/dist/connection/ChronicleConnection.js +6 -1
  47. package/dist/connection/ChronicleConnection.js.map +1 -1
  48. package/dist/connection/ChronicleServices.d.ts +2 -0
  49. package/dist/connection/ChronicleServices.d.ts.map +1 -1
  50. package/dist/connection/Guid.d.ts +5 -0
  51. package/dist/connection/Guid.d.ts.map +1 -1
  52. package/dist/connection/Guid.js +15 -0
  53. package/dist/connection/Guid.js.map +1 -1
  54. package/dist/connection/callResults.d.ts +69 -0
  55. package/dist/connection/callResults.d.ts.map +1 -0
  56. package/dist/connection/callResults.js +74 -0
  57. package/dist/connection/callResults.js.map +1 -0
  58. package/dist/eventSequences/AppendOperationsBroadcaster.d.ts +16 -0
  59. package/dist/eventSequences/AppendOperationsBroadcaster.d.ts.map +1 -0
  60. package/dist/eventSequences/AppendOperationsBroadcaster.js +77 -0
  61. package/dist/eventSequences/AppendOperationsBroadcaster.js.map +1 -0
  62. package/dist/eventSequences/AppendOptions.d.ts +7 -0
  63. package/dist/eventSequences/AppendOptions.d.ts.map +1 -1
  64. package/dist/eventSequences/AppendResult.d.ts +14 -0
  65. package/dist/eventSequences/AppendResult.d.ts.map +1 -1
  66. package/dist/eventSequences/AppendedEventWithResult.d.ts +13 -0
  67. package/dist/eventSequences/AppendedEventWithResult.d.ts.map +1 -0
  68. package/dist/eventSequences/AppendedEventWithResult.js +4 -0
  69. package/dist/eventSequences/AppendedEventWithResult.js.map +1 -0
  70. package/dist/eventSequences/CompleteStreamError.d.ts +17 -0
  71. package/dist/eventSequences/CompleteStreamError.d.ts.map +1 -0
  72. package/dist/eventSequences/CompleteStreamError.js +20 -0
  73. package/dist/eventSequences/CompleteStreamError.js.map +1 -0
  74. package/dist/eventSequences/CompleteStreamResult.d.ts +14 -0
  75. package/dist/eventSequences/CompleteStreamResult.d.ts.map +1 -0
  76. package/dist/eventSequences/CompleteStreamResult.js +4 -0
  77. package/dist/eventSequences/CompleteStreamResult.js.map +1 -0
  78. package/dist/eventSequences/ConcurrencyViolation.d.ts +13 -0
  79. package/dist/eventSequences/ConcurrencyViolation.d.ts.map +1 -0
  80. package/dist/eventSequences/ConcurrencyViolation.js +4 -0
  81. package/dist/eventSequences/ConcurrencyViolation.js.map +1 -0
  82. package/dist/eventSequences/EventForEventSourceId.d.ts +8 -0
  83. package/dist/eventSequences/EventForEventSourceId.d.ts.map +1 -1
  84. package/dist/eventSequences/EventSequence.d.ts +35 -1
  85. package/dist/eventSequences/EventSequence.d.ts.map +1 -1
  86. package/dist/eventSequences/EventSequence.js +350 -19
  87. package/dist/eventSequences/EventSequence.js.map +1 -1
  88. package/dist/eventSequences/IEventSequence.d.ts +85 -1
  89. package/dist/eventSequences/IEventSequence.d.ts.map +1 -1
  90. package/dist/eventSequences/WaitForCompletionResult.d.ts +11 -0
  91. package/dist/eventSequences/WaitForCompletionResult.d.ts.map +1 -0
  92. package/dist/eventSequences/WaitForCompletionResult.js +4 -0
  93. package/dist/eventSequences/WaitForCompletionResult.js.map +1 -0
  94. package/dist/eventSequences/index.d.ts +5 -0
  95. package/dist/eventSequences/index.d.ts.map +1 -1
  96. package/dist/eventSequences/index.js +1 -0
  97. package/dist/eventSequences/index.js.map +1 -1
  98. package/dist/eventStoreSubscriptions/EventStoreSubscriptions.d.ts +3 -0
  99. package/dist/eventStoreSubscriptions/EventStoreSubscriptions.d.ts.map +1 -1
  100. package/dist/eventStoreSubscriptions/EventStoreSubscriptions.js +9 -0
  101. package/dist/eventStoreSubscriptions/EventStoreSubscriptions.js.map +1 -1
  102. package/dist/eventStoreSubscriptions/IEventStoreSubscriptions.d.ts +6 -0
  103. package/dist/eventStoreSubscriptions/IEventStoreSubscriptions.d.ts.map +1 -1
  104. package/dist/eventStoreSubscriptions/contracts.d.ts +18 -0
  105. package/dist/eventStoreSubscriptions/contracts.d.ts.map +1 -1
  106. package/dist/eventStoreSubscriptions/contracts.js +106 -0
  107. package/dist/eventStoreSubscriptions/contracts.js.map +1 -1
  108. package/dist/events/constraints/Constraints.js +4 -4
  109. package/dist/events/constraints/Constraints.js.map +1 -1
  110. package/dist/externalServices/ExternalServiceBuilder.d.ts +42 -0
  111. package/dist/externalServices/ExternalServiceBuilder.d.ts.map +1 -0
  112. package/dist/externalServices/ExternalServiceBuilder.js +110 -0
  113. package/dist/externalServices/ExternalServiceBuilder.js.map +1 -0
  114. package/dist/externalServices/ExternalServices.d.ts +19 -0
  115. package/dist/externalServices/ExternalServices.d.ts.map +1 -0
  116. package/dist/externalServices/ExternalServices.js +30 -0
  117. package/dist/externalServices/ExternalServices.js.map +1 -0
  118. package/dist/externalServices/ExternalServicesContracts.d.ts +137 -0
  119. package/dist/externalServices/ExternalServicesContracts.d.ts.map +1 -0
  120. package/dist/externalServices/ExternalServicesContracts.js +654 -0
  121. package/dist/externalServices/ExternalServicesContracts.js.map +1 -0
  122. package/dist/externalServices/IExternalServiceBuilder.d.ts +67 -0
  123. package/dist/externalServices/IExternalServiceBuilder.d.ts.map +1 -0
  124. package/dist/externalServices/IExternalServiceBuilder.js +4 -0
  125. package/dist/externalServices/IExternalServiceBuilder.js.map +1 -0
  126. package/dist/externalServices/IExternalServices.d.ts +13 -0
  127. package/dist/externalServices/IExternalServices.d.ts.map +1 -0
  128. package/dist/externalServices/IExternalServices.js +4 -0
  129. package/dist/externalServices/IExternalServices.js.map +1 -0
  130. package/dist/externalServices/index.d.ts +5 -0
  131. package/dist/externalServices/index.d.ts.map +1 -0
  132. package/dist/externalServices/index.js +5 -0
  133. package/dist/externalServices/index.js.map +1 -0
  134. package/dist/identities/IIdentityManager.d.ts +17 -0
  135. package/dist/identities/IIdentityManager.d.ts.map +1 -0
  136. package/dist/identities/IIdentityManager.js +4 -0
  137. package/dist/identities/IIdentityManager.js.map +1 -0
  138. package/dist/identities/IdentityManager.d.ts +20 -0
  139. package/dist/identities/IdentityManager.d.ts.map +1 -0
  140. package/dist/identities/IdentityManager.js +31 -0
  141. package/dist/identities/IdentityManager.js.map +1 -0
  142. package/dist/identities/index.d.ts +3 -0
  143. package/dist/identities/index.d.ts.map +1 -0
  144. package/dist/identities/index.js +4 -0
  145. package/dist/identities/index.js.map +1 -0
  146. package/dist/index.d.ts +5 -1
  147. package/dist/index.d.ts.map +1 -1
  148. package/dist/index.js +5 -1
  149. package/dist/index.js.map +1 -1
  150. package/dist/jobs/IJobs.d.ts +4 -4
  151. package/dist/jobs/IJobs.d.ts.map +1 -1
  152. package/dist/jobs/Jobs.d.ts +4 -4
  153. package/dist/jobs/Jobs.d.ts.map +1 -1
  154. package/dist/jobs/Jobs.js +12 -10
  155. package/dist/jobs/Jobs.js.map +1 -1
  156. package/dist/observation/FailedPartition.d.ts +15 -0
  157. package/dist/observation/FailedPartition.d.ts.map +1 -0
  158. package/dist/observation/FailedPartition.js +4 -0
  159. package/dist/observation/FailedPartition.js.map +1 -0
  160. package/dist/observation/FailedPartitionAttempt.d.ts +15 -0
  161. package/dist/observation/FailedPartitionAttempt.d.ts.map +1 -0
  162. package/dist/observation/FailedPartitionAttempt.js +4 -0
  163. package/dist/observation/FailedPartitionAttempt.js.map +1 -0
  164. package/dist/observation/FailedPartitions.d.ts +24 -0
  165. package/dist/observation/FailedPartitions.d.ts.map +1 -0
  166. package/dist/observation/FailedPartitions.js +39 -0
  167. package/dist/observation/FailedPartitions.js.map +1 -0
  168. package/dist/observation/ICanBeNotifiedWhenPartitionReplayed.d.ts +19 -0
  169. package/dist/observation/ICanBeNotifiedWhenPartitionReplayed.d.ts.map +1 -0
  170. package/dist/observation/ICanBeNotifiedWhenPartitionReplayed.js +4 -0
  171. package/dist/observation/ICanBeNotifiedWhenPartitionReplayed.js.map +1 -0
  172. package/dist/observation/ICanBeNotifiedWhenReplay.d.ts +17 -0
  173. package/dist/observation/ICanBeNotifiedWhenReplay.d.ts.map +1 -0
  174. package/dist/observation/ICanBeNotifiedWhenReplay.js +4 -0
  175. package/dist/observation/ICanBeNotifiedWhenReplay.js.map +1 -0
  176. package/dist/observation/IFailedPartitions.d.ts +18 -0
  177. package/dist/observation/IFailedPartitions.d.ts.map +1 -0
  178. package/dist/observation/IFailedPartitions.js +4 -0
  179. package/dist/observation/IFailedPartitions.js.map +1 -0
  180. package/dist/observation/index.d.ts +6 -0
  181. package/dist/observation/index.d.ts.map +1 -1
  182. package/dist/observation/index.js +1 -0
  183. package/dist/observation/index.js.map +1 -1
  184. package/dist/observation/notifyReplayLifecycle.d.ts +13 -0
  185. package/dist/observation/notifyReplayLifecycle.d.ts.map +1 -0
  186. package/dist/observation/notifyReplayLifecycle.js +54 -0
  187. package/dist/observation/notifyReplayLifecycle.js.map +1 -0
  188. package/dist/observation/toClientFailedPartition.d.ts +9 -0
  189. package/dist/observation/toClientFailedPartition.d.ts.map +1 -0
  190. package/dist/observation/toClientFailedPartition.js +23 -0
  191. package/dist/observation/toClientFailedPartition.js.map +1 -0
  192. package/dist/projections/Projections.d.ts +0 -4
  193. package/dist/projections/Projections.d.ts.map +1 -1
  194. package/dist/projections/Projections.js +25 -103
  195. package/dist/projections/Projections.js.map +1 -1
  196. package/dist/projections/declarative/AddBuilder.d.ts +17 -0
  197. package/dist/projections/declarative/AddBuilder.d.ts.map +1 -0
  198. package/dist/projections/declarative/AddBuilder.js +28 -0
  199. package/dist/projections/declarative/AddBuilder.js.map +1 -0
  200. package/dist/projections/declarative/AddChildBuilder.d.ts +56 -0
  201. package/dist/projections/declarative/AddChildBuilder.d.ts.map +1 -0
  202. package/dist/projections/declarative/AddChildBuilder.js +72 -0
  203. package/dist/projections/declarative/AddChildBuilder.js.map +1 -0
  204. package/dist/projections/declarative/ChildrenBuilder.d.ts +28 -0
  205. package/dist/projections/declarative/ChildrenBuilder.d.ts.map +1 -0
  206. package/dist/projections/declarative/ChildrenBuilder.js +72 -0
  207. package/dist/projections/declarative/ChildrenBuilder.js.map +1 -0
  208. package/dist/projections/declarative/CompositeKeyBuilder.d.ts +16 -0
  209. package/dist/projections/declarative/CompositeKeyBuilder.d.ts.map +1 -0
  210. package/dist/projections/declarative/CompositeKeyBuilder.js +29 -0
  211. package/dist/projections/declarative/CompositeKeyBuilder.js.map +1 -0
  212. package/dist/projections/declarative/FromBuilder.d.ts +8 -6
  213. package/dist/projections/declarative/FromBuilder.d.ts.map +1 -1
  214. package/dist/projections/declarative/FromBuilder.js +44 -14
  215. package/dist/projections/declarative/FromBuilder.js.map +1 -1
  216. package/dist/projections/declarative/ICompositeKeyBuilder.d.ts +5 -0
  217. package/dist/projections/declarative/ICompositeKeyBuilder.d.ts.map +1 -1
  218. package/dist/projections/declarative/JoinBuilder.d.ts +7 -5
  219. package/dist/projections/declarative/JoinBuilder.d.ts.map +1 -1
  220. package/dist/projections/declarative/JoinBuilder.js +50 -16
  221. package/dist/projections/declarative/JoinBuilder.js.map +1 -1
  222. package/dist/projections/declarative/NestedBuilder.d.ts +24 -0
  223. package/dist/projections/declarative/NestedBuilder.d.ts.map +1 -0
  224. package/dist/projections/declarative/NestedBuilder.js +60 -0
  225. package/dist/projections/declarative/NestedBuilder.js.map +1 -0
  226. package/dist/projections/declarative/ProjectionBuilderCore.d.ts +127 -0
  227. package/dist/projections/declarative/ProjectionBuilderCore.d.ts.map +1 -0
  228. package/dist/projections/declarative/ProjectionBuilderCore.js +180 -0
  229. package/dist/projections/declarative/ProjectionBuilderCore.js.map +1 -0
  230. package/dist/projections/declarative/ProjectionBuilderFor.d.ts +6 -32
  231. package/dist/projections/declarative/ProjectionBuilderFor.d.ts.map +1 -1
  232. package/dist/projections/declarative/ProjectionBuilderFor.js +24 -118
  233. package/dist/projections/declarative/ProjectionBuilderFor.js.map +1 -1
  234. package/dist/projections/declarative/SubtractBuilder.d.ts +17 -0
  235. package/dist/projections/declarative/SubtractBuilder.d.ts.map +1 -0
  236. package/dist/projections/declarative/SubtractBuilder.js +28 -0
  237. package/dist/projections/declarative/SubtractBuilder.js.map +1 -0
  238. package/dist/projections/declarative/index.d.ts +9 -0
  239. package/dist/projections/declarative/index.d.ts.map +1 -1
  240. package/dist/projections/declarative/index.js +8 -0
  241. package/dist/projections/declarative/index.js.map +1 -1
  242. package/dist/projections/modelBound/childrenAndNestedBuilder.d.ts +90 -0
  243. package/dist/projections/modelBound/childrenAndNestedBuilder.d.ts.map +1 -0
  244. package/dist/projections/modelBound/childrenAndNestedBuilder.js +290 -0
  245. package/dist/projections/modelBound/childrenAndNestedBuilder.js.map +1 -0
  246. package/dist/reactors/ReactorSideEffects.d.ts +29 -0
  247. package/dist/reactors/ReactorSideEffects.d.ts.map +1 -0
  248. package/dist/reactors/ReactorSideEffects.js +70 -0
  249. package/dist/reactors/ReactorSideEffects.js.map +1 -0
  250. package/dist/reactors/Reactors.d.ts +4 -1
  251. package/dist/reactors/Reactors.d.ts.map +1 -1
  252. package/dist/reactors/Reactors.js +23 -4
  253. package/dist/reactors/Reactors.js.map +1 -1
  254. package/dist/reducers/Reducers.d.ts.map +1 -1
  255. package/dist/reducers/Reducers.js +15 -3
  256. package/dist/reducers/Reducers.js.map +1 -1
  257. package/dist/reducers/reducer.d.ts +9 -1
  258. package/dist/reducers/reducer.d.ts.map +1 -1
  259. package/dist/reducers/reducer.js +4 -2
  260. package/dist/reducers/reducer.js.map +1 -1
  261. package/dist/transactions/IUnitOfWork.d.ts +18 -0
  262. package/dist/transactions/IUnitOfWork.d.ts.map +1 -1
  263. package/dist/transactions/UnitOfWork.d.ts +9 -0
  264. package/dist/transactions/UnitOfWork.d.ts.map +1 -1
  265. package/dist/transactions/UnitOfWork.js +14 -0
  266. package/dist/transactions/UnitOfWork.js.map +1 -1
  267. package/dist/tsconfig.tsbuildinfo +1 -1
  268. package/eventSequences/AppendOperationsBroadcaster.ts +83 -0
  269. package/eventSequences/AppendOptions.ts +8 -0
  270. package/eventSequences/AppendResult.ts +16 -0
  271. package/eventSequences/AppendedEventWithResult.ts +17 -0
  272. package/eventSequences/CompleteStreamError.ts +20 -0
  273. package/eventSequences/CompleteStreamResult.ts +13 -0
  274. package/eventSequences/ConcurrencyViolation.ts +18 -0
  275. package/eventSequences/EventForEventSourceId.ts +12 -0
  276. package/eventSequences/EventSequence.spec.ts +588 -0
  277. package/eventSequences/EventSequence.ts +406 -20
  278. package/eventSequences/IEventSequence.ts +109 -1
  279. package/eventSequences/WaitForCompletionResult.ts +15 -0
  280. package/eventSequences/index.ts +5 -0
  281. package/eventStoreSubscriptions/EventStoreSubscriptions.spec.ts +52 -0
  282. package/eventStoreSubscriptions/EventStoreSubscriptions.ts +19 -1
  283. package/eventStoreSubscriptions/IEventStoreSubscriptions.ts +7 -0
  284. package/eventStoreSubscriptions/contracts.ts +126 -0
  285. package/events/constraints/Constraints.ts +4 -4
  286. package/externalServices/ExternalServiceBuilder.ts +128 -0
  287. package/externalServices/ExternalServices.ts +34 -0
  288. package/externalServices/ExternalServicesContracts.ts +709 -0
  289. package/externalServices/IExternalServiceBuilder.ts +76 -0
  290. package/externalServices/IExternalServices.ts +16 -0
  291. package/externalServices/index.ts +7 -0
  292. package/identities/IIdentityManager.ts +19 -0
  293. package/identities/IdentityManager.ts +32 -0
  294. package/identities/index.ts +5 -0
  295. package/index.ts +6 -0
  296. package/jobs/IJobs.ts +4 -4
  297. package/jobs/Jobs.ts +16 -14
  298. package/observation/FailedPartition.ts +21 -0
  299. package/observation/FailedPartitionAttempt.ts +21 -0
  300. package/observation/FailedPartitions.spec.ts +75 -0
  301. package/observation/FailedPartitions.ts +44 -0
  302. package/observation/ICanBeNotifiedWhenPartitionReplayed.ts +22 -0
  303. package/observation/ICanBeNotifiedWhenReplay.ts +20 -0
  304. package/observation/IFailedPartitions.ts +22 -0
  305. package/observation/index.ts +6 -0
  306. package/observation/notifyReplayLifecycle.spec.ts +98 -0
  307. package/observation/notifyReplayLifecycle.ts +61 -0
  308. package/observation/toClientFailedPartition.ts +26 -0
  309. package/package.json +28 -3
  310. package/projections/Projections.childrenAndNested.spec.ts +188 -0
  311. package/projections/Projections.spec.ts +131 -0
  312. package/projections/Projections.ts +37 -119
  313. package/projections/declarative/AddBuilder.ts +28 -0
  314. package/projections/declarative/AddChildBuilder.ts +97 -0
  315. package/projections/declarative/ChildrenBuilder.spec.ts +157 -0
  316. package/projections/declarative/ChildrenBuilder.ts +90 -0
  317. package/projections/declarative/CompositeKeyBuilder.spec.ts +117 -0
  318. package/projections/declarative/CompositeKeyBuilder.ts +38 -0
  319. package/projections/declarative/FromBuilder.ts +60 -15
  320. package/projections/declarative/ICompositeKeyBuilder.ts +6 -0
  321. package/projections/declarative/JoinBuilder.ts +66 -17
  322. package/projections/declarative/NestedBuilder.ts +76 -0
  323. package/projections/declarative/ProjectionBuilderCore.ts +257 -0
  324. package/projections/declarative/ProjectionBuilderFor.spec.ts +115 -0
  325. package/projections/declarative/ProjectionBuilderFor.ts +29 -168
  326. package/projections/declarative/SubtractBuilder.ts +28 -0
  327. package/projections/declarative/index.ts +9 -0
  328. package/projections/modelBound/childrenAndNestedBuilder.ts +354 -0
  329. package/reactors/ReactorSideEffects.spec.ts +182 -0
  330. package/reactors/ReactorSideEffects.ts +97 -0
  331. package/reactors/Reactors.ts +29 -4
  332. package/reducers/Reducers.spec.ts +87 -0
  333. package/reducers/Reducers.ts +15 -3
  334. package/reducers/reducer.spec.ts +40 -0
  335. package/reducers/reducer.ts +11 -2
  336. package/transactions/IUnitOfWork.ts +21 -0
  337. package/transactions/UnitOfWork.spec.ts +82 -0
  338. package/transactions/UnitOfWork.ts +20 -0
@@ -0,0 +1,61 @@
1
+ // Copyright (c) Cratis. All rights reserved.
2
+ // Licensed under the MIT license. See LICENSE file in the project root for full license information.
3
+
4
+ import { ReplayState } from '@cratis/chronicle.contracts';
5
+ import { ICanBeNotifiedWhenPartitionReplayed } from './ICanBeNotifiedWhenPartitionReplayed';
6
+ import { ICanBeNotifiedWhenReplay } from './ICanBeNotifiedWhenReplay';
7
+
8
+ function hasReplayLifecycleHooks(instance: unknown): instance is ICanBeNotifiedWhenReplay {
9
+ if (typeof instance !== 'object' || instance === null) {
10
+ return false;
11
+ }
12
+
13
+ const candidate = instance as Record<string, unknown>;
14
+ return typeof candidate.beginReplay === 'function' && typeof candidate.endReplay === 'function';
15
+ }
16
+
17
+ function hasPartitionReplayLifecycleHooks(instance: unknown): instance is ICanBeNotifiedWhenPartitionReplayed {
18
+ if (typeof instance !== 'object' || instance === null) {
19
+ return false;
20
+ }
21
+
22
+ const candidate = instance as Record<string, unknown>;
23
+ return typeof candidate.beginReplayPartition === 'function' && typeof candidate.endReplayPartition === 'function';
24
+ }
25
+
26
+ /**
27
+ * Notifies a reactor/reducer instance of a replay-state transition signaled by the Chronicle Kernel,
28
+ * when the instance optionally implements {@link ICanBeNotifiedWhenReplay} and/or
29
+ * {@link ICanBeNotifiedWhenPartitionReplayed}. A no-op for {@link ReplayState.REPLAY_STATE_None} or
30
+ * when the instance implements neither contract.
31
+ * @param instance - The reactor/reducer instance to notify.
32
+ * @param replayState - The replay-state transition signaled for the current batch.
33
+ * @param partition - The partition the transition applies to, for the partition-scoped states.
34
+ * @returns A promise that resolves when the relevant callback (if any) has completed.
35
+ */
36
+ export async function notifyReplayLifecycle(instance: unknown, replayState: ReplayState, partition: string): Promise<void> {
37
+ switch (replayState) {
38
+ case ReplayState.BeginReplay:
39
+ if (hasReplayLifecycleHooks(instance)) {
40
+ await instance.beginReplay();
41
+ }
42
+ break;
43
+ case ReplayState.EndReplay:
44
+ if (hasReplayLifecycleHooks(instance)) {
45
+ await instance.endReplay();
46
+ }
47
+ break;
48
+ case ReplayState.BeginReplayPartition:
49
+ if (hasPartitionReplayLifecycleHooks(instance)) {
50
+ await instance.beginReplayPartition(partition);
51
+ }
52
+ break;
53
+ case ReplayState.EndReplayPartition:
54
+ if (hasPartitionReplayLifecycleHooks(instance)) {
55
+ await instance.endReplayPartition(partition);
56
+ }
57
+ break;
58
+ default:
59
+ break;
60
+ }
61
+ }
@@ -0,0 +1,26 @@
1
+ // Copyright (c) Cratis. All rights reserved.
2
+ // Licensed under the MIT license. See LICENSE file in the project root for full license information.
3
+
4
+ import type { FailedPartition as ContractsFailedPartition } from '@cratis/chronicle.contracts';
5
+ import { fromContractsGuid } from '../connection/Guid';
6
+ import { EventSequenceNumber } from '../eventSequences/EventSequenceNumber';
7
+ import { FailedPartition } from './FailedPartition';
8
+
9
+ /**
10
+ * Converts a wire {@link ContractsFailedPartition} into the client {@link FailedPartition} shape.
11
+ * @param failedPartition - The wire failed partition to convert.
12
+ * @returns The converted client failed partition.
13
+ */
14
+ export function toClientFailedPartition(failedPartition: ContractsFailedPartition): FailedPartition {
15
+ return {
16
+ id: fromContractsGuid(failedPartition.Id).toString(),
17
+ observerId: failedPartition.ObserverId,
18
+ partition: failedPartition.Partition,
19
+ attempts: (failedPartition.Attempts ?? []).map(attempt => ({
20
+ occurred: new Date(attempt.Occurred?.Value ?? ''),
21
+ sequenceNumber: new EventSequenceNumber(attempt.SequenceNumber ?? 0n),
22
+ messages: attempt.Messages ?? [],
23
+ stackTrace: attempt.StackTrace ?? ''
24
+ }))
25
+ };
26
+ }
package/package.json CHANGED
@@ -1,9 +1,24 @@
1
1
  {
2
2
  "name": "@cratis/chronicle",
3
- "version": "3.0.0",
4
- "description": "TypeScript idiomatic client for Cratis Chronicle",
3
+ "version": "3.1.1",
4
+ "description": "Event sourcing for TypeScript and Node.js — the idiomatic client for Cratis Chronicle, the open-source event-sourcing database",
5
5
  "author": "Cratis",
6
6
  "license": "MIT",
7
+ "homepage": "https://www.cratis.io/chronicle/",
8
+ "keywords": [
9
+ "event-sourcing",
10
+ "eventsourcing",
11
+ "event-store",
12
+ "eventstore",
13
+ "cqrs",
14
+ "ddd",
15
+ "projections",
16
+ "grpc",
17
+ "typescript",
18
+ "nodejs",
19
+ "chronicle",
20
+ "cratis"
21
+ ],
7
22
  "repository": {
8
23
  "type": "git",
9
24
  "url": "git+https://github.com/Cratis/Chronicle.TypeScript.git"
@@ -81,6 +96,16 @@
81
96
  "import": "./dist/webhooks/index.js",
82
97
  "default": "./dist/webhooks/index.js"
83
98
  },
99
+ "./externalServices": {
100
+ "types": "./dist/externalServices/index.d.ts",
101
+ "import": "./dist/externalServices/index.js",
102
+ "default": "./dist/externalServices/index.js"
103
+ },
104
+ "./identities": {
105
+ "types": "./dist/identities/index.d.ts",
106
+ "import": "./dist/identities/index.js",
107
+ "default": "./dist/identities/index.js"
108
+ },
84
109
  "./observation": {
85
110
  "types": "./dist/observation/index.d.ts",
86
111
  "import": "./dist/observation/index.js",
@@ -135,7 +160,7 @@
135
160
  },
136
161
  "dependencies": {
137
162
  "@bufbuild/protobuf": "^2.12.0",
138
- "@cratis/chronicle.contracts": "16.4.0",
163
+ "@cratis/chronicle.contracts": "17.0.0",
139
164
  "@grpc/grpc-js": "^1.14.4",
140
165
  "@opentelemetry/api": "^1.9.1",
141
166
  "nice-grpc": "^2.1.16",
@@ -0,0 +1,188 @@
1
+ // Copyright (c) Cratis. All rights reserved.
2
+ // Licensed under the MIT license. See LICENSE file in the project root for full license information.
3
+
4
+ import 'reflect-metadata';
5
+ import { field } from '@cratis/fundamentals';
6
+ import { describe, expect, it, vi } from 'vitest';
7
+ import { IClientArtifactsProvider } from '../artifacts';
8
+ import { ChronicleConnection } from '../connection';
9
+ import { eventType } from '../events/eventTypeDecorator';
10
+ import { readModel } from '../readModels/readModel';
11
+ import { childrenFrom } from './modelBound/childrenFrom';
12
+ import { clearWith } from './modelBound/clearWith';
13
+ import { fromEvent } from './modelBound/fromEvent';
14
+ import { nested } from './modelBound/nested';
15
+ import { setFrom } from './modelBound/setFrom';
16
+ import { Projections } from './Projections';
17
+
18
+ // Decorators are applied as plain function calls (rather than `@decorator` syntax) so these
19
+ // fixtures don't depend on the test runner's decorator-syntax support.
20
+
21
+ class LineAdded {
22
+ productId!: string;
23
+ quantity!: number;
24
+ }
25
+ eventType()(LineAdded);
26
+
27
+ class LineQuantityChanged {
28
+ quantity!: number;
29
+ }
30
+ eventType()(LineQuantityChanged);
31
+
32
+ class SummaryUpdated {
33
+ total!: number;
34
+ }
35
+ eventType()(SummaryUpdated);
36
+
37
+ class SummaryCleared {}
38
+ eventType()(SummaryCleared);
39
+
40
+ class NoteAdded {
41
+ text!: string;
42
+ }
43
+ eventType()(NoteAdded);
44
+
45
+ class NoteCleared {}
46
+ eventType()(NoteCleared);
47
+
48
+ class TagAdded {
49
+ name!: string;
50
+ }
51
+ eventType()(TagAdded);
52
+
53
+ class OrderCreated {}
54
+ eventType()(OrderCreated);
55
+
56
+ class OrderLine {
57
+ productId!: string;
58
+ quantity!: number;
59
+ }
60
+ setFrom(LineQuantityChanged)(OrderLine.prototype, 'quantity');
61
+
62
+ class OrderSummary {
63
+ total!: number;
64
+ }
65
+ setFrom(SummaryUpdated)(OrderSummary.prototype, 'total');
66
+ clearWith(SummaryCleared)(OrderSummary);
67
+
68
+ class OrderNote {
69
+ text!: string;
70
+ }
71
+ setFrom(NoteAdded)(OrderNote.prototype, 'text');
72
+
73
+ class Order {
74
+ id!: string;
75
+ lines!: OrderLine[];
76
+ summary!: OrderSummary | undefined;
77
+ note!: OrderNote | undefined;
78
+ tags!: string[];
79
+ }
80
+ childrenFrom(LineAdded, undefined, 'productId', undefined)(Order.prototype, 'lines');
81
+ field(Array, { enumerable: true, genericArguments: [OrderLine] })(Order.prototype, 'lines');
82
+ nested(Order.prototype, 'summary');
83
+ field(OrderSummary)(Order.prototype, 'summary');
84
+ nested(Order.prototype, 'note');
85
+ field(OrderNote)(Order.prototype, 'note');
86
+ clearWith(NoteCleared)(Order.prototype, 'note');
87
+ childrenFrom(TagAdded)(Order.prototype, 'tags');
88
+ fromEvent(OrderCreated)(Order);
89
+ readModel()(Order);
90
+
91
+ interface FromRecord {
92
+ Key: { Id: string };
93
+ Value: { Properties: Record<string, string>; Key: string; ParentKey: string };
94
+ }
95
+
96
+ interface ChildrenDefinition {
97
+ IdentifiedBy: string;
98
+ From: FromRecord[];
99
+ RemovedWith: Array<{ Key: { Id: string } }>;
100
+ }
101
+
102
+ interface BuiltDefinition {
103
+ Children: Record<string, ChildrenDefinition>;
104
+ Nested: Record<string, ChildrenDefinition>;
105
+ }
106
+
107
+ function createProjections(readModels: (new (...args: unknown[]) => unknown)[]) {
108
+ const registerMock = vi.fn().mockResolvedValue(undefined);
109
+ const registerManyMock = vi.fn().mockResolvedValue(undefined);
110
+ const connection = {
111
+ readModels: { registerMany: registerManyMock },
112
+ projections: { register: registerMock }
113
+ } as unknown as ChronicleConnection;
114
+
115
+ const clientArtifacts: IClientArtifactsProvider = {
116
+ eventTypes: [],
117
+ readModels: readModels as unknown as IClientArtifactsProvider['readModels'],
118
+ reactors: [],
119
+ reducers: [],
120
+ seeders: [],
121
+ constraints: [],
122
+ projections: [],
123
+ webhooks: [],
124
+ eventTypeMigrations: []
125
+ };
126
+
127
+ const projections = new Projections('test-store', connection, clientArtifacts, 'test-sink');
128
+ return { projections, registerMock };
129
+ }
130
+
131
+ describe('Projections with childrenFrom, nested and clearWith', () => {
132
+ describe('when registering a model-bound projection using them', () => {
133
+ it('should not throw', async () => {
134
+ const { projections } = createProjections([Order]);
135
+ await expect(projections.register()).resolves.not.toThrow();
136
+ });
137
+
138
+ it('should build a children definition with the resolved child type wired up', async () => {
139
+ const { projections, registerMock } = createProjections([Order]);
140
+ await projections.register();
141
+
142
+ const definition = registerMock.mock.calls[0][0].Projections[0] as BuiltDefinition;
143
+ const lines = definition.Children.lines;
144
+
145
+ expect(lines.IdentifiedBy).toBe('productId');
146
+ const creationEntry = lines.From.find(candidate => candidate.Key.Id === 'LineAdded')!;
147
+ expect(creationEntry.Value.Key).toBe('$eventSourceId');
148
+ expect(creationEntry.Value.ParentKey).toBe('$eventSourceId');
149
+
150
+ const updateEntry = lines.From.find(candidate => candidate.Key.Id === 'LineQuantityChanged')!;
151
+ expect(updateEntry.Value.Properties.quantity).toBe('quantity');
152
+ });
153
+
154
+ it('should build a children definition even when the child element type cannot be resolved', async () => {
155
+ const { projections, registerMock } = createProjections([Order]);
156
+ await projections.register();
157
+
158
+ const definition = registerMock.mock.calls[0][0].Projections[0] as BuiltDefinition;
159
+ const tags = definition.Children.tags;
160
+
161
+ expect(tags.From.some(candidate => candidate.Key.Id === 'TagAdded')).toBe(true);
162
+ });
163
+
164
+ it('should build a nested definition honoring a class-level clearWith on the nested type', async () => {
165
+ const { projections, registerMock } = createProjections([Order]);
166
+ await projections.register();
167
+
168
+ const definition = registerMock.mock.calls[0][0].Projections[0] as BuiltDefinition;
169
+ const summary = definition.Nested.summary;
170
+
171
+ const updateEntry = summary.From.find(candidate => candidate.Key.Id === 'SummaryUpdated')!;
172
+ expect(updateEntry.Value.Properties.total).toBe('total');
173
+ expect(summary.RemovedWith.some(candidate => candidate.Key.Id === 'SummaryCleared')).toBe(true);
174
+ });
175
+
176
+ it('should build a nested definition honoring a property-level clearWith', async () => {
177
+ const { projections, registerMock } = createProjections([Order]);
178
+ await projections.register();
179
+
180
+ const definition = registerMock.mock.calls[0][0].Projections[0] as BuiltDefinition;
181
+ const note = definition.Nested.note;
182
+
183
+ const updateEntry = note.From.find(candidate => candidate.Key.Id === 'NoteAdded')!;
184
+ expect(updateEntry.Value.Properties.text).toBe('text');
185
+ expect(note.RemovedWith.some(candidate => candidate.Key.Id === 'NoteCleared')).toBe(true);
186
+ });
187
+ });
188
+ });
@@ -0,0 +1,131 @@
1
+ // Copyright (c) Cratis. All rights reserved.
2
+ // Licensed under the MIT license. See LICENSE file in the project root for full license information.
3
+
4
+ import 'reflect-metadata';
5
+ import { describe, expect, it, vi } from 'vitest';
6
+ import { IClientArtifactsProvider } from '../artifacts';
7
+ import { ChronicleConnection } from '../connection';
8
+ import { eventType } from '../events/eventTypeDecorator';
9
+ import { readModel } from '../readModels/readModel';
10
+ import { addFrom } from './modelBound/addFrom';
11
+ import { count } from './modelBound/count';
12
+ import { decrement } from './modelBound/decrement';
13
+ import { fromEvent } from './modelBound/fromEvent';
14
+ import { increment } from './modelBound/increment';
15
+ import { subtractFrom } from './modelBound/subtractFrom';
16
+ import { Projections } from './Projections';
17
+
18
+ // Decorators are applied as plain function calls (rather than `@decorator` syntax) so these
19
+ // fixtures don't depend on the test runner's decorator-syntax support - they exercise exactly
20
+ // the same decorator functions and metadata storage that `@decorator` syntax would invoke.
21
+
22
+ class ItemAdded {
23
+ quantity!: number;
24
+ }
25
+ eventType()(ItemAdded);
26
+
27
+ class ItemRemoved {
28
+ amount!: number;
29
+ }
30
+ eventType()(ItemRemoved);
31
+
32
+ class CounterIncremented {}
33
+ eventType()(CounterIncremented);
34
+
35
+ class CounterDecremented {}
36
+ eventType()(CounterDecremented);
37
+
38
+ class ThingHappened {}
39
+ eventType()(ThingHappened);
40
+
41
+ class KeyedThingHappened {}
42
+ eventType()(KeyedThingHappened);
43
+
44
+ class Inventory {
45
+ id!: string;
46
+ total!: number;
47
+ totalFromNamedProperty!: number;
48
+ removedTotal!: number;
49
+ incrementedCount!: number;
50
+ decrementedCount!: number;
51
+ thingsHappenedCount!: number;
52
+ constantKeyedCount!: number;
53
+ }
54
+ addFrom(ItemAdded)(Inventory.prototype, 'total');
55
+ addFrom(ItemAdded, 'quantity')(Inventory.prototype, 'totalFromNamedProperty');
56
+ subtractFrom(ItemRemoved, 'amount')(Inventory.prototype, 'removedTotal');
57
+ increment(CounterIncremented)(Inventory.prototype, 'incrementedCount');
58
+ decrement(CounterDecremented)(Inventory.prototype, 'decrementedCount');
59
+ count(ThingHappened)(Inventory.prototype, 'thingsHappenedCount');
60
+ count(KeyedThingHappened, 'all-things')(Inventory.prototype, 'constantKeyedCount');
61
+ fromEvent(ItemAdded)(Inventory);
62
+ readModel()(Inventory);
63
+
64
+ /**
65
+ * Builds a {@link Projections} instance wired to capture the registration payload sent
66
+ * to the kernel, without requiring a real gRPC connection.
67
+ */
68
+ function createProjections(readModels: (new (...args: unknown[]) => unknown)[]) {
69
+ const registerMock = vi.fn().mockResolvedValue(undefined);
70
+ const registerManyMock = vi.fn().mockResolvedValue(undefined);
71
+ const connection = {
72
+ readModels: { registerMany: registerManyMock },
73
+ projections: { register: registerMock }
74
+ } as unknown as ChronicleConnection;
75
+
76
+ const clientArtifacts: IClientArtifactsProvider = {
77
+ eventTypes: [],
78
+ readModels: readModels as unknown as IClientArtifactsProvider['readModels'],
79
+ reactors: [],
80
+ reducers: [],
81
+ seeders: [],
82
+ constraints: [],
83
+ projections: [],
84
+ webhooks: [],
85
+ eventTypeMigrations: []
86
+ };
87
+
88
+ const projections = new Projections('test-store', connection, clientArtifacts, 'test-sink');
89
+ return { projections, registerMock };
90
+ }
91
+
92
+ function findFromEntry(definition: { From: Array<{ Key: { Id: string }; Value: { Properties: Record<string, string>; Key: string } }> }, eventTypeId: string) {
93
+ const entry = definition.From.find(candidate => candidate.Key.Id === eventTypeId);
94
+ if (!entry) {
95
+ throw new Error(`No From entry found for event type '${eventTypeId}'.`);
96
+ }
97
+ return entry;
98
+ }
99
+
100
+ describe('Projections', () => {
101
+ describe('when registering a model-bound projection with arithmetic decorators', () => {
102
+ it('should not throw and should produce the correct wire expressions', async () => {
103
+ const { projections, registerMock } = createProjections([Inventory]);
104
+
105
+ await expect(projections.register()).resolves.not.toThrow();
106
+
107
+ const request = registerMock.mock.calls[0][0] as { Projections: unknown[] };
108
+ const definition = request.Projections[0] as { From: Array<{ Key: { Id: string }; Value: { Properties: Record<string, string>; Key: string } }> };
109
+
110
+ const itemAdded = findFromEntry(definition, 'ItemAdded');
111
+ expect(itemAdded.Value.Properties.total).toBe('$add(total)');
112
+ expect(itemAdded.Value.Properties.totalFromNamedProperty).toBe('$add(quantity)');
113
+
114
+ const itemRemoved = findFromEntry(definition, 'ItemRemoved');
115
+ expect(itemRemoved.Value.Properties.removedTotal).toBe('$subtract(amount)');
116
+
117
+ const counterIncremented = findFromEntry(definition, 'CounterIncremented');
118
+ expect(counterIncremented.Value.Properties.incrementedCount).toBe('$increment');
119
+
120
+ const counterDecremented = findFromEntry(definition, 'CounterDecremented');
121
+ expect(counterDecremented.Value.Properties.decrementedCount).toBe('$decrement');
122
+
123
+ const thingHappened = findFromEntry(definition, 'ThingHappened');
124
+ expect(thingHappened.Value.Properties.thingsHappenedCount).toBe('$count');
125
+
126
+ const keyedThingHappened = findFromEntry(definition, 'KeyedThingHappened');
127
+ expect(keyedThingHappened.Value.Properties.constantKeyedCount).toBe('$count');
128
+ expect(keyedThingHappened.Value.Key).toBe('$value(all-things)');
129
+ });
130
+ });
131
+ });