@cratis/chronicle 0.0.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 (647) hide show
  1. package/ChronicleClient.ts +453 -0
  2. package/ChronicleOptions.ts +104 -0
  3. package/EventSequences/AppendError.ts +10 -0
  4. package/EventSequences/AppendOptions.ts +15 -0
  5. package/EventSequences/AppendResult.ts +23 -0
  6. package/EventSequences/ConstraintViolation.ts +16 -0
  7. package/EventSequences/EventLog.ts +21 -0
  8. package/EventSequences/EventSequence.ts +372 -0
  9. package/EventSequences/EventSequenceId.ts +17 -0
  10. package/EventSequences/EventSequenceNumber.ts +38 -0
  11. package/EventSequences/IEventLog.ts +10 -0
  12. package/EventSequences/IEventSequence.ts +47 -0
  13. package/EventSequences/index.ts +13 -0
  14. package/EventStore.ts +132 -0
  15. package/EventStoreName.ts +14 -0
  16. package/EventStoreNamespaceName.ts +17 -0
  17. package/Events/AppendedEvent.ts +19 -0
  18. package/Events/CausationEntry.ts +13 -0
  19. package/Events/Constraints/ConstraintBuilder.ts +86 -0
  20. package/Events/Constraints/ConstraintId.ts +14 -0
  21. package/Events/Constraints/Constraints.ts +117 -0
  22. package/Events/Constraints/IConstraint.ts +18 -0
  23. package/Events/Constraints/IConstraintBuilder.ts +44 -0
  24. package/Events/Constraints/IConstraints.ts +28 -0
  25. package/Events/Constraints/IUniqueConstraintBuilder.ts +52 -0
  26. package/Events/Constraints/UniqueConstraintBuilder.ts +97 -0
  27. package/Events/Constraints/constraint.ts +56 -0
  28. package/Events/Constraints/index.ts +15 -0
  29. package/Events/EventContext.ts +28 -0
  30. package/Events/EventType.ts +41 -0
  31. package/Events/EventTypeGeneration.ts +20 -0
  32. package/Events/EventTypeId.ts +19 -0
  33. package/Events/EventTypes.ts +95 -0
  34. package/Events/IEventTypes.ts +39 -0
  35. package/Events/eventTypeDecorator.ts +147 -0
  36. package/Events/index.ts +14 -0
  37. package/IChronicleClient.ts +39 -0
  38. package/IEventStore.ts +56 -0
  39. package/Metrics.ts +109 -0
  40. package/Observation/ObserverId.ts +14 -0
  41. package/Observation/ObserverRunningState.ts +34 -0
  42. package/Observation/index.ts +5 -0
  43. package/Projections/IProjections.ts +19 -0
  44. package/Projections/ProjectionId.ts +14 -0
  45. package/Projections/Projections.ts +463 -0
  46. package/Projections/declarative/AllSetBuilder.ts +39 -0
  47. package/Projections/declarative/FromBuilder.ts +144 -0
  48. package/Projections/declarative/FromEveryBuilder.ts +46 -0
  49. package/Projections/declarative/IAddBuilder.ts +18 -0
  50. package/Projections/declarative/IAddChildBuilder.ts +25 -0
  51. package/Projections/declarative/IAllSetBuilder.ts +31 -0
  52. package/Projections/declarative/IChildrenBuilder.ts +31 -0
  53. package/Projections/declarative/ICompositeKeyBuilder.ts +22 -0
  54. package/Projections/declarative/IFromBuilder.ts +12 -0
  55. package/Projections/declarative/IFromEveryBuilder.ts +24 -0
  56. package/Projections/declarative/IJoinBuilder.ts +20 -0
  57. package/Projections/declarative/INestedBuilder.ts +19 -0
  58. package/Projections/declarative/IProjectionBuilder.ts +98 -0
  59. package/Projections/declarative/IProjectionBuilderFor.ts +38 -0
  60. package/Projections/declarative/IProjectionFor.ts +18 -0
  61. package/Projections/declarative/IReadModelPropertiesBuilder.ts +132 -0
  62. package/Projections/declarative/IRemovedWithBuilder.ts +25 -0
  63. package/Projections/declarative/IRemovedWithJoinBuilder.ts +25 -0
  64. package/Projections/declarative/ISetBuilder.ts +38 -0
  65. package/Projections/declarative/ISubtractBuilder.ts +18 -0
  66. package/Projections/declarative/JoinBuilder.ts +148 -0
  67. package/Projections/declarative/ProjectionBuilderFor.ts +277 -0
  68. package/Projections/declarative/RemovedWithBuilder.ts +40 -0
  69. package/Projections/declarative/RemovedWithJoinBuilder.ts +43 -0
  70. package/Projections/declarative/SetBuilder.ts +46 -0
  71. package/Projections/declarative/index.ts +26 -0
  72. package/Projections/declarative/projection.ts +59 -0
  73. package/Projections/index.ts +8 -0
  74. package/Projections/modelBound/FromEventMetadata.ts +10 -0
  75. package/Projections/modelBound/FromEventOptions.ts +12 -0
  76. package/Projections/modelBound/addFrom.ts +41 -0
  77. package/Projections/modelBound/childrenFrom.ts +52 -0
  78. package/Projections/modelBound/clearWith.ts +54 -0
  79. package/Projections/modelBound/count.ts +41 -0
  80. package/Projections/modelBound/decrement.ts +41 -0
  81. package/Projections/modelBound/fromEvent.ts +40 -0
  82. package/Projections/modelBound/fromEvery.ts +39 -0
  83. package/Projections/modelBound/increment.ts +41 -0
  84. package/Projections/modelBound/index.ts +38 -0
  85. package/Projections/modelBound/join.ts +44 -0
  86. package/Projections/modelBound/modelBound.ts +59 -0
  87. package/Projections/modelBound/nested.ts +29 -0
  88. package/Projections/modelBound/notRewindable.ts +24 -0
  89. package/Projections/modelBound/removedWith.ts +60 -0
  90. package/Projections/modelBound/removedWithJoin.ts +55 -0
  91. package/Projections/modelBound/setFrom.ts +41 -0
  92. package/Projections/modelBound/setFromContext.ts +41 -0
  93. package/Projections/modelBound/setValue.ts +41 -0
  94. package/Projections/modelBound/subtractFrom.ts +41 -0
  95. package/README.md +69 -0
  96. package/Reactors/IReactors.ts +19 -0
  97. package/Reactors/ReactorId.ts +14 -0
  98. package/Reactors/Reactors.ts +320 -0
  99. package/Reactors/index.ts +8 -0
  100. package/Reactors/reactor.ts +75 -0
  101. package/ReadModels/ReadModelId.ts +14 -0
  102. package/ReadModels/index.ts +6 -0
  103. package/ReadModels/readModel.ts +89 -0
  104. package/Reducers/IReducers.ts +19 -0
  105. package/Reducers/ReducerId.ts +14 -0
  106. package/Reducers/Reducers.ts +322 -0
  107. package/Reducers/index.ts +8 -0
  108. package/Reducers/reducer.ts +87 -0
  109. package/Schemas/JsonSchema.ts +18 -0
  110. package/Schemas/JsonSchemaGenerator.ts +107 -0
  111. package/Schemas/index.ts +6 -0
  112. package/Schemas/jsonSchemaProperty.ts +24 -0
  113. package/Tracing.ts +21 -0
  114. package/artifacts/DefaultClientArtifactsProvider.ts +56 -0
  115. package/artifacts/IClientArtifactsProvider.ts +30 -0
  116. package/artifacts/index.ts +5 -0
  117. package/connection/ChronicleConnection.ts +226 -0
  118. package/connection/ChronicleConnectionString.ts +4 -0
  119. package/connection/ChronicleServices.ts +4 -0
  120. package/connection/ConnectionLifecycle.ts +77 -0
  121. package/connection/DateTimeOffset.ts +4 -0
  122. package/connection/Guid.ts +4 -0
  123. package/connection/TokenProvider.ts +13 -0
  124. package/connection/index.ts +9 -0
  125. package/dist/ChronicleClient.d.ts +55 -0
  126. package/dist/ChronicleClient.d.ts.map +1 -0
  127. package/dist/ChronicleClient.js +396 -0
  128. package/dist/ChronicleClient.js.map +1 -0
  129. package/dist/ChronicleOptions.d.ts +54 -0
  130. package/dist/ChronicleOptions.d.ts.map +1 -0
  131. package/dist/ChronicleOptions.js +75 -0
  132. package/dist/ChronicleOptions.js.map +1 -0
  133. package/dist/EventSequences/AppendError.d.ts +8 -0
  134. package/dist/EventSequences/AppendError.d.ts.map +1 -0
  135. package/dist/EventSequences/AppendError.js +4 -0
  136. package/dist/EventSequences/AppendError.js.map +1 -0
  137. package/dist/EventSequences/AppendOptions.d.ts +11 -0
  138. package/dist/EventSequences/AppendOptions.d.ts.map +1 -0
  139. package/dist/EventSequences/AppendOptions.js +4 -0
  140. package/dist/EventSequences/AppendOptions.js.map +1 -0
  141. package/dist/EventSequences/AppendResult.d.ts +17 -0
  142. package/dist/EventSequences/AppendResult.d.ts.map +1 -0
  143. package/dist/EventSequences/AppendResult.js +4 -0
  144. package/dist/EventSequences/AppendResult.js.map +1 -0
  145. package/dist/EventSequences/ConstraintViolation.d.ts +12 -0
  146. package/dist/EventSequences/ConstraintViolation.d.ts.map +1 -0
  147. package/dist/EventSequences/ConstraintViolation.js +4 -0
  148. package/dist/EventSequences/ConstraintViolation.js.map +1 -0
  149. package/dist/EventSequences/EventLog.d.ts +11 -0
  150. package/dist/EventSequences/EventLog.d.ts.map +1 -0
  151. package/dist/EventSequences/EventLog.js +14 -0
  152. package/dist/EventSequences/EventLog.js.map +1 -0
  153. package/dist/EventSequences/EventSequence.d.ts +27 -0
  154. package/dist/EventSequences/EventSequence.d.ts.map +1 -0
  155. package/dist/EventSequences/EventSequence.js +337 -0
  156. package/dist/EventSequences/EventSequence.js.map +1 -0
  157. package/dist/EventSequences/EventSequenceId.d.ts +12 -0
  158. package/dist/EventSequences/EventSequenceId.d.ts.map +1 -0
  159. package/dist/EventSequences/EventSequenceId.js +18 -0
  160. package/dist/EventSequences/EventSequenceId.js.map +1 -0
  161. package/dist/EventSequences/EventSequenceNumber.d.ts +26 -0
  162. package/dist/EventSequences/EventSequenceNumber.d.ts.map +1 -0
  163. package/dist/EventSequences/EventSequenceNumber.js +36 -0
  164. package/dist/EventSequences/EventSequenceNumber.js.map +1 -0
  165. package/dist/EventSequences/IEventLog.d.ts +8 -0
  166. package/dist/EventSequences/IEventLog.d.ts.map +1 -0
  167. package/dist/EventSequences/IEventLog.js +4 -0
  168. package/dist/EventSequences/IEventLog.js.map +1 -0
  169. package/dist/EventSequences/IEventSequence.d.ts +40 -0
  170. package/dist/EventSequences/IEventSequence.d.ts.map +1 -0
  171. package/dist/EventSequences/IEventSequence.js +4 -0
  172. package/dist/EventSequences/IEventSequence.js.map +1 -0
  173. package/dist/EventSequences/index.d.ts +11 -0
  174. package/dist/EventSequences/index.d.ts.map +1 -0
  175. package/dist/EventSequences/index.js +7 -0
  176. package/dist/EventSequences/index.js.map +1 -0
  177. package/dist/EventStore.d.ts +42 -0
  178. package/dist/EventStore.d.ts.map +1 -0
  179. package/dist/EventStore.js +111 -0
  180. package/dist/EventStore.js.map +1 -0
  181. package/dist/EventStoreName.d.ts +10 -0
  182. package/dist/EventStoreName.d.ts.map +1 -0
  183. package/dist/EventStoreName.js +16 -0
  184. package/dist/EventStoreName.js.map +1 -0
  185. package/dist/EventStoreNamespaceName.d.ts +12 -0
  186. package/dist/EventStoreNamespaceName.d.ts.map +1 -0
  187. package/dist/EventStoreNamespaceName.js +18 -0
  188. package/dist/EventStoreNamespaceName.js.map +1 -0
  189. package/dist/Events/AppendedEvent.d.ts +14 -0
  190. package/dist/Events/AppendedEvent.d.ts.map +1 -0
  191. package/dist/Events/AppendedEvent.js +4 -0
  192. package/dist/Events/AppendedEvent.js.map +1 -0
  193. package/dist/Events/CausationEntry.d.ts +10 -0
  194. package/dist/Events/CausationEntry.d.ts.map +1 -0
  195. package/dist/Events/CausationEntry.js +4 -0
  196. package/dist/Events/CausationEntry.js.map +1 -0
  197. package/dist/Events/Constraints/ConstraintBuilder.d.ts +42 -0
  198. package/dist/Events/Constraints/ConstraintBuilder.d.ts.map +1 -0
  199. package/dist/Events/Constraints/ConstraintBuilder.js +55 -0
  200. package/dist/Events/Constraints/ConstraintBuilder.js.map +1 -0
  201. package/dist/Events/Constraints/ConstraintId.d.ts +10 -0
  202. package/dist/Events/Constraints/ConstraintId.d.ts.map +1 -0
  203. package/dist/Events/Constraints/ConstraintId.js +16 -0
  204. package/dist/Events/Constraints/ConstraintId.js.map +1 -0
  205. package/dist/Events/Constraints/Constraints.d.ts +27 -0
  206. package/dist/Events/Constraints/Constraints.d.ts.map +1 -0
  207. package/dist/Events/Constraints/Constraints.js +104 -0
  208. package/dist/Events/Constraints/Constraints.js.map +1 -0
  209. package/dist/Events/Constraints/IConstraint.d.ts +15 -0
  210. package/dist/Events/Constraints/IConstraint.d.ts.map +1 -0
  211. package/dist/Events/Constraints/IConstraint.js +4 -0
  212. package/dist/Events/Constraints/IConstraint.js.map +1 -0
  213. package/dist/Events/Constraints/IConstraintBuilder.d.ts +37 -0
  214. package/dist/Events/Constraints/IConstraintBuilder.d.ts.map +1 -0
  215. package/dist/Events/Constraints/IConstraintBuilder.js +4 -0
  216. package/dist/Events/Constraints/IConstraintBuilder.js.map +1 -0
  217. package/dist/Events/Constraints/IConstraints.d.ts +23 -0
  218. package/dist/Events/Constraints/IConstraints.d.ts.map +1 -0
  219. package/dist/Events/Constraints/IConstraints.js +4 -0
  220. package/dist/Events/Constraints/IConstraints.js.map +1 -0
  221. package/dist/Events/Constraints/IUniqueConstraintBuilder.d.ts +44 -0
  222. package/dist/Events/Constraints/IUniqueConstraintBuilder.d.ts.map +1 -0
  223. package/dist/Events/Constraints/IUniqueConstraintBuilder.js +4 -0
  224. package/dist/Events/Constraints/IUniqueConstraintBuilder.js.map +1 -0
  225. package/dist/Events/Constraints/UniqueConstraintBuilder.d.ts +42 -0
  226. package/dist/Events/Constraints/UniqueConstraintBuilder.d.ts.map +1 -0
  227. package/dist/Events/Constraints/UniqueConstraintBuilder.js +72 -0
  228. package/dist/Events/Constraints/UniqueConstraintBuilder.js.map +1 -0
  229. package/dist/Events/Constraints/constraint.d.ts +29 -0
  230. package/dist/Events/Constraints/constraint.d.ts.map +1 -0
  231. package/dist/Events/Constraints/constraint.js +39 -0
  232. package/dist/Events/Constraints/constraint.js.map +1 -0
  233. package/dist/Events/Constraints/index.d.ts +13 -0
  234. package/dist/Events/Constraints/index.d.ts.map +1 -0
  235. package/dist/Events/Constraints/index.js +8 -0
  236. package/dist/Events/Constraints/index.js.map +1 -0
  237. package/dist/Events/EventContext.d.ts +20 -0
  238. package/dist/Events/EventContext.d.ts.map +1 -0
  239. package/dist/Events/EventContext.js +4 -0
  240. package/dist/Events/EventContext.js.map +1 -0
  241. package/dist/Events/EventType.d.ts +23 -0
  242. package/dist/Events/EventType.d.ts.map +1 -0
  243. package/dist/Events/EventType.js +40 -0
  244. package/dist/Events/EventType.js.map +1 -0
  245. package/dist/Events/EventTypeGeneration.d.ts +14 -0
  246. package/dist/Events/EventTypeGeneration.d.ts.map +1 -0
  247. package/dist/Events/EventTypeGeneration.js +20 -0
  248. package/dist/Events/EventTypeGeneration.js.map +1 -0
  249. package/dist/Events/EventTypeId.d.ts +14 -0
  250. package/dist/Events/EventTypeId.d.ts.map +1 -0
  251. package/dist/Events/EventTypeId.js +20 -0
  252. package/dist/Events/EventTypeId.js.map +1 -0
  253. package/dist/Events/EventTypes.d.ts +33 -0
  254. package/dist/Events/EventTypes.d.ts.map +1 -0
  255. package/dist/Events/EventTypes.js +83 -0
  256. package/dist/Events/EventTypes.js.map +1 -0
  257. package/dist/Events/IEventTypes.d.ts +32 -0
  258. package/dist/Events/IEventTypes.d.ts.map +1 -0
  259. package/dist/Events/IEventTypes.js +4 -0
  260. package/dist/Events/IEventTypes.js.map +1 -0
  261. package/dist/Events/eventTypeDecorator.d.ts +71 -0
  262. package/dist/Events/eventTypeDecorator.d.ts.map +1 -0
  263. package/dist/Events/eventTypeDecorator.js +86 -0
  264. package/dist/Events/eventTypeDecorator.js.map +1 -0
  265. package/dist/Events/index.d.ts +12 -0
  266. package/dist/Events/index.d.ts.map +1 -0
  267. package/dist/Events/index.js +9 -0
  268. package/dist/Events/index.js.map +1 -0
  269. package/dist/Grpc.d.ts +19 -0
  270. package/dist/Grpc.d.ts.map +1 -0
  271. package/dist/Grpc.js +33 -0
  272. package/dist/Grpc.js.map +1 -0
  273. package/dist/IChronicleClient.d.ts +33 -0
  274. package/dist/IChronicleClient.d.ts.map +1 -0
  275. package/dist/IChronicleClient.js +4 -0
  276. package/dist/IChronicleClient.js.map +1 -0
  277. package/dist/IEventStore.d.ts +44 -0
  278. package/dist/IEventStore.d.ts.map +1 -0
  279. package/dist/IEventStore.js +4 -0
  280. package/dist/IEventStore.js.map +1 -0
  281. package/dist/Metrics.d.ts +70 -0
  282. package/dist/Metrics.d.ts.map +1 -0
  283. package/dist/Metrics.js +100 -0
  284. package/dist/Metrics.js.map +1 -0
  285. package/dist/Observation/ObserverId.d.ts +10 -0
  286. package/dist/Observation/ObserverId.d.ts.map +1 -0
  287. package/dist/Observation/ObserverId.js +16 -0
  288. package/dist/Observation/ObserverId.js.map +1 -0
  289. package/dist/Observation/ObserverRunningState.d.ts +24 -0
  290. package/dist/Observation/ObserverRunningState.d.ts.map +1 -0
  291. package/dist/Observation/ObserverRunningState.js +27 -0
  292. package/dist/Observation/ObserverRunningState.js.map +1 -0
  293. package/dist/Observation/index.d.ts +3 -0
  294. package/dist/Observation/index.d.ts.map +1 -0
  295. package/dist/Observation/index.js +5 -0
  296. package/dist/Observation/index.js.map +1 -0
  297. package/dist/Projections/IProjections.d.ts +16 -0
  298. package/dist/Projections/IProjections.d.ts.map +1 -0
  299. package/dist/Projections/IProjections.js +4 -0
  300. package/dist/Projections/IProjections.js.map +1 -0
  301. package/dist/Projections/ProjectionId.d.ts +10 -0
  302. package/dist/Projections/ProjectionId.d.ts.map +1 -0
  303. package/dist/Projections/ProjectionId.js +16 -0
  304. package/dist/Projections/ProjectionId.js.map +1 -0
  305. package/dist/Projections/Projections.d.ts +36 -0
  306. package/dist/Projections/Projections.d.ts.map +1 -0
  307. package/dist/Projections/Projections.js +390 -0
  308. package/dist/Projections/Projections.js.map +1 -0
  309. package/dist/Projections/declarative/AllSetBuilder.d.ts +20 -0
  310. package/dist/Projections/declarative/AllSetBuilder.d.ts.map +1 -0
  311. package/dist/Projections/declarative/AllSetBuilder.js +37 -0
  312. package/dist/Projections/declarative/AllSetBuilder.js.map +1 -0
  313. package/dist/Projections/declarative/FromBuilder.d.ts +56 -0
  314. package/dist/Projections/declarative/FromBuilder.d.ts.map +1 -0
  315. package/dist/Projections/declarative/FromBuilder.js +105 -0
  316. package/dist/Projections/declarative/FromBuilder.js.map +1 -0
  317. package/dist/Projections/declarative/FromEveryBuilder.d.ts +22 -0
  318. package/dist/Projections/declarative/FromEveryBuilder.d.ts.map +1 -0
  319. package/dist/Projections/declarative/FromEveryBuilder.js +28 -0
  320. package/dist/Projections/declarative/FromEveryBuilder.js.map +1 -0
  321. package/dist/Projections/declarative/IAddBuilder.d.ts +15 -0
  322. package/dist/Projections/declarative/IAddBuilder.d.ts.map +1 -0
  323. package/dist/Projections/declarative/IAddBuilder.js +4 -0
  324. package/dist/Projections/declarative/IAddBuilder.js.map +1 -0
  325. package/dist/Projections/declarative/IAddChildBuilder.d.ts +21 -0
  326. package/dist/Projections/declarative/IAddChildBuilder.d.ts.map +1 -0
  327. package/dist/Projections/declarative/IAddChildBuilder.js +4 -0
  328. package/dist/Projections/declarative/IAddChildBuilder.js.map +1 -0
  329. package/dist/Projections/declarative/IAllSetBuilder.d.ts +26 -0
  330. package/dist/Projections/declarative/IAllSetBuilder.d.ts.map +1 -0
  331. package/dist/Projections/declarative/IAllSetBuilder.js +4 -0
  332. package/dist/Projections/declarative/IAllSetBuilder.js.map +1 -0
  333. package/dist/Projections/declarative/IChildrenBuilder.d.ts +22 -0
  334. package/dist/Projections/declarative/IChildrenBuilder.d.ts.map +1 -0
  335. package/dist/Projections/declarative/IChildrenBuilder.js +4 -0
  336. package/dist/Projections/declarative/IChildrenBuilder.js.map +1 -0
  337. package/dist/Projections/declarative/ICompositeKeyBuilder.d.ts +16 -0
  338. package/dist/Projections/declarative/ICompositeKeyBuilder.d.ts.map +1 -0
  339. package/dist/Projections/declarative/ICompositeKeyBuilder.js +4 -0
  340. package/dist/Projections/declarative/ICompositeKeyBuilder.js.map +1 -0
  341. package/dist/Projections/declarative/IFromBuilder.d.ts +9 -0
  342. package/dist/Projections/declarative/IFromBuilder.d.ts.map +1 -0
  343. package/dist/Projections/declarative/IFromBuilder.js +4 -0
  344. package/dist/Projections/declarative/IFromBuilder.js.map +1 -0
  345. package/dist/Projections/declarative/IFromEveryBuilder.d.ts +20 -0
  346. package/dist/Projections/declarative/IFromEveryBuilder.d.ts.map +1 -0
  347. package/dist/Projections/declarative/IFromEveryBuilder.js +4 -0
  348. package/dist/Projections/declarative/IFromEveryBuilder.js.map +1 -0
  349. package/dist/Projections/declarative/IJoinBuilder.d.ts +16 -0
  350. package/dist/Projections/declarative/IJoinBuilder.d.ts.map +1 -0
  351. package/dist/Projections/declarative/IJoinBuilder.js +4 -0
  352. package/dist/Projections/declarative/IJoinBuilder.js.map +1 -0
  353. package/dist/Projections/declarative/INestedBuilder.d.ts +15 -0
  354. package/dist/Projections/declarative/INestedBuilder.d.ts.map +1 -0
  355. package/dist/Projections/declarative/INestedBuilder.js +4 -0
  356. package/dist/Projections/declarative/INestedBuilder.js.map +1 -0
  357. package/dist/Projections/declarative/IProjectionBuilder.d.ts +80 -0
  358. package/dist/Projections/declarative/IProjectionBuilder.d.ts.map +1 -0
  359. package/dist/Projections/declarative/IProjectionBuilder.js +4 -0
  360. package/dist/Projections/declarative/IProjectionBuilder.js.map +1 -0
  361. package/dist/Projections/declarative/IProjectionBuilderFor.d.ts +31 -0
  362. package/dist/Projections/declarative/IProjectionBuilderFor.d.ts.map +1 -0
  363. package/dist/Projections/declarative/IProjectionBuilderFor.js +4 -0
  364. package/dist/Projections/declarative/IProjectionBuilderFor.js.map +1 -0
  365. package/dist/Projections/declarative/IProjectionFor.d.ts +15 -0
  366. package/dist/Projections/declarative/IProjectionFor.d.ts.map +1 -0
  367. package/dist/Projections/declarative/IProjectionFor.js +4 -0
  368. package/dist/Projections/declarative/IProjectionFor.js.map +1 -0
  369. package/dist/Projections/declarative/IReadModelPropertiesBuilder.d.ts +111 -0
  370. package/dist/Projections/declarative/IReadModelPropertiesBuilder.d.ts.map +1 -0
  371. package/dist/Projections/declarative/IReadModelPropertiesBuilder.js +4 -0
  372. package/dist/Projections/declarative/IReadModelPropertiesBuilder.js.map +1 -0
  373. package/dist/Projections/declarative/IRemovedWithBuilder.d.ts +21 -0
  374. package/dist/Projections/declarative/IRemovedWithBuilder.d.ts.map +1 -0
  375. package/dist/Projections/declarative/IRemovedWithBuilder.js +4 -0
  376. package/dist/Projections/declarative/IRemovedWithBuilder.js.map +1 -0
  377. package/dist/Projections/declarative/IRemovedWithJoinBuilder.d.ts +21 -0
  378. package/dist/Projections/declarative/IRemovedWithJoinBuilder.d.ts.map +1 -0
  379. package/dist/Projections/declarative/IRemovedWithJoinBuilder.js +4 -0
  380. package/dist/Projections/declarative/IRemovedWithJoinBuilder.js.map +1 -0
  381. package/dist/Projections/declarative/ISetBuilder.d.ts +32 -0
  382. package/dist/Projections/declarative/ISetBuilder.d.ts.map +1 -0
  383. package/dist/Projections/declarative/ISetBuilder.js +4 -0
  384. package/dist/Projections/declarative/ISetBuilder.js.map +1 -0
  385. package/dist/Projections/declarative/ISubtractBuilder.d.ts +15 -0
  386. package/dist/Projections/declarative/ISubtractBuilder.d.ts.map +1 -0
  387. package/dist/Projections/declarative/ISubtractBuilder.js +4 -0
  388. package/dist/Projections/declarative/ISubtractBuilder.js.map +1 -0
  389. package/dist/Projections/declarative/JoinBuilder.d.ts +58 -0
  390. package/dist/Projections/declarative/JoinBuilder.d.ts.map +1 -0
  391. package/dist/Projections/declarative/JoinBuilder.js +107 -0
  392. package/dist/Projections/declarative/JoinBuilder.js.map +1 -0
  393. package/dist/Projections/declarative/ProjectionBuilderFor.d.ts +68 -0
  394. package/dist/Projections/declarative/ProjectionBuilderFor.d.ts.map +1 -0
  395. package/dist/Projections/declarative/ProjectionBuilderFor.js +207 -0
  396. package/dist/Projections/declarative/ProjectionBuilderFor.js.map +1 -0
  397. package/dist/Projections/declarative/RemovedWithBuilder.d.ts +22 -0
  398. package/dist/Projections/declarative/RemovedWithBuilder.d.ts.map +1 -0
  399. package/dist/Projections/declarative/RemovedWithBuilder.js +28 -0
  400. package/dist/Projections/declarative/RemovedWithBuilder.js.map +1 -0
  401. package/dist/Projections/declarative/RemovedWithJoinBuilder.d.ts +22 -0
  402. package/dist/Projections/declarative/RemovedWithJoinBuilder.d.ts.map +1 -0
  403. package/dist/Projections/declarative/RemovedWithJoinBuilder.js +31 -0
  404. package/dist/Projections/declarative/RemovedWithJoinBuilder.js.map +1 -0
  405. package/dist/Projections/declarative/SetBuilder.d.ts +23 -0
  406. package/dist/Projections/declarative/SetBuilder.d.ts.map +1 -0
  407. package/dist/Projections/declarative/SetBuilder.js +43 -0
  408. package/dist/Projections/declarative/SetBuilder.js.map +1 -0
  409. package/dist/Projections/declarative/index.d.ts +24 -0
  410. package/dist/Projections/declarative/index.d.ts.map +1 -0
  411. package/dist/Projections/declarative/index.js +8 -0
  412. package/dist/Projections/declarative/index.js.map +1 -0
  413. package/dist/Projections/declarative/projection.d.ts +31 -0
  414. package/dist/Projections/declarative/projection.d.ts.map +1 -0
  415. package/dist/Projections/declarative/projection.js +39 -0
  416. package/dist/Projections/declarative/projection.js.map +1 -0
  417. package/dist/Projections/index.d.ts +6 -0
  418. package/dist/Projections/index.d.ts.map +1 -0
  419. package/dist/Projections/index.js +7 -0
  420. package/dist/Projections/index.js.map +1 -0
  421. package/dist/Projections/modelBound/FromEventMetadata.d.ts +7 -0
  422. package/dist/Projections/modelBound/FromEventMetadata.d.ts.map +1 -0
  423. package/dist/Projections/modelBound/FromEventMetadata.js +4 -0
  424. package/dist/Projections/modelBound/FromEventMetadata.js.map +1 -0
  425. package/dist/Projections/modelBound/FromEventOptions.d.ts +10 -0
  426. package/dist/Projections/modelBound/FromEventOptions.d.ts.map +1 -0
  427. package/dist/Projections/modelBound/FromEventOptions.js +4 -0
  428. package/dist/Projections/modelBound/FromEventOptions.js.map +1 -0
  429. package/dist/Projections/modelBound/addFrom.d.ts +23 -0
  430. package/dist/Projections/modelBound/addFrom.d.ts.map +1 -0
  431. package/dist/Projections/modelBound/addFrom.js +30 -0
  432. package/dist/Projections/modelBound/addFrom.js.map +1 -0
  433. package/dist/Projections/modelBound/childrenFrom.d.ts +29 -0
  434. package/dist/Projections/modelBound/childrenFrom.d.ts.map +1 -0
  435. package/dist/Projections/modelBound/childrenFrom.js +32 -0
  436. package/dist/Projections/modelBound/childrenFrom.js.map +1 -0
  437. package/dist/Projections/modelBound/clearWith.d.ts +28 -0
  438. package/dist/Projections/modelBound/clearWith.d.ts.map +1 -0
  439. package/dist/Projections/modelBound/clearWith.js +45 -0
  440. package/dist/Projections/modelBound/clearWith.js.map +1 -0
  441. package/dist/Projections/modelBound/count.d.ts +23 -0
  442. package/dist/Projections/modelBound/count.d.ts.map +1 -0
  443. package/dist/Projections/modelBound/count.js +30 -0
  444. package/dist/Projections/modelBound/count.js.map +1 -0
  445. package/dist/Projections/modelBound/decrement.d.ts +23 -0
  446. package/dist/Projections/modelBound/decrement.d.ts.map +1 -0
  447. package/dist/Projections/modelBound/decrement.js +30 -0
  448. package/dist/Projections/modelBound/decrement.js.map +1 -0
  449. package/dist/Projections/modelBound/fromEvent.d.ts +23 -0
  450. package/dist/Projections/modelBound/fromEvent.d.ts.map +1 -0
  451. package/dist/Projections/modelBound/fromEvent.js +34 -0
  452. package/dist/Projections/modelBound/fromEvent.js.map +1 -0
  453. package/dist/Projections/modelBound/fromEvery.d.ts +23 -0
  454. package/dist/Projections/modelBound/fromEvery.d.ts.map +1 -0
  455. package/dist/Projections/modelBound/fromEvery.js +28 -0
  456. package/dist/Projections/modelBound/fromEvery.js.map +1 -0
  457. package/dist/Projections/modelBound/increment.d.ts +23 -0
  458. package/dist/Projections/modelBound/increment.d.ts.map +1 -0
  459. package/dist/Projections/modelBound/increment.js +30 -0
  460. package/dist/Projections/modelBound/increment.js.map +1 -0
  461. package/dist/Projections/modelBound/index.d.ts +36 -0
  462. package/dist/Projections/modelBound/index.d.ts.map +1 -0
  463. package/dist/Projections/modelBound/index.js +21 -0
  464. package/dist/Projections/modelBound/index.js.map +1 -0
  465. package/dist/Projections/modelBound/join.d.ts +26 -0
  466. package/dist/Projections/modelBound/join.d.ts.map +1 -0
  467. package/dist/Projections/modelBound/join.js +31 -0
  468. package/dist/Projections/modelBound/join.js.map +1 -0
  469. package/dist/Projections/modelBound/modelBound.d.ts +31 -0
  470. package/dist/Projections/modelBound/modelBound.d.ts.map +1 -0
  471. package/dist/Projections/modelBound/modelBound.js +39 -0
  472. package/dist/Projections/modelBound/modelBound.js.map +1 -0
  473. package/dist/Projections/modelBound/nested.d.ts +16 -0
  474. package/dist/Projections/modelBound/nested.d.ts.map +1 -0
  475. package/dist/Projections/modelBound/nested.js +26 -0
  476. package/dist/Projections/modelBound/nested.js.map +1 -0
  477. package/dist/Projections/modelBound/notRewindable.d.ts +14 -0
  478. package/dist/Projections/modelBound/notRewindable.d.ts.map +1 -0
  479. package/dist/Projections/modelBound/notRewindable.js +21 -0
  480. package/dist/Projections/modelBound/notRewindable.js.map +1 -0
  481. package/dist/Projections/modelBound/removedWith.d.ts +34 -0
  482. package/dist/Projections/modelBound/removedWith.d.ts.map +1 -0
  483. package/dist/Projections/modelBound/removedWith.js +47 -0
  484. package/dist/Projections/modelBound/removedWith.js.map +1 -0
  485. package/dist/Projections/modelBound/removedWithJoin.d.ts +29 -0
  486. package/dist/Projections/modelBound/removedWithJoin.d.ts.map +1 -0
  487. package/dist/Projections/modelBound/removedWithJoin.js +44 -0
  488. package/dist/Projections/modelBound/removedWithJoin.js.map +1 -0
  489. package/dist/Projections/modelBound/setFrom.d.ts +23 -0
  490. package/dist/Projections/modelBound/setFrom.d.ts.map +1 -0
  491. package/dist/Projections/modelBound/setFrom.js +30 -0
  492. package/dist/Projections/modelBound/setFrom.js.map +1 -0
  493. package/dist/Projections/modelBound/setFromContext.d.ts +23 -0
  494. package/dist/Projections/modelBound/setFromContext.d.ts.map +1 -0
  495. package/dist/Projections/modelBound/setFromContext.js +30 -0
  496. package/dist/Projections/modelBound/setFromContext.js.map +1 -0
  497. package/dist/Projections/modelBound/setValue.d.ts +23 -0
  498. package/dist/Projections/modelBound/setValue.d.ts.map +1 -0
  499. package/dist/Projections/modelBound/setValue.js +30 -0
  500. package/dist/Projections/modelBound/setValue.js.map +1 -0
  501. package/dist/Projections/modelBound/subtractFrom.d.ts +23 -0
  502. package/dist/Projections/modelBound/subtractFrom.d.ts.map +1 -0
  503. package/dist/Projections/modelBound/subtractFrom.js +30 -0
  504. package/dist/Projections/modelBound/subtractFrom.js.map +1 -0
  505. package/dist/Reactors/IReactors.d.ts +16 -0
  506. package/dist/Reactors/IReactors.d.ts.map +1 -0
  507. package/dist/Reactors/IReactors.js +4 -0
  508. package/dist/Reactors/IReactors.js.map +1 -0
  509. package/dist/Reactors/ReactorId.d.ts +10 -0
  510. package/dist/Reactors/ReactorId.d.ts.map +1 -0
  511. package/dist/Reactors/ReactorId.js +16 -0
  512. package/dist/Reactors/ReactorId.js.map +1 -0
  513. package/dist/Reactors/Reactors.d.ts +38 -0
  514. package/dist/Reactors/Reactors.d.ts.map +1 -0
  515. package/dist/Reactors/Reactors.js +279 -0
  516. package/dist/Reactors/Reactors.js.map +1 -0
  517. package/dist/Reactors/index.d.ts +6 -0
  518. package/dist/Reactors/index.d.ts.map +1 -0
  519. package/dist/Reactors/index.js +6 -0
  520. package/dist/Reactors/index.js.map +1 -0
  521. package/dist/Reactors/reactor.d.ts +47 -0
  522. package/dist/Reactors/reactor.d.ts.map +1 -0
  523. package/dist/Reactors/reactor.js +55 -0
  524. package/dist/Reactors/reactor.js.map +1 -0
  525. package/dist/ReadModels/ReadModelId.d.ts +10 -0
  526. package/dist/ReadModels/ReadModelId.d.ts.map +1 -0
  527. package/dist/ReadModels/ReadModelId.js +16 -0
  528. package/dist/ReadModels/ReadModelId.js.map +1 -0
  529. package/dist/ReadModels/index.d.ts +4 -0
  530. package/dist/ReadModels/index.d.ts.map +1 -0
  531. package/dist/ReadModels/index.js +5 -0
  532. package/dist/ReadModels/index.js.map +1 -0
  533. package/dist/ReadModels/readModel.d.ts +33 -0
  534. package/dist/ReadModels/readModel.d.ts.map +1 -0
  535. package/dist/ReadModels/readModel.js +64 -0
  536. package/dist/ReadModels/readModel.js.map +1 -0
  537. package/dist/Reducers/IReducers.d.ts +16 -0
  538. package/dist/Reducers/IReducers.d.ts.map +1 -0
  539. package/dist/Reducers/IReducers.js +4 -0
  540. package/dist/Reducers/IReducers.js.map +1 -0
  541. package/dist/Reducers/ReducerId.d.ts +10 -0
  542. package/dist/Reducers/ReducerId.d.ts.map +1 -0
  543. package/dist/Reducers/ReducerId.js +16 -0
  544. package/dist/Reducers/ReducerId.js.map +1 -0
  545. package/dist/Reducers/Reducers.d.ts +38 -0
  546. package/dist/Reducers/Reducers.d.ts.map +1 -0
  547. package/dist/Reducers/Reducers.js +279 -0
  548. package/dist/Reducers/Reducers.js.map +1 -0
  549. package/dist/Reducers/index.d.ts +6 -0
  550. package/dist/Reducers/index.d.ts.map +1 -0
  551. package/dist/Reducers/index.js +6 -0
  552. package/dist/Reducers/index.js.map +1 -0
  553. package/dist/Reducers/reducer.d.ts +51 -0
  554. package/dist/Reducers/reducer.d.ts.map +1 -0
  555. package/dist/Reducers/reducer.js +59 -0
  556. package/dist/Reducers/reducer.js.map +1 -0
  557. package/dist/Schemas/JsonSchema.d.ts +16 -0
  558. package/dist/Schemas/JsonSchema.d.ts.map +1 -0
  559. package/dist/Schemas/JsonSchema.js +4 -0
  560. package/dist/Schemas/JsonSchema.js.map +1 -0
  561. package/dist/Schemas/JsonSchemaGenerator.d.ts +26 -0
  562. package/dist/Schemas/JsonSchemaGenerator.d.ts.map +1 -0
  563. package/dist/Schemas/JsonSchemaGenerator.js +90 -0
  564. package/dist/Schemas/JsonSchemaGenerator.js.map +1 -0
  565. package/dist/Schemas/index.d.ts +4 -0
  566. package/dist/Schemas/index.d.ts.map +1 -0
  567. package/dist/Schemas/index.js +5 -0
  568. package/dist/Schemas/index.js.map +1 -0
  569. package/dist/Schemas/jsonSchemaProperty.d.ts +13 -0
  570. package/dist/Schemas/jsonSchemaProperty.d.ts.map +1 -0
  571. package/dist/Schemas/jsonSchemaProperty.js +22 -0
  572. package/dist/Schemas/jsonSchemaProperty.js.map +1 -0
  573. package/dist/Tracing.d.ts +16 -0
  574. package/dist/Tracing.d.ts.map +1 -0
  575. package/dist/Tracing.js +19 -0
  576. package/dist/Tracing.js.map +1 -0
  577. package/dist/artifacts/DefaultClientArtifactsProvider.d.ts +31 -0
  578. package/dist/artifacts/DefaultClientArtifactsProvider.d.ts.map +1 -0
  579. package/dist/artifacts/DefaultClientArtifactsProvider.js +48 -0
  580. package/dist/artifacts/DefaultClientArtifactsProvider.js.map +1 -0
  581. package/dist/artifacts/IClientArtifactsProvider.d.ts +21 -0
  582. package/dist/artifacts/IClientArtifactsProvider.d.ts.map +1 -0
  583. package/dist/artifacts/IClientArtifactsProvider.js +4 -0
  584. package/dist/artifacts/IClientArtifactsProvider.js.map +1 -0
  585. package/dist/artifacts/index.d.ts +3 -0
  586. package/dist/artifacts/index.d.ts.map +1 -0
  587. package/dist/artifacts/index.js +4 -0
  588. package/dist/artifacts/index.js.map +1 -0
  589. package/dist/connection/ChronicleConnection.d.ts +117 -0
  590. package/dist/connection/ChronicleConnection.d.ts.map +1 -0
  591. package/dist/connection/ChronicleConnection.js +194 -0
  592. package/dist/connection/ChronicleConnection.js.map +1 -0
  593. package/dist/connection/ChronicleConnectionString.d.ts +2 -0
  594. package/dist/connection/ChronicleConnectionString.d.ts.map +1 -0
  595. package/dist/connection/ChronicleConnectionString.js +4 -0
  596. package/dist/connection/ChronicleConnectionString.js.map +1 -0
  597. package/dist/connection/ChronicleServices.d.ts +2 -0
  598. package/dist/connection/ChronicleServices.d.ts.map +1 -0
  599. package/dist/connection/ChronicleServices.js +4 -0
  600. package/dist/connection/ChronicleServices.js.map +1 -0
  601. package/dist/connection/ConnectionLifecycle.d.ts +41 -0
  602. package/dist/connection/ConnectionLifecycle.d.ts.map +1 -0
  603. package/dist/connection/ConnectionLifecycle.js +66 -0
  604. package/dist/connection/ConnectionLifecycle.js.map +1 -0
  605. package/dist/connection/DateTimeOffset.d.ts +2 -0
  606. package/dist/connection/DateTimeOffset.d.ts.map +1 -0
  607. package/dist/connection/DateTimeOffset.js +4 -0
  608. package/dist/connection/DateTimeOffset.js.map +1 -0
  609. package/dist/connection/Guid.d.ts +2 -0
  610. package/dist/connection/Guid.d.ts.map +1 -0
  611. package/dist/connection/Guid.js +4 -0
  612. package/dist/connection/Guid.js.map +1 -0
  613. package/dist/connection/TokenProvider.d.ts +5 -0
  614. package/dist/connection/TokenProvider.d.ts.map +1 -0
  615. package/dist/connection/TokenProvider.js +4 -0
  616. package/dist/connection/TokenProvider.js.map +1 -0
  617. package/dist/connection/index.d.ts +7 -0
  618. package/dist/connection/index.d.ts.map +1 -0
  619. package/dist/connection/index.js +7 -0
  620. package/dist/connection/index.js.map +1 -0
  621. package/dist/index.d.ts +21 -0
  622. package/dist/index.d.ts.map +1 -0
  623. package/dist/index.js +21 -0
  624. package/dist/index.js.map +1 -0
  625. package/dist/tsconfig.tsbuildinfo +1 -0
  626. package/dist/types/DecoratorType.d.ts +20 -0
  627. package/dist/types/DecoratorType.d.ts.map +1 -0
  628. package/dist/types/DecoratorType.js +23 -0
  629. package/dist/types/DecoratorType.js.map +1 -0
  630. package/dist/types/TypeDiscoverer.d.ts +54 -0
  631. package/dist/types/TypeDiscoverer.d.ts.map +1 -0
  632. package/dist/types/TypeDiscoverer.js +91 -0
  633. package/dist/types/TypeDiscoverer.js.map +1 -0
  634. package/dist/types/TypeIntrospector.d.ts +30 -0
  635. package/dist/types/TypeIntrospector.d.ts.map +1 -0
  636. package/dist/types/TypeIntrospector.js +154 -0
  637. package/dist/types/TypeIntrospector.js.map +1 -0
  638. package/dist/types/index.d.ts +4 -0
  639. package/dist/types/index.d.ts.map +1 -0
  640. package/dist/types/index.js +6 -0
  641. package/dist/types/index.js.map +1 -0
  642. package/index.ts +24 -0
  643. package/package.json +38 -0
  644. package/types/DecoratorType.ts +28 -0
  645. package/types/TypeDiscoverer.ts +109 -0
  646. package/types/TypeIntrospector.ts +176 -0
  647. package/types/index.ts +6 -0
@@ -0,0 +1,75 @@
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 { Constructor } from '@cratis/fundamentals';
6
+ import { ReactorId } from './ReactorId';
7
+ import { DecoratorType, TypeDiscoverer } from '../types';
8
+
9
+ /** Metadata key used to store reactor information on a class. */
10
+ const REACTOR_METADATA_KEY = 'chronicle:reactor';
11
+
12
+ /**
13
+ * Metadata stored on a reactor class.
14
+ */
15
+ export interface ReactorMetadata {
16
+ /** The unique identifier for the reactor. */
17
+ readonly id: ReactorId;
18
+
19
+ /** The optional explicit event sequence identifier. */
20
+ readonly eventSequenceId: string | undefined;
21
+ }
22
+
23
+ /**
24
+ * TypeScript decorator that marks a class as a reactor and associates it with a unique
25
+ * identifier. This is the TypeScript equivalent of the C# `[Reactor]` attribute.
26
+ *
27
+ * Reactors observe events from an event sequence and produce side effects.
28
+ * Method dispatch is by convention: the type of the first parameter of each public method
29
+ * determines which events it handles.
30
+ *
31
+ * @param id - The unique identifier for the reactor. Defaults to the class name if omitted.
32
+ * @param eventSequenceId - Optional explicit event sequence identifier.
33
+ * @returns A class decorator.
34
+ *
35
+ * @example
36
+ * ```typescript
37
+ * @reactor()
38
+ * class ProjectRegisteredNotifier {
39
+ * async projectRegistered(event: ProjectRegistered, context: EventContext): Promise<void> {
40
+ * console.log(`Project '${event.name}' was registered.`);
41
+ * }
42
+ * }
43
+ * ```
44
+ */
45
+ export function reactor(id: string = '', eventSequenceId?: string): ClassDecorator {
46
+ return (target: object) => {
47
+ const constructor = target as Function;
48
+ const reactorId = new ReactorId(id || constructor.name);
49
+ const metadata: ReactorMetadata = { id: reactorId, eventSequenceId };
50
+ Reflect.defineMetadata(REACTOR_METADATA_KEY, metadata, target);
51
+ TypeDiscoverer.default.register(
52
+ DecoratorType.Reactor,
53
+ constructor as Constructor,
54
+ reactorId.value
55
+ );
56
+ };
57
+ }
58
+
59
+ /**
60
+ * Gets the {@link ReactorMetadata} associated with a class decorated with {@link reactor}.
61
+ * @param target - The class constructor to retrieve the metadata for.
62
+ * @returns The associated ReactorMetadata, or undefined if not decorated.
63
+ */
64
+ export function getReactorMetadata(target: Function): ReactorMetadata | undefined {
65
+ return Reflect.getMetadata(REACTOR_METADATA_KEY, target);
66
+ }
67
+
68
+ /**
69
+ * Checks whether a class has been decorated with {@link reactor}.
70
+ * @param target - The class constructor to check.
71
+ * @returns True if the class has a reactor decorator; false otherwise.
72
+ */
73
+ export function isReactor(target: Function): boolean {
74
+ return Reflect.hasMetadata(REACTOR_METADATA_KEY, target);
75
+ }
@@ -0,0 +1,14 @@
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
+ /**
5
+ * Unique identifier for a read model.
6
+ */
7
+ export class ReadModelId {
8
+ constructor(readonly value: string) {}
9
+
10
+ /** @inheritdoc */
11
+ toString(): string {
12
+ return this.value;
13
+ }
14
+ }
@@ -0,0 +1,6 @@
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
+ export { ReadModelId } from './ReadModelId';
5
+ export { readModel, getReadModelMetadata, isReadModel } from './readModel';
6
+ export type { ReadModelMetadata } from './readModel';
@@ -0,0 +1,89 @@
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 { Constructor } from '@cratis/fundamentals';
6
+ import { ReadModelId } from './ReadModelId';
7
+ import { DecoratorType, TypeDiscoverer, TypeIntrospector } from '../types';
8
+ import { JsonSchema, JsonSchemaGenerator } from '../Schemas';
9
+
10
+ /** Metadata key used to store read model information on a class. */
11
+ const READ_MODEL_METADATA_KEY = 'chronicle:readModel';
12
+
13
+ /**
14
+ * Metadata stored on a read model class.
15
+ */
16
+ export interface ReadModelMetadata {
17
+ /** The unique identifier for the read model. */
18
+ readonly id: ReadModelId;
19
+
20
+ /** The reflected members and their runtime types. */
21
+ readonly members: ReadonlyMap<string, Function | undefined>;
22
+
23
+ /** The generated JSON schema for the read model. */
24
+ readonly schema: JsonSchema;
25
+ }
26
+
27
+ /**
28
+ * TypeScript decorator that marks a class as a read model and captures reflection metadata.
29
+ * @param id - The unique identifier for the read model. Defaults to the class name if omitted.
30
+ * @returns A class decorator.
31
+ */
32
+ export function readModel(id: string = ''): ClassDecorator {
33
+ return (target: object) => {
34
+ const constructor = target as Function;
35
+ const readModelId = new ReadModelId(id || constructor.name);
36
+ trackInstanceProperties(constructor);
37
+ const members = TypeIntrospector.getMembers(constructor);
38
+ const metadata: ReadModelMetadata = {
39
+ id: readModelId,
40
+ members,
41
+ schema: JsonSchemaGenerator.generate(constructor, members)
42
+ };
43
+ Reflect.defineMetadata(READ_MODEL_METADATA_KEY, metadata, target);
44
+ TypeDiscoverer.default.register(
45
+ DecoratorType.ReadModel,
46
+ constructor as Constructor,
47
+ readModelId.value
48
+ );
49
+ };
50
+ }
51
+
52
+ function trackInstanceProperties(constructor: Function): void {
53
+ const instance = tryCreateInstance(constructor);
54
+ if (!instance || typeof instance !== 'object') {
55
+ return;
56
+ }
57
+
58
+ for (const propertyName of Object.keys(instance as Record<string, unknown>)) {
59
+ TypeIntrospector.trackProperty(constructor, propertyName);
60
+ }
61
+ }
62
+
63
+ function tryCreateInstance(constructor: Function): unknown {
64
+ try {
65
+ const parameterCount = constructor.length;
66
+ const parameters = Array.from({ length: parameterCount }, () => undefined);
67
+ return Reflect.construct(constructor as new (...args: unknown[]) => unknown, parameters);
68
+ } catch {
69
+ return undefined;
70
+ }
71
+ }
72
+
73
+ /**
74
+ * Gets the {@link ReadModelMetadata} associated with a class decorated with {@link readModel}.
75
+ * @param target - The class constructor to retrieve metadata for.
76
+ * @returns The associated metadata, or undefined if not decorated.
77
+ */
78
+ export function getReadModelMetadata(target: Function): ReadModelMetadata | undefined {
79
+ return Reflect.getMetadata(READ_MODEL_METADATA_KEY, target);
80
+ }
81
+
82
+ /**
83
+ * Checks whether a class has been decorated with {@link readModel}.
84
+ * @param target - The class constructor to check.
85
+ * @returns True if the class has a read model decorator; false otherwise.
86
+ */
87
+ export function isReadModel(target: Function): boolean {
88
+ return Reflect.hasMetadata(READ_MODEL_METADATA_KEY, target);
89
+ }
@@ -0,0 +1,19 @@
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
+ /**
5
+ * Defines a system to work with reducers, including discovery and registration with the Kernel.
6
+ */
7
+ export interface IReducers {
8
+ /**
9
+ * Discovers all reducers from the registered client artifacts.
10
+ * @returns A promise that resolves when discovery is complete.
11
+ */
12
+ discover(): Promise<void>;
13
+
14
+ /**
15
+ * Registers all discovered reducers with the Chronicle Kernel and starts observation.
16
+ * @returns A promise that resolves when registration is complete.
17
+ */
18
+ register(): Promise<void>;
19
+ }
@@ -0,0 +1,14 @@
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
+ /**
5
+ * Unique identifier for a reducer.
6
+ */
7
+ export class ReducerId {
8
+ constructor(readonly value: string) {}
9
+
10
+ /** @inheritdoc */
11
+ toString(): string {
12
+ return this.value;
13
+ }
14
+ }
@@ -0,0 +1,322 @@
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 { diag } from '@opentelemetry/api';
6
+ import { Constructor } from '@cratis/fundamentals';
7
+ import { ObservationState, ReducerMessage } from '@cratis/chronicle.contracts';
8
+ import { IClientArtifactsProvider } from '../artifacts';
9
+ import { ChronicleConnection } from '../connection';
10
+ import { ConnectionLifecycle } from '../connection/ConnectionLifecycle';
11
+ import { getEventTypeMetadata } from '../Events/eventTypeDecorator';
12
+ import { EventSequenceId } from '../EventSequences/EventSequenceId';
13
+ import { IReducers } from './IReducers';
14
+ import { getReducerMetadata } from './reducer';
15
+
16
+ /** Expression used to partition reducer observations by event source ID. */
17
+ const EVENT_SOURCE_ID_KEY = '$eventSourceId';
18
+
19
+ /** Sentinel sequence number sent back when no event was successfully processed. */
20
+ const SEQUENCE_NUMBER_UNAVAILABLE = 4294967295;
21
+
22
+ interface EventTypeEntry {
23
+ readonly id: string;
24
+ readonly generation: number;
25
+ readonly methodName: string;
26
+ }
27
+
28
+ /**
29
+ * A push-based async queue that implements {@link AsyncIterable} for use with nice-grpc
30
+ * bidirectional streaming. Values pushed via {@link send} are yielded in order to
31
+ * any consumer that iterates the queue.
32
+ */
33
+ class AsyncQueue<T> {
34
+ private readonly _queue: T[] = [];
35
+ private _resolve: ((result: IteratorResult<T, undefined>) => void) | undefined = undefined;
36
+ private _done = false;
37
+
38
+ /** Pushes a value into the queue. No-op if the queue has been completed. */
39
+ send(value: T): void {
40
+ if (this._done) return;
41
+ if (this._resolve) {
42
+ const resolve = this._resolve;
43
+ this._resolve = undefined;
44
+ resolve({ value, done: false });
45
+ } else {
46
+ this._queue.push(value);
47
+ }
48
+ }
49
+
50
+ /** Signals that no more values will be pushed, causing consumers to finish iteration. */
51
+ complete(): void {
52
+ this._done = true;
53
+ if (this._resolve) {
54
+ this._resolve({ value: undefined, done: true });
55
+ this._resolve = undefined;
56
+ }
57
+ }
58
+
59
+ [Symbol.asyncIterator](): AsyncIterator<T, undefined> {
60
+ // eslint-disable-next-line @typescript-eslint/no-this-alias
61
+ const self = this;
62
+ return {
63
+ next(): Promise<IteratorResult<T, undefined>> {
64
+ if (self._queue.length > 0) {
65
+ return Promise.resolve({ value: self._queue.shift()!, done: false });
66
+ }
67
+ if (self._done) {
68
+ return Promise.resolve({ value: undefined, done: true });
69
+ }
70
+ return new Promise(resolve => {
71
+ self._resolve = resolve as (result: IteratorResult<T, undefined>) => void;
72
+ });
73
+ },
74
+ return(): Promise<IteratorResult<T, undefined>> {
75
+ self._done = true;
76
+ if (self._resolve) {
77
+ self._resolve({ value: undefined, done: true });
78
+ self._resolve = undefined;
79
+ }
80
+ return Promise.resolve({ value: undefined, done: true });
81
+ }
82
+ };
83
+ }
84
+ }
85
+
86
+ /**
87
+ * Implements {@link IReducers}, managing discovery and registration of reducers
88
+ * with the Chronicle Kernel via bidirectional gRPC streaming.
89
+ */
90
+ export class Reducers implements IReducers {
91
+ private readonly _logger = diag.createComponentLogger({ namespace: '@cratis/chronicle/Reducers' });
92
+ private readonly _lifecycle: ConnectionLifecycle;
93
+ private readonly _reducers = new Map<string, Constructor>();
94
+ private readonly _queues = new Map<string, AsyncQueue<ReducerMessage>>();
95
+ private _registered = false;
96
+
97
+ /**
98
+ * Creates a new {@link Reducers} instance.
99
+ * @param _clientArtifacts - Provider for discovered client artifact types.
100
+ * @param _connection - The Chronicle gRPC connection.
101
+ * @param _eventStoreName - The name of the event store.
102
+ * @param _namespace - The namespace within the event store.
103
+ * @param lifecycle - The connection lifecycle used to react to disconnect events.
104
+ */
105
+ constructor(
106
+ private readonly _clientArtifacts: IClientArtifactsProvider,
107
+ private readonly _connection: ChronicleConnection,
108
+ private readonly _eventStoreName: string,
109
+ private readonly _namespace: string,
110
+ lifecycle: ConnectionLifecycle
111
+ ) {
112
+ this._lifecycle = lifecycle;
113
+ lifecycle.onDisconnected(async () => {
114
+ this._logger.info('Disconnected — stopping all reducer observations');
115
+ this._registered = false;
116
+ this.disconnectAll();
117
+ });
118
+ }
119
+
120
+ /** @inheritdoc */
121
+ async discover(): Promise<void> {
122
+ this._reducers.clear();
123
+ for (const type of this._clientArtifacts.reducers) {
124
+ const metadata = getReducerMetadata(type);
125
+ if (metadata) {
126
+ this._reducers.set(metadata.id.value, type);
127
+ this._logger.debug('Discovered reducer', { reducerId: metadata.id.value, type: (type as Function).name });
128
+ }
129
+ }
130
+ }
131
+
132
+ /** @inheritdoc */
133
+ async register(): Promise<void> {
134
+ if (this._registered) {
135
+ return;
136
+ }
137
+
138
+ if (this._reducers.size === 0) {
139
+ await this.discover();
140
+ }
141
+
142
+ this._logger.info('Registering reducers', { count: this._reducers.size });
143
+ for (const [id, reducerType] of this._reducers) {
144
+ this.startObservation(id, reducerType);
145
+ }
146
+
147
+ this._registered = true;
148
+ }
149
+
150
+ private startObservation(id: string, reducerType: Constructor): void {
151
+ const metadata = getReducerMetadata(reducerType)!;
152
+ const eventSequenceId = metadata.eventSequenceId ?? EventSequenceId.eventLog.value;
153
+ const eventTypes = this.getEventTypesFor(reducerType);
154
+ const readModelName = (reducerType as Function).name;
155
+
156
+ this._logger.info('Starting reducer observation', {
157
+ reducerId: id,
158
+ eventSequenceId,
159
+ readModel: readModelName,
160
+ handlerCount: eventTypes.length,
161
+ handlers: eventTypes.map(e => e.methodName)
162
+ });
163
+
164
+ this.observeReducer(id, reducerType, eventSequenceId, eventTypes, readModelName).catch(err => {
165
+ this._logger.error('Reducer observation loop exited with error', { reducerId: id, error: String(err) });
166
+ });
167
+ }
168
+
169
+ private async observeReducer(
170
+ id: string,
171
+ reducerType: Constructor,
172
+ eventSequenceId: string,
173
+ eventTypes: EventTypeEntry[],
174
+ readModelName: string
175
+ ): Promise<void> {
176
+ const queue = new AsyncQueue<ReducerMessage>();
177
+ this._queues.set(id, queue);
178
+
179
+ queue.send({
180
+ Content: {
181
+ Value0: {
182
+ ConnectionId: this._lifecycle.connectionId,
183
+ EventStore: this._eventStoreName,
184
+ Namespace: this._namespace,
185
+ Reducer: {
186
+ ReducerId: id,
187
+ EventSequenceId: eventSequenceId,
188
+ EventTypes: eventTypes.map(et => ({
189
+ EventType: { Id: et.id, Generation: et.generation, Tombstone: false },
190
+ Key: EVENT_SOURCE_ID_KEY
191
+ })),
192
+ ReadModel: readModelName,
193
+ IsActive: true,
194
+ Sink: { TypeId: { lo: 0, hi: 0 }, ConfigurationId: undefined },
195
+ Tags: [],
196
+ Filters: {
197
+ FilterTags: [],
198
+ EventSourceType: '',
199
+ EventStreamType: 'All'
200
+ }
201
+ }
202
+ },
203
+ Value1: undefined
204
+ }
205
+ });
206
+
207
+ try {
208
+ const reducerInstance = new (reducerType as new () => Record<string, Function>)();
209
+
210
+ for await (const operation of this._connection.reducers.observe(queue)) {
211
+ let lastSuccessfullyObservedEvent = SEQUENCE_NUMBER_UNAVAILABLE;
212
+ let state = ObservationState.Success;
213
+ const exceptionMessages: string[] = [];
214
+ let exceptionStackTrace = '';
215
+ let readModelState: string | undefined;
216
+
217
+ this._logger.debug('Received reduce operation', {
218
+ reducerId: id,
219
+ partition: operation.Partition,
220
+ count: operation.Events.length,
221
+ hasInitialState: operation.InitialState !== ''
222
+ });
223
+
224
+ let currentState: unknown = operation.InitialState
225
+ ? JSON.parse(operation.InitialState) as unknown
226
+ : undefined;
227
+
228
+ for (const event of operation.Events) {
229
+ try {
230
+ const eventTypeId = event.Context?.EventType?.Id;
231
+ if (!eventTypeId) {
232
+ this._logger.warn('Event missing event type context', { reducerId: id });
233
+ continue;
234
+ }
235
+
236
+ const entry = eventTypes.find(et => et.id === eventTypeId);
237
+ if (!entry) {
238
+ this._logger.debug('No handler registered for event type — skipping', { reducerId: id, eventTypeId });
239
+ lastSuccessfullyObservedEvent = event.Context!.SequenceNumber;
240
+ continue;
241
+ }
242
+
243
+ const content = JSON.parse(event.Content) as Record<string, unknown>;
244
+
245
+ this._logger.info('Invoking reducer handler', {
246
+ reducerId: id,
247
+ method: entry.methodName,
248
+ sequenceNumber: event.Context!.SequenceNumber,
249
+ eventTypeId,
250
+ hasState: currentState !== undefined
251
+ });
252
+
253
+ currentState = await reducerInstance[entry.methodName](content, currentState);
254
+ lastSuccessfullyObservedEvent = event.Context!.SequenceNumber;
255
+ } catch (err) {
256
+ this._logger.error('Error handling event in reducer', { reducerId: id, error: String(err) });
257
+ exceptionMessages.push(String(err));
258
+ exceptionStackTrace = err instanceof Error ? (err.stack ?? '') : '';
259
+ state = ObservationState.Failed;
260
+ break;
261
+ }
262
+ }
263
+
264
+ if (state === ObservationState.Success && currentState !== undefined) {
265
+ readModelState = JSON.stringify(currentState);
266
+ }
267
+
268
+ queue.send({
269
+ Content: {
270
+ Value0: undefined,
271
+ Value1: {
272
+ Partition: operation.Partition,
273
+ State: state,
274
+ LastSuccessfulObservation: lastSuccessfullyObservedEvent,
275
+ ExceptionMessages: exceptionMessages,
276
+ ExceptionStackTrace: exceptionStackTrace,
277
+ ReadModelState: readModelState ?? ''
278
+ }
279
+ }
280
+ });
281
+ }
282
+ } catch (err) {
283
+ if (!this._queues.has(id)) {
284
+ this._logger.debug('Reducer observation stream closed cleanly', { reducerId: id });
285
+ } else {
286
+ this._logger.error('Reducer observation stream ended unexpectedly', { reducerId: id, error: String(err) });
287
+ }
288
+ } finally {
289
+ this._queues.delete(id);
290
+ }
291
+ }
292
+
293
+ private getEventTypesFor(reducerType: Constructor): EventTypeEntry[] {
294
+ const proto = reducerType.prototype as Record<string, unknown>;
295
+ const entries: EventTypeEntry[] = [];
296
+
297
+ for (const eventTypeClass of this._clientArtifacts.eventTypes) {
298
+ const eventTypeMeta = getEventTypeMetadata(eventTypeClass);
299
+ if (!eventTypeMeta) continue;
300
+
301
+ const className = (eventTypeClass as Function).name;
302
+ const methodName = className.charAt(0).toLowerCase() + className.slice(1);
303
+
304
+ if (typeof proto[methodName] === 'function') {
305
+ entries.push({
306
+ id: eventTypeMeta.eventType.id.value,
307
+ generation: eventTypeMeta.eventType.generation.value,
308
+ methodName
309
+ });
310
+ }
311
+ }
312
+
313
+ return entries;
314
+ }
315
+
316
+ private disconnectAll(): void {
317
+ for (const queue of this._queues.values()) {
318
+ queue.complete();
319
+ }
320
+ this._queues.clear();
321
+ }
322
+ }
@@ -0,0 +1,8 @@
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
+ export { ReducerId } from './ReducerId';
5
+ export { reducer, getReducerMetadata, isReducer } from './reducer';
6
+ export type { ReducerMetadata } from './reducer';
7
+ export type { IReducers } from './IReducers';
8
+ export { Reducers } from './Reducers';
@@ -0,0 +1,87 @@
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 { Constructor } from '@cratis/fundamentals';
6
+ import { ReducerId } from './ReducerId';
7
+ import { DecoratorType, TypeDiscoverer } from '../types';
8
+
9
+ /** Metadata key used to store reducer information on a class. */
10
+ const REDUCER_METADATA_KEY = 'chronicle:reducer';
11
+
12
+ /**
13
+ * Metadata stored on a reducer class.
14
+ */
15
+ export interface ReducerMetadata {
16
+ /** The unique identifier for the reducer. */
17
+ readonly id: ReducerId;
18
+
19
+ /** The optional explicit event sequence identifier. */
20
+ readonly eventSequenceId: string | undefined;
21
+
22
+ /** The optional read model type produced by the reducer. */
23
+ readonly readModel: Constructor | undefined;
24
+ }
25
+
26
+ /**
27
+ * TypeScript decorator that marks a class as a reducer and associates it with a unique
28
+ * identifier. This is the TypeScript equivalent of the C# `[Reducer]` attribute.
29
+ *
30
+ * Reducers observe events from an event sequence and fold them into a read model.
31
+ * Each handler method receives the event, the current state (or undefined), and an
32
+ * optional context, and returns the new state.
33
+ *
34
+ * @param id - The unique identifier for the reducer. Defaults to the class name if omitted.
35
+ * @param eventSequenceId - Optional explicit event sequence identifier.
36
+ * @param readModel - Optional read model type produced by the reducer.
37
+ * @returns A class decorator.
38
+ *
39
+ * @example
40
+ * ```typescript
41
+ * @reducer()
42
+ * class EmployeeReducer {
43
+ * async employeeHired(event: EmployeeHired, state?: EmployeeState): Promise<EmployeeState> {
44
+ * return { ...state, name: `${event.firstName} ${event.lastName}` };
45
+ * }
46
+ * }
47
+ * ```
48
+ */
49
+ export function reducer(id: string = '', eventSequenceId?: string, readModel?: Constructor): ClassDecorator {
50
+ return (target: object) => {
51
+ const constructor = target as Function;
52
+ const reducerId = new ReducerId(id || constructor.name);
53
+ const metadata: ReducerMetadata = { id: reducerId, eventSequenceId, readModel };
54
+ Reflect.defineMetadata(REDUCER_METADATA_KEY, metadata, target);
55
+ TypeDiscoverer.default.register(
56
+ DecoratorType.Reducer,
57
+ constructor as Constructor,
58
+ reducerId.value
59
+ );
60
+
61
+ if (readModel) {
62
+ TypeDiscoverer.default.register(
63
+ DecoratorType.ReadModel,
64
+ readModel,
65
+ readModel.name
66
+ );
67
+ }
68
+ };
69
+ }
70
+
71
+ /**
72
+ * Gets the {@link ReducerMetadata} associated with a class decorated with {@link reducer}.
73
+ * @param target - The class constructor to retrieve the metadata for.
74
+ * @returns The associated ReducerMetadata, or undefined if not decorated.
75
+ */
76
+ export function getReducerMetadata(target: Function): ReducerMetadata | undefined {
77
+ return Reflect.getMetadata(REDUCER_METADATA_KEY, target);
78
+ }
79
+
80
+ /**
81
+ * Checks whether a class has been decorated with {@link reducer}.
82
+ * @param target - The class constructor to check.
83
+ * @returns True if the class has a reducer decorator; false otherwise.
84
+ */
85
+ export function isReducer(target: Function): boolean {
86
+ return Reflect.hasMetadata(REDUCER_METADATA_KEY, target);
87
+ }
@@ -0,0 +1,18 @@
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
+ /**
5
+ * Represents a JSON Schema object.
6
+ */
7
+ export type JsonSchema = {
8
+ $schema?: string;
9
+ title?: string;
10
+ description?: string;
11
+ type?: 'null' | 'boolean' | 'object' | 'array' | 'number' | 'string' | 'integer';
12
+ format?: string;
13
+ properties?: Record<string, JsonSchema>;
14
+ required?: string[];
15
+ items?: JsonSchema;
16
+ additionalProperties?: boolean | JsonSchema;
17
+ enum?: Array<string | number | boolean | null>;
18
+ };