@cratis/chronicle 6.47.0 → 6.49.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (260) hide show
  1. package/ChronicleClient.ts +3 -0
  2. package/EventStore.ts +10 -3
  3. package/IEventStore.ts +8 -0
  4. package/artifacts/DefaultClientArtifactsProvider.ts +5 -0
  5. package/artifacts/IClientArtifactsProvider.ts +3 -0
  6. package/connection/ChronicleConnection.ts +6 -0
  7. package/connection/ChronicleServices.ts +2 -0
  8. package/connection/ConnectionLifecycle.ts +22 -0
  9. package/dist/ChronicleClient.d.ts.map +1 -1
  10. package/dist/ChronicleClient.js +3 -0
  11. package/dist/ChronicleClient.js.map +1 -1
  12. package/dist/EventStore.d.ts +2 -0
  13. package/dist/EventStore.d.ts.map +1 -1
  14. package/dist/EventStore.js +9 -3
  15. package/dist/EventStore.js.map +1 -1
  16. package/dist/IEventStore.d.ts +7 -0
  17. package/dist/IEventStore.d.ts.map +1 -1
  18. package/dist/artifacts/DefaultClientArtifactsProvider.d.ts +2 -0
  19. package/dist/artifacts/DefaultClientArtifactsProvider.d.ts.map +1 -1
  20. package/dist/artifacts/DefaultClientArtifactsProvider.js +4 -0
  21. package/dist/artifacts/DefaultClientArtifactsProvider.js.map +1 -1
  22. package/dist/artifacts/IClientArtifactsProvider.d.ts +2 -0
  23. package/dist/artifacts/IClientArtifactsProvider.d.ts.map +1 -1
  24. package/dist/connection/ChronicleConnection.d.ts +1 -0
  25. package/dist/connection/ChronicleConnection.d.ts.map +1 -1
  26. package/dist/connection/ChronicleConnection.js +5 -1
  27. package/dist/connection/ChronicleConnection.js.map +1 -1
  28. package/dist/connection/ChronicleServices.d.ts +2 -1
  29. package/dist/connection/ChronicleServices.d.ts.map +1 -1
  30. package/dist/connection/ConnectionLifecycle.d.ts +8 -0
  31. package/dist/connection/ConnectionLifecycle.d.ts.map +1 -1
  32. package/dist/connection/ConnectionLifecycle.js +21 -0
  33. package/dist/connection/ConnectionLifecycle.js.map +1 -1
  34. package/dist/eventSequences/AppendOptions.d.ts +12 -0
  35. package/dist/eventSequences/AppendOptions.d.ts.map +1 -1
  36. package/dist/eventSequences/EventForEventSourceId.d.ts +11 -0
  37. package/dist/eventSequences/EventForEventSourceId.d.ts.map +1 -1
  38. package/dist/eventSequences/EventLog.d.ts +2 -1
  39. package/dist/eventSequences/EventLog.d.ts.map +1 -1
  40. package/dist/eventSequences/EventLog.js +2 -2
  41. package/dist/eventSequences/EventLog.js.map +1 -1
  42. package/dist/eventSequences/EventSequence.d.ts +4 -1
  43. package/dist/eventSequences/EventSequence.d.ts.map +1 -1
  44. package/dist/eventSequences/EventSequence.js +32 -6
  45. package/dist/eventSequences/EventSequence.js.map +1 -1
  46. package/dist/eventSequences/ITransactionalEventSequence.d.ts +5 -2
  47. package/dist/eventSequences/ITransactionalEventSequence.d.ts.map +1 -1
  48. package/dist/eventSequences/TransactionalEventSequence.d.ts +3 -2
  49. package/dist/eventSequences/TransactionalEventSequence.d.ts.map +1 -1
  50. package/dist/eventSequences/TransactionalEventSequence.js +4 -4
  51. package/dist/eventSequences/TransactionalEventSequence.js.map +1 -1
  52. package/dist/eventSequences/resolveEventSourceRouting.d.ts +39 -0
  53. package/dist/eventSequences/resolveEventSourceRouting.d.ts.map +1 -0
  54. package/dist/eventSequences/resolveEventSourceRouting.js +92 -0
  55. package/dist/eventSequences/resolveEventSourceRouting.js.map +1 -0
  56. package/dist/eventSources/ConcurrencyDimensions.d.ts +19 -0
  57. package/dist/eventSources/ConcurrencyDimensions.d.ts.map +1 -0
  58. package/dist/eventSources/ConcurrencyDimensions.js +19 -0
  59. package/dist/eventSources/ConcurrencyDimensions.js.map +1 -0
  60. package/dist/eventSources/DuplicateEventSourceName.d.ts +6 -0
  61. package/dist/eventSources/DuplicateEventSourceName.d.ts.map +1 -0
  62. package/dist/eventSources/DuplicateEventSourceName.js +12 -0
  63. package/dist/eventSources/DuplicateEventSourceName.js.map +1 -0
  64. package/dist/eventSources/DuplicateEventStreamName.d.ts +7 -0
  65. package/dist/eventSources/DuplicateEventStreamName.d.ts.map +1 -0
  66. package/dist/eventSources/DuplicateEventStreamName.js +14 -0
  67. package/dist/eventSources/DuplicateEventStreamName.js.map +1 -0
  68. package/dist/eventSources/EventRoutingContradictsEventSource.d.ts +9 -0
  69. package/dist/eventSources/EventRoutingContradictsEventSource.d.ts.map +1 -0
  70. package/dist/eventSources/EventRoutingContradictsEventSource.js +18 -0
  71. package/dist/eventSources/EventRoutingContradictsEventSource.js.map +1 -0
  72. package/dist/eventSources/EventSourceDefinition.d.ts +20 -0
  73. package/dist/eventSources/EventSourceDefinition.d.ts.map +1 -0
  74. package/dist/eventSources/EventSourceDefinition.js +4 -0
  75. package/dist/eventSources/EventSourceDefinition.js.map +1 -0
  76. package/dist/eventSources/EventSources.d.ts +31 -0
  77. package/dist/eventSources/EventSources.d.ts.map +1 -0
  78. package/dist/eventSources/EventSources.js +90 -0
  79. package/dist/eventSources/EventSources.js.map +1 -0
  80. package/dist/eventSources/EventStreamDefinition.d.ts +13 -0
  81. package/dist/eventSources/EventStreamDefinition.d.ts.map +1 -0
  82. package/dist/eventSources/EventStreamDefinition.js +4 -0
  83. package/dist/eventSources/EventStreamDefinition.js.map +1 -0
  84. package/dist/eventSources/EventStreamDoesNotBelongToEventSource.d.ts +7 -0
  85. package/dist/eventSources/EventStreamDoesNotBelongToEventSource.d.ts.map +1 -0
  86. package/dist/eventSources/EventStreamDoesNotBelongToEventSource.js +14 -0
  87. package/dist/eventSources/EventStreamDoesNotBelongToEventSource.js.map +1 -0
  88. package/dist/eventSources/EventStreamRequiresEventSource.d.ts +6 -0
  89. package/dist/eventSources/EventStreamRequiresEventSource.d.ts.map +1 -0
  90. package/dist/eventSources/EventStreamRequiresEventSource.js +12 -0
  91. package/dist/eventSources/EventStreamRequiresEventSource.js.map +1 -0
  92. package/dist/eventSources/IEventSources.d.ts +27 -0
  93. package/dist/eventSources/IEventSources.d.ts.map +1 -0
  94. package/dist/eventSources/IEventSources.js +4 -0
  95. package/dist/eventSources/IEventSources.js.map +1 -0
  96. package/dist/eventSources/ResolvedEventRouting.d.ts +37 -0
  97. package/dist/eventSources/ResolvedEventRouting.d.ts.map +1 -0
  98. package/dist/eventSources/ResolvedEventRouting.js +60 -0
  99. package/dist/eventSources/ResolvedEventRouting.js.map +1 -0
  100. package/dist/eventSources/UnknownEventSource.d.ts +6 -0
  101. package/dist/eventSources/UnknownEventSource.d.ts.map +1 -0
  102. package/dist/eventSources/UnknownEventSource.js +12 -0
  103. package/dist/eventSources/UnknownEventSource.js.map +1 -0
  104. package/dist/eventSources/eventSource.d.ts +60 -0
  105. package/dist/eventSources/eventSource.d.ts.map +1 -0
  106. package/dist/eventSources/eventSource.js +72 -0
  107. package/dist/eventSources/eventSource.js.map +1 -0
  108. package/dist/eventSources/index.d.ts +17 -0
  109. package/dist/eventSources/index.d.ts.map +1 -0
  110. package/dist/eventSources/index.js +13 -0
  111. package/dist/eventSources/index.js.map +1 -0
  112. package/dist/events/EventContext.d.ts +5 -0
  113. package/dist/events/EventContext.d.ts.map +1 -1
  114. package/dist/events/WireEventContext.d.ts +2 -0
  115. package/dist/events/WireEventContext.d.ts.map +1 -1
  116. package/dist/events/toClientEventContext.d.ts.map +1 -1
  117. package/dist/events/toClientEventContext.js +1 -0
  118. package/dist/events/toClientEventContext.js.map +1 -1
  119. package/dist/index.d.ts +3 -1
  120. package/dist/index.d.ts.map +1 -1
  121. package/dist/index.js +3 -1
  122. package/dist/index.js.map +1 -1
  123. package/dist/projections/eventContextPropertyExpression.d.ts.map +1 -1
  124. package/dist/projections/eventContextPropertyExpression.js +1 -0
  125. package/dist/projections/eventContextPropertyExpression.js.map +1 -1
  126. package/dist/readModels/IReadModelWatcher.d.ts +30 -0
  127. package/dist/readModels/IReadModelWatcher.d.ts.map +1 -0
  128. package/dist/readModels/IReadModelWatcher.js +4 -0
  129. package/dist/readModels/IReadModelWatcher.js.map +1 -0
  130. package/dist/readModels/IReadModels.d.ts +16 -2
  131. package/dist/readModels/IReadModels.d.ts.map +1 -1
  132. package/dist/readModels/ReadModelChangeContext.d.ts +9 -0
  133. package/dist/readModels/ReadModelChangeContext.d.ts.map +1 -0
  134. package/dist/readModels/ReadModelChangeContext.js +4 -0
  135. package/dist/readModels/ReadModelChangeContext.js.map +1 -0
  136. package/dist/readModels/ReadModelChangeType.d.ts +7 -0
  137. package/dist/readModels/ReadModelChangeType.d.ts.map +1 -0
  138. package/dist/readModels/ReadModelChangeType.js +10 -0
  139. package/dist/readModels/ReadModelChangeType.js.map +1 -0
  140. package/dist/readModels/ReadModelChangeset.d.ts +6 -0
  141. package/dist/readModels/ReadModelChangeset.d.ts.map +1 -1
  142. package/dist/readModels/ReadModelWatchOptions.d.ts +19 -0
  143. package/dist/readModels/ReadModelWatchOptions.d.ts.map +1 -0
  144. package/dist/readModels/ReadModelWatchOptions.js +4 -0
  145. package/dist/readModels/ReadModelWatchOptions.js.map +1 -0
  146. package/dist/readModels/ReadModelWatcher.d.ts +52 -0
  147. package/dist/readModels/ReadModelWatcher.d.ts.map +1 -0
  148. package/dist/readModels/ReadModelWatcher.js +276 -0
  149. package/dist/readModels/ReadModelWatcher.js.map +1 -0
  150. package/dist/readModels/ReadModels.d.ts +11 -1
  151. package/dist/readModels/ReadModels.d.ts.map +1 -1
  152. package/dist/readModels/ReadModels.js +47 -11
  153. package/dist/readModels/ReadModels.js.map +1 -1
  154. package/dist/readModels/for_ReadModelWatcher/given/a_kernel_stream.d.ts +15 -0
  155. package/dist/readModels/for_ReadModelWatcher/given/a_kernel_stream.d.ts.map +1 -0
  156. package/dist/readModels/for_ReadModelWatcher/given/a_kernel_stream.js +45 -0
  157. package/dist/readModels/for_ReadModelWatcher/given/a_kernel_stream.js.map +1 -0
  158. package/dist/readModels/for_ReadModelWatcher/given/a_watched_read_model.d.ts +21 -0
  159. package/dist/readModels/for_ReadModelWatcher/given/a_watched_read_model.d.ts.map +1 -0
  160. package/dist/readModels/for_ReadModelWatcher/given/a_watched_read_model.js +35 -0
  161. package/dist/readModels/for_ReadModelWatcher/given/a_watched_read_model.js.map +1 -0
  162. package/dist/readModels/index.d.ts +4 -0
  163. package/dist/readModels/index.d.ts.map +1 -1
  164. package/dist/readModels/index.js +1 -0
  165. package/dist/readModels/index.js.map +1 -1
  166. package/dist/testing/ReactorScenario.d.ts.map +1 -1
  167. package/dist/testing/ReactorScenario.js +2 -0
  168. package/dist/testing/ReactorScenario.js.map +1 -1
  169. package/dist/testing/projections/ProjectionReadModelProcessor.d.ts.map +1 -1
  170. package/dist/testing/projections/ProjectionReadModelProcessor.js +2 -1
  171. package/dist/testing/projections/ProjectionReadModelProcessor.js.map +1 -1
  172. package/dist/transactions/IUnitOfWork.d.ts +3 -1
  173. package/dist/transactions/IUnitOfWork.d.ts.map +1 -1
  174. package/dist/transactions/TransactionalEventRouting.d.ts +12 -0
  175. package/dist/transactions/TransactionalEventRouting.d.ts.map +1 -0
  176. package/dist/transactions/TransactionalEventRouting.js +4 -0
  177. package/dist/transactions/TransactionalEventRouting.js.map +1 -0
  178. package/dist/transactions/UnitOfWork.d.ts +2 -1
  179. package/dist/transactions/UnitOfWork.d.ts.map +1 -1
  180. package/dist/transactions/UnitOfWork.js +11 -2
  181. package/dist/transactions/UnitOfWork.js.map +1 -1
  182. package/dist/transactions/index.d.ts +1 -0
  183. package/dist/transactions/index.d.ts.map +1 -1
  184. package/dist/tsconfig.tsbuildinfo +1 -1
  185. package/dist/types/DecoratorType.d.ts +3 -1
  186. package/dist/types/DecoratorType.d.ts.map +1 -1
  187. package/dist/types/DecoratorType.js +2 -0
  188. package/dist/types/DecoratorType.js.map +1 -1
  189. package/eventSequences/AppendOptions.ts +14 -0
  190. package/eventSequences/EventForEventSourceId.ts +13 -0
  191. package/eventSequences/EventLog.ts +4 -2
  192. package/eventSequences/EventSequence.ts +33 -6
  193. package/eventSequences/ITransactionalEventSequence.ts +5 -2
  194. package/eventSequences/TransactionalEventSequence.ts +5 -4
  195. package/eventSequences/resolveEventSourceRouting.ts +125 -0
  196. package/eventSources/ConcurrencyDimensions.ts +26 -0
  197. package/eventSources/DuplicateEventSourceName.ts +10 -0
  198. package/eventSources/DuplicateEventStreamName.ts +10 -0
  199. package/eventSources/EventRoutingContradictsEventSource.ts +10 -0
  200. package/eventSources/EventSourceDefinition.ts +27 -0
  201. package/eventSources/EventSources.ts +93 -0
  202. package/eventSources/EventStreamDefinition.ts +18 -0
  203. package/eventSources/EventStreamDoesNotBelongToEventSource.ts +10 -0
  204. package/eventSources/EventStreamRequiresEventSource.ts +10 -0
  205. package/eventSources/IEventSources.ts +33 -0
  206. package/eventSources/ResolvedEventRouting.ts +78 -0
  207. package/eventSources/UnknownEventSource.ts +10 -0
  208. package/eventSources/eventSource.ts +116 -0
  209. package/eventSources/for_EventSources/against_a_kernel/when_appending_through_registered_sources.integration.spec.ts +106 -0
  210. package/eventSources/for_EventSources/when_appending_through_a_definition.spec.ts +190 -0
  211. package/eventSources/for_EventSources/when_batch_requires_differing_guards.spec.ts +139 -0
  212. package/eventSources/for_EventSources/when_discovering_and_registering.spec.ts +94 -0
  213. package/eventSources/index.ts +19 -0
  214. package/events/EventContext.ts +6 -0
  215. package/events/WireEventContext.ts +2 -0
  216. package/events/for_EventContext/with_event_source.spec.ts +22 -0
  217. package/events/toClientEventContext.ts +1 -0
  218. package/for_ChronicleClient/when_reconnecting/with_waiting_read_model_watchers.spec.ts +117 -0
  219. package/for_EventStore/when_implementing_a_legacy_event_store.spec.ts +19 -0
  220. package/index.ts +3 -0
  221. package/jobs/for_Jobs/against_a_kernel/when_managing_a_replay_job.integration.spec.ts +24 -4
  222. package/package.json +3 -3
  223. package/projections/eventContextPropertyExpression.ts +2 -1
  224. package/reactors/for_Reactors/against_a_kernel/when_replaying_reactors_with_once_only_handlers.integration.spec.ts +27 -8
  225. package/readModels/IReadModelWatcher.ts +35 -0
  226. package/readModels/IReadModels.ts +17 -2
  227. package/readModels/ReadModelChangeContext.ts +11 -0
  228. package/readModels/ReadModelChangeType.ts +9 -0
  229. package/readModels/ReadModelChangeset.ts +9 -0
  230. package/readModels/ReadModelWatchOptions.ts +23 -0
  231. package/readModels/ReadModelWatcher.ts +271 -0
  232. package/readModels/ReadModels.ts +60 -11
  233. package/readModels/for_ReadModelWatcher/against_a_kernel/when_watching_changes.integration.spec.ts +104 -0
  234. package/readModels/for_ReadModelWatcher/given/a_kernel_stream.ts +50 -0
  235. package/readModels/for_ReadModelWatcher/given/a_watched_read_model.ts +37 -0
  236. package/readModels/for_ReadModelWatcher/watchCompatibility.standard.spec.ts +29 -0
  237. package/readModels/for_ReadModelWatcher/when_a_stream_cannot_recover.spec.ts +86 -0
  238. package/readModels/for_ReadModelWatcher/when_applying_backpressure.spec.ts +80 -0
  239. package/readModels/for_ReadModelWatcher/when_failing_with_buffered_changes.spec.ts +39 -0
  240. package/readModels/for_ReadModelWatcher/when_not_opting_into_resume.spec.ts +62 -0
  241. package/readModels/for_ReadModelWatcher/when_notifying_resubscription.spec.ts +128 -0
  242. package/readModels/for_ReadModelWatcher/when_opting_into_overflow.spec.ts +39 -0
  243. package/readModels/for_ReadModelWatcher/when_receiving_changes.spec.ts +69 -0
  244. package/readModels/for_ReadModelWatcher/when_reconnecting.spec.ts +99 -0
  245. package/readModels/for_ReadModelWatcher/when_reconnecting_during_conversion.spec.ts +84 -0
  246. package/readModels/for_ReadModelWatcher/when_recovering_a_stream.spec.ts +106 -0
  247. package/readModels/for_ReadModelWatcher/when_stopping.spec.ts +85 -0
  248. package/readModels/for_ReadModelWatcher/when_subscribing.spec.ts +62 -0
  249. package/readModels/for_ReadModels/when_watching.spec.ts +85 -0
  250. package/readModels/index.ts +4 -0
  251. package/testing/EventScenario.event-sources.spec.ts +34 -0
  252. package/testing/ReactorScenario.spec.ts +18 -1
  253. package/testing/ReactorScenario.ts +1 -0
  254. package/testing/projections/ProjectionReadModelProcessor.ts +2 -1
  255. package/transactions/IUnitOfWork.ts +3 -1
  256. package/transactions/TransactionalEventRouting.ts +16 -0
  257. package/transactions/UnitOfWork.ts +13 -2
  258. package/transactions/for_UnitOfWork/when_committing_events_with_event_source_routing.spec.ts +41 -0
  259. package/transactions/index.ts +1 -0
  260. package/types/DecoratorType.ts +4 -1
@@ -0,0 +1,9 @@
1
+ /** The triggering event metadata available on the kernel's read model change stream. */
2
+ export interface ReadModelChangeContext {
3
+ readonly eventStore: string;
4
+ readonly namespace: string;
5
+ readonly sequenceNumber: bigint;
6
+ readonly correlationId?: string;
7
+ readonly occurred?: Date;
8
+ }
9
+ //# sourceMappingURL=ReadModelChangeContext.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ReadModelChangeContext.d.ts","sourceRoot":"","sources":["../../readModels/ReadModelChangeContext.ts"],"names":[],"mappings":"AAGA,wFAAwF;AACxF,MAAM,WAAW,sBAAsB;IACnC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC;CAC5B"}
@@ -0,0 +1,4 @@
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
+ export {};
4
+ //# sourceMappingURL=ReadModelChangeContext.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ReadModelChangeContext.js","sourceRoot":"","sources":["../../readModels/ReadModelChangeContext.ts"],"names":[],"mappings":"AAAA,6CAA6C;AAC7C,qGAAqG"}
@@ -0,0 +1,7 @@
1
+ /** The kind of change to a read model instance. */
2
+ export declare enum ReadModelChangeType {
3
+ Added = 0,
4
+ Modified = 1,
5
+ Removed = 2
6
+ }
7
+ //# sourceMappingURL=ReadModelChangeType.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ReadModelChangeType.d.ts","sourceRoot":"","sources":["../../readModels/ReadModelChangeType.ts"],"names":[],"mappings":"AAGA,mDAAmD;AACnD,oBAAY,mBAAmB;IAC3B,KAAK,IAAI;IACT,QAAQ,IAAI;IACZ,OAAO,IAAI;CACd"}
@@ -0,0 +1,10 @@
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
+ /** The kind of change to a read model instance. */
4
+ export var ReadModelChangeType;
5
+ (function (ReadModelChangeType) {
6
+ ReadModelChangeType[ReadModelChangeType["Added"] = 0] = "Added";
7
+ ReadModelChangeType[ReadModelChangeType["Modified"] = 1] = "Modified";
8
+ ReadModelChangeType[ReadModelChangeType["Removed"] = 2] = "Removed";
9
+ })(ReadModelChangeType || (ReadModelChangeType = {}));
10
+ //# sourceMappingURL=ReadModelChangeType.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ReadModelChangeType.js","sourceRoot":"","sources":["../../readModels/ReadModelChangeType.ts"],"names":[],"mappings":"AAAA,6CAA6C;AAC7C,qGAAqG;AAErG,mDAAmD;AACnD,MAAM,CAAN,IAAY,mBAIX;AAJD,WAAY,mBAAmB;IAC3B,+DAAS,CAAA;IACT,qEAAY,CAAA;IACZ,mEAAW,CAAA;AACf,CAAC,EAJW,mBAAmB,KAAnB,mBAAmB,QAI9B"}
@@ -1,3 +1,5 @@
1
+ import type { ReadModelChangeType } from './ReadModelChangeType.js';
2
+ import type { ReadModelChangeContext } from './ReadModelChangeContext.js';
1
3
  /**
2
4
  * Represents a change observed for a read model.
3
5
  */
@@ -10,5 +12,9 @@ export interface ReadModelChangeset<TReadModel> {
10
12
  readonly readModel: TReadModel;
11
13
  /** Whether the read model was removed. */
12
14
  readonly removed: boolean;
15
+ /** The kind of change. Optional for compatibility with user-created changesets. */
16
+ readonly changeType?: ReadModelChangeType;
17
+ /** Triggering event metadata supplied by the kernel, not a complete event context. */
18
+ readonly changeContext?: ReadModelChangeContext;
13
19
  }
14
20
  //# sourceMappingURL=ReadModelChangeset.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ReadModelChangeset.d.ts","sourceRoot":"","sources":["../../readModels/ReadModelChangeset.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,MAAM,WAAW,kBAAkB,CAAC,UAAU;IAC1C,2CAA2C;IAC3C,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAE3B,0BAA0B;IAC1B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IAErB,oCAAoC;IACpC,QAAQ,CAAC,SAAS,EAAE,UAAU,CAAC;IAE/B,0CAA0C;IAC1C,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;CAC7B"}
1
+ {"version":3,"file":"ReadModelChangeset.d.ts","sourceRoot":"","sources":["../../readModels/ReadModelChangeset.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AACpE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AAE1E;;GAEG;AACH,MAAM,WAAW,kBAAkB,CAAC,UAAU;IAC1C,2CAA2C;IAC3C,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAE3B,0BAA0B;IAC1B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IAErB,oCAAoC;IACpC,QAAQ,CAAC,SAAS,EAAE,UAAU,CAAC;IAE/B,0CAA0C;IAC1C,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAE1B,mFAAmF;IACnF,QAAQ,CAAC,UAAU,CAAC,EAAE,mBAAmB,CAAC;IAE1C,sFAAsF;IACtF,QAAQ,CAAC,aAAa,CAAC,EAAE,sBAAsB,CAAC;CACnD"}
@@ -0,0 +1,19 @@
1
+ /** Options for creating a read model watcher. */
2
+ export interface ReadModelWatchOptions {
3
+ /** Aborting completes iteration and rejects pending readiness. */
4
+ readonly signal?: AbortSignal;
5
+ /**
6
+ * Resume after transport failure or completion. Defaults to false; registering an
7
+ * onResubscribed callback also opts in while at least one callback is registered.
8
+ * Changes missed during an outage are not replayed; refresh your query after resubscription.
9
+ */
10
+ readonly resume?: boolean;
11
+ /**
12
+ * Opt into failing on overflow instead of applying backpressure. Must be a positive safe integer.
13
+ * By default, pause reads at 1,024 buffered changes after subscription acknowledgment.
14
+ * Before each acknowledgment, keep reading to reach the marker; exceeding 1,024 changes
15
+ * (or this explicit limit) fails iteration and pending readiness rather than dropping changes.
16
+ */
17
+ readonly maxBuffered?: number;
18
+ }
19
+ //# sourceMappingURL=ReadModelWatchOptions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ReadModelWatchOptions.d.ts","sourceRoot":"","sources":["../../readModels/ReadModelWatchOptions.ts"],"names":[],"mappings":"AAGA,iDAAiD;AACjD,MAAM,WAAW,qBAAqB;IAClC,kEAAkE;IAClE,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC;IAE9B;;;;OAIG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAE1B;;;;;OAKG;IACH,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CACjC"}
@@ -0,0 +1,4 @@
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
+ export {};
4
+ //# sourceMappingURL=ReadModelWatchOptions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ReadModelWatchOptions.js","sourceRoot":"","sources":["../../readModels/ReadModelWatchOptions.ts"],"names":[],"mappings":"AAAA,6CAA6C;AAC7C,qGAAqG"}
@@ -0,0 +1,52 @@
1
+ import type { ReadModelChangeset as ContractChangeset } from '@cratis/chronicle.contracts';
2
+ import type { ConnectionLifecycle } from '../connection/ConnectionLifecycle.js';
3
+ import type { IReadModelWatcher } from './IReadModelWatcher.js';
4
+ import type { ReadModelChangeset } from './ReadModelChangeset.js';
5
+ import type { ReadModelWatchOptions } from './ReadModelWatchOptions.js';
6
+ /** @internal Owns one cancellable stream per connection generation. */
7
+ export declare class ReadModelWatcher<TReadModel> implements IReadModelWatcher<TReadModel>, AsyncIterableIterator<ReadModelChangeset<TReadModel>> {
8
+ private readonly _open;
9
+ private readonly _convert;
10
+ private readonly _lifecycle?;
11
+ private static readonly _restartDelayMs;
12
+ private readonly _bufferLimit;
13
+ private readonly _failOnOverflow;
14
+ private readonly _resume;
15
+ private _resumeReading?;
16
+ private _subscribed;
17
+ private _resolveSubscribed;
18
+ private _rejectSubscribed;
19
+ private _acknowledged;
20
+ private _hasSubscribed;
21
+ private _delivery;
22
+ private readonly _onResubscribed;
23
+ private _controller?;
24
+ private _stopped;
25
+ private _failed;
26
+ private _failure?;
27
+ private readonly _buffered;
28
+ private _restartTimer?;
29
+ private readonly _waiting;
30
+ private readonly _unsubscribe;
31
+ constructor(_open: (signal: AbortSignal) => AsyncIterable<ContractChangeset>, _convert: (change: ContractChangeset) => Promise<ReadModelChangeset<TReadModel>>, signal: AbortSignal, _lifecycle?: ConnectionLifecycle | undefined, options?: ReadModelWatchOptions);
32
+ get subscribed(): Promise<void>;
33
+ onResubscribed(callback: () => void | Promise<void>): () => void;
34
+ [Symbol.asyncIterator](): AsyncIterableIterator<ReadModelChangeset<TReadModel>>;
35
+ next(): Promise<IteratorResult<ReadModelChangeset<TReadModel>>>;
36
+ return(): Promise<IteratorResult<ReadModelChangeset<TReadModel>>>;
37
+ dispose(): void;
38
+ private resetReadiness;
39
+ private start;
40
+ private disconnect;
41
+ private shouldResume;
42
+ private restart;
43
+ private clearRestartTimer;
44
+ private cancelStream;
45
+ private resumeReading;
46
+ private waitForCapacity;
47
+ private read;
48
+ private deliver;
49
+ private notifyResubscribed;
50
+ private finish;
51
+ }
52
+ //# sourceMappingURL=ReadModelWatcher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ReadModelWatcher.d.ts","sourceRoot":"","sources":["../../readModels/ReadModelWatcher.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,kBAAkB,IAAI,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAC3F,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,sCAAsC,CAAC;AAChF,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AAExE,uEAAuE;AACvE,qBAAa,gBAAgB,CAAC,UAAU,CAAE,YAAW,iBAAiB,CAAC,UAAU,CAAC,EAAE,qBAAqB,CAAC,kBAAkB,CAAC,UAAU,CAAC,CAAC;IA2BjI,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAEzB,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC;IA7BhC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAQ;IAC/C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAU;IAC1C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAU;IAClC,OAAO,CAAC,cAAc,CAAC,CAAa;IAEpC,OAAO,CAAC,WAAW,CAAiB;IACpC,OAAO,CAAC,kBAAkB,CAAc;IACxC,OAAO,CAAC,iBAAiB,CAA4B;IACrD,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,SAAS,CAAqB;IACtC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAyC;IACzE,OAAO,CAAC,WAAW,CAAC,CAAkB;IACtC,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,QAAQ,CAAC,CAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAwC;IAClE,OAAO,CAAC,aAAa,CAAC,CAAgC;IACtD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAGhB;IACT,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAsB;IAEnD,YACqB,KAAK,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,aAAa,CAAC,iBAAiB,CAAC,EAChE,QAAQ,EAAE,CAAC,MAAM,EAAE,iBAAiB,KAAK,OAAO,CAAC,kBAAkB,CAAC,UAAU,CAAC,CAAC,EACjG,MAAM,EAAE,WAAW,EACF,UAAU,CAAC,EAAE,mBAAmB,YAAA,EACjD,OAAO,GAAE,qBAA0B,EA2BtC;IAED,IAAI,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAE9B;IAED,cAAc,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,MAAM,IAAI,CAI/D;IAED,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,qBAAqB,CAAC,kBAAkB,CAAC,UAAU,CAAC,CAAC,CAE9E;IAED,IAAI,IAAI,OAAO,CAAC,cAAc,CAAC,kBAAkB,CAAC,UAAU,CAAC,CAAC,CAAC,CAS9D;IAEK,MAAM,IAAI,OAAO,CAAC,cAAc,CAAC,kBAAkB,CAAC,UAAU,CAAC,CAAC,CAAC,CAGtE;IAED,OAAO,IAAI,IAAI,CAGd;IAED,OAAO,CAAC,cAAc;IAWtB,OAAO,CAAC,KAAK;IAQb,OAAO,CAAC,UAAU;IAQlB,OAAO,CAAC,YAAY;IAIpB,OAAO,CAAC,OAAO;IAYf,OAAO,CAAC,iBAAiB;IAKzB,OAAO,CAAC,YAAY;IAOpB,OAAO,CAAC,aAAa;IAKrB,OAAO,CAAC,eAAe;YAST,IAAI;YAyCJ,OAAO;YA0BP,kBAAkB;IAYhC,OAAO,CAAC,MAAM;CAiBjB"}
@@ -0,0 +1,276 @@
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
+ /** @internal Owns one cancellable stream per connection generation. */
4
+ export class ReadModelWatcher {
5
+ _open;
6
+ _convert;
7
+ _lifecycle;
8
+ static _restartDelayMs = 1000;
9
+ _bufferLimit;
10
+ _failOnOverflow;
11
+ _resume;
12
+ _resumeReading;
13
+ _subscribed;
14
+ _resolveSubscribed;
15
+ _rejectSubscribed;
16
+ _acknowledged = false;
17
+ _hasSubscribed = false;
18
+ _delivery = Promise.resolve();
19
+ _onResubscribed = new Set();
20
+ _controller;
21
+ _stopped = false;
22
+ _failed = false;
23
+ _failure;
24
+ _buffered = [];
25
+ _restartTimer;
26
+ _waiting = [];
27
+ _unsubscribe = [];
28
+ constructor(_open, _convert, signal, _lifecycle, options = {}) {
29
+ this._open = _open;
30
+ this._convert = _convert;
31
+ this._lifecycle = _lifecycle;
32
+ if (options.maxBuffered !== undefined && (!Number.isSafeInteger(options.maxBuffered) || options.maxBuffered < 1)) {
33
+ throw new RangeError('maxBuffered must be a positive safe integer.');
34
+ }
35
+ this._bufferLimit = options.maxBuffered ?? 1024;
36
+ this._failOnOverflow = options.maxBuffered !== undefined;
37
+ this._resume = options.resume === true;
38
+ this.resetReadiness();
39
+ const abort = () => this.finish(signal.reason, false);
40
+ signal.addEventListener('abort', abort, { once: true });
41
+ this._unsubscribe.push(() => signal.removeEventListener('abort', abort));
42
+ if (_lifecycle) {
43
+ // Without opt-in, let the watch stream propagate its original transport error.
44
+ this._unsubscribe.push(_lifecycle.onDisconnected(async () => {
45
+ if (this.shouldResume())
46
+ this.disconnect();
47
+ }));
48
+ this._unsubscribe.push(_lifecycle.onConnected(async () => this.start()));
49
+ this._unsubscribe.push(_lifecycle.onFailed(async (error) => this.finish(error, true, true)));
50
+ }
51
+ if (signal.aborted) {
52
+ abort();
53
+ }
54
+ else if (_lifecycle?.failure) {
55
+ this.finish(_lifecycle.failure, true, true);
56
+ }
57
+ else if (!_lifecycle || _lifecycle.isConnected) {
58
+ this.start();
59
+ }
60
+ }
61
+ get subscribed() {
62
+ return this._subscribed;
63
+ }
64
+ onResubscribed(callback) {
65
+ if (this._stopped)
66
+ return () => { };
67
+ this._onResubscribed.add(callback);
68
+ return () => { this._onResubscribed.delete(callback); };
69
+ }
70
+ [Symbol.asyncIterator]() {
71
+ return this;
72
+ }
73
+ next() {
74
+ const value = this._buffered.shift();
75
+ if (value) {
76
+ this.resumeReading();
77
+ return Promise.resolve({ done: false, value });
78
+ }
79
+ if (this._failed)
80
+ return Promise.reject(this._failure);
81
+ if (this._stopped)
82
+ return Promise.resolve({ done: true, value: undefined });
83
+ return new Promise((resolve, reject) => this._waiting.push({ resolve, reject }));
84
+ }
85
+ async return() {
86
+ this.dispose();
87
+ return { done: true, value: undefined };
88
+ }
89
+ dispose() {
90
+ this._buffered.length = 0;
91
+ this.finish(new DOMException('Read model watcher disposed.', 'AbortError'), false);
92
+ }
93
+ resetReadiness() {
94
+ this._acknowledged = false;
95
+ this._subscribed = new Promise((resolve, reject) => {
96
+ this._resolveSubscribed = resolve;
97
+ this._rejectSubscribed = reject;
98
+ });
99
+ // Legacy consumers only iterate. They still receive stream failures from next();
100
+ // not observing the optional readiness promise must not cause an unhandled rejection.
101
+ this._subscribed.catch(() => { });
102
+ }
103
+ start() {
104
+ if (this._stopped || this._controller)
105
+ return;
106
+ this.clearRestartTimer();
107
+ const controller = new AbortController();
108
+ this._controller = controller;
109
+ void this.read(controller);
110
+ }
111
+ disconnect() {
112
+ if (this._stopped)
113
+ return;
114
+ this.clearRestartTimer();
115
+ this.cancelStream();
116
+ // Received changes are not replayed by the kernel. Keep them across reconnects.
117
+ if (this._acknowledged)
118
+ this.resetReadiness();
119
+ }
120
+ shouldResume() {
121
+ return this._resume || this._onResubscribed.size > 0;
122
+ }
123
+ restart() {
124
+ this.disconnect();
125
+ if (this._stopped || (this._lifecycle && !this._lifecycle.isConnected))
126
+ return;
127
+ // The watch and keep-alive share a transport, but can fail in either order.
128
+ // Also recover a watch-only failure if no disconnected notification follows.
129
+ this._restartTimer = setTimeout(() => {
130
+ this._restartTimer = undefined;
131
+ if (!this._lifecycle || this._lifecycle.isConnected)
132
+ this.start();
133
+ }, ReadModelWatcher._restartDelayMs);
134
+ this._restartTimer.unref?.();
135
+ }
136
+ clearRestartTimer() {
137
+ clearTimeout(this._restartTimer);
138
+ this._restartTimer = undefined;
139
+ }
140
+ cancelStream() {
141
+ const controller = this._controller;
142
+ this._controller = undefined;
143
+ controller?.abort();
144
+ this.resumeReading();
145
+ }
146
+ resumeReading() {
147
+ this._resumeReading?.();
148
+ this._resumeReading = undefined;
149
+ }
150
+ waitForCapacity(controller) {
151
+ if (this._controller === controller && this._acknowledged && !this._failOnOverflow &&
152
+ this._buffered.length >= this._bufferLimit) {
153
+ return new Promise(resolve => { this._resumeReading = resolve; })
154
+ .then(() => this.waitForCapacity(controller));
155
+ }
156
+ return undefined;
157
+ }
158
+ async read(controller) {
159
+ try {
160
+ for await (const change of this._open(controller.signal)) {
161
+ if (this._controller !== controller)
162
+ return;
163
+ if (change.Subscribed) {
164
+ if (this._acknowledged)
165
+ continue;
166
+ this._acknowledged = true;
167
+ this._resolveSubscribed();
168
+ const resubscribed = this._hasSubscribed;
169
+ this._hasSubscribed = true;
170
+ if (resubscribed) {
171
+ const callbacks = [...this._onResubscribed];
172
+ this._delivery = this._delivery.then(() => this.notifyResubscribed(callbacks));
173
+ await this._delivery;
174
+ }
175
+ const capacity = this.waitForCapacity(controller);
176
+ if (capacity)
177
+ await capacity;
178
+ if (this._controller !== controller)
179
+ return;
180
+ continue;
181
+ }
182
+ // Finish converting changes already received, even if their stream disconnects.
183
+ // A new stream queues behind them so conversion cannot reorder delivery.
184
+ this._delivery = this._delivery.then(() => this.deliver(change));
185
+ await this._delivery;
186
+ const capacity = this.waitForCapacity(controller);
187
+ if (capacity)
188
+ await capacity;
189
+ if (this._controller !== controller)
190
+ return;
191
+ }
192
+ if (this._controller === controller) {
193
+ if (this.shouldResume())
194
+ this.restart();
195
+ else
196
+ this.finish(new Error('Read model watch ended before subscription acknowledgment.'), false, true);
197
+ }
198
+ }
199
+ catch (error) {
200
+ if (this._controller !== controller)
201
+ return;
202
+ const code = error?.code;
203
+ if (this.shouldResume() && code !== undefined && [1, 4, 13, 14].includes(code))
204
+ this.restart();
205
+ // Let the consumer drain received changes before observing the terminal stream error.
206
+ else
207
+ this.finish(error, true, true);
208
+ }
209
+ }
210
+ async deliver(change) {
211
+ if (this._stopped)
212
+ return;
213
+ let converted;
214
+ try {
215
+ converted = await this._convert(change);
216
+ }
217
+ catch (error) {
218
+ // Conversion includes compliance RPCs: even transport-coded errors here
219
+ // are terminal, not permission to skip an unreleased change.
220
+ this.finish(error, true);
221
+ return;
222
+ }
223
+ if (this._stopped)
224
+ return;
225
+ const waiting = this._waiting.shift();
226
+ if (waiting) {
227
+ waiting.resolve({ done: false, value: converted });
228
+ }
229
+ else {
230
+ // Before Subscribed we must keep reading to reach the readiness marker.
231
+ // Afterward the default pauses reads; only an explicit limit opts into failure.
232
+ if (this._buffered.length >= this._bufferLimit) {
233
+ this.finish(new Error(`Read model watcher buffer exceeded ${this._bufferLimit} changes. Consume changes faster or refresh the read model and create a new watcher.`), true);
234
+ return;
235
+ }
236
+ this._buffered.push(converted);
237
+ }
238
+ }
239
+ async notifyResubscribed(callbacks) {
240
+ try {
241
+ for (const callback of callbacks) {
242
+ if (this._stopped)
243
+ return;
244
+ if (this._onResubscribed.has(callback))
245
+ await callback();
246
+ }
247
+ }
248
+ catch (error) {
249
+ // A failed refresh is not a recovered watch, even for transport-coded errors.
250
+ this.finish(error, true);
251
+ }
252
+ }
253
+ finish(reason, failed, preserveBuffered = false) {
254
+ if (this._stopped)
255
+ return;
256
+ this._stopped = true;
257
+ this._failed = failed;
258
+ this._failure = reason;
259
+ this._rejectSubscribed(reason);
260
+ this.clearRestartTimer();
261
+ this.cancelStream();
262
+ if (!preserveBuffered)
263
+ this._buffered.length = 0;
264
+ for (const unsubscribe of this._unsubscribe)
265
+ unsubscribe();
266
+ this._unsubscribe.length = 0;
267
+ this._onResubscribed.clear();
268
+ for (const waiting of this._waiting.splice(0)) {
269
+ if (failed)
270
+ waiting.reject(reason);
271
+ else
272
+ waiting.resolve({ done: true, value: undefined });
273
+ }
274
+ }
275
+ }
276
+ //# sourceMappingURL=ReadModelWatcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ReadModelWatcher.js","sourceRoot":"","sources":["../../readModels/ReadModelWatcher.ts"],"names":[],"mappings":"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"}
@@ -1,10 +1,13 @@
1
1
  import type { Constructor } from '@cratis/fundamentals';
2
2
  import { IClientArtifactsProvider } from '../artifacts/index.js';
3
3
  import { ChronicleConnection } from '../connection/index.js';
4
+ import type { ConnectionLifecycle } from '../connection/ConnectionLifecycle.js';
4
5
  import type { IMaterializedReadModels } from './IMaterializedReadModels.js';
5
6
  import type { ReadModelNamingPolicy } from './ReadModelNamingPolicy.js';
6
7
  import type { IReadModels } from './IReadModels.js';
8
+ import type { IReadModelWatcher } from './IReadModelWatcher.js';
7
9
  import type { ReadModelChangeset } from './ReadModelChangeset.js';
10
+ import type { ReadModelWatchOptions } from './ReadModelWatchOptions.js';
8
11
  import type { ReadModelSnapshot } from './ReadModelSnapshot.js';
9
12
  /**
10
13
  * Implements {@link IReadModels} by working with the Chronicle read-model gRPC service.
@@ -17,8 +20,10 @@ export declare class ReadModels implements IReadModels {
17
20
  private readonly _defaultSinkTypeId;
18
21
  private readonly _isModelBoundProjectionRegistered?;
19
22
  private readonly _readModelNamingPolicy?;
23
+ private readonly _lifecycle?;
20
24
  readonly materialized: IMaterializedReadModels;
21
- constructor(_eventStore: string, _namespace: string, _connection: ChronicleConnection, _clientArtifacts: IClientArtifactsProvider, _defaultSinkTypeId: string, _isModelBoundProjectionRegistered?: ((readModelType: Constructor) => boolean) | undefined, _readModelNamingPolicy?: ReadModelNamingPolicy | undefined);
25
+ private readonly _watchCancellation;
26
+ constructor(_eventStore: string, _namespace: string, _connection: ChronicleConnection, _clientArtifacts: IClientArtifactsProvider, _defaultSinkTypeId: string, _isModelBoundProjectionRegistered?: ((readModelType: Constructor) => boolean) | undefined, _readModelNamingPolicy?: ReadModelNamingPolicy | undefined, _lifecycle?: ConnectionLifecycle | undefined);
22
27
  /** @inheritdoc */
23
28
  register<TReadModel>(readModelType?: Constructor<TReadModel>): Promise<void>;
24
29
  /** @inheritdoc */
@@ -32,6 +37,10 @@ export declare class ReadModels implements IReadModels {
32
37
  /** @inheritdoc */
33
38
  watch<TReadModel>(readModelType: Constructor<TReadModel>): AsyncIterable<ReadModelChangeset<TReadModel>>;
34
39
  /** @inheritdoc */
40
+ createWatcher<TReadModel>(readModelType: Constructor<TReadModel>, options?: ReadModelWatchOptions): IReadModelWatcher<TReadModel>;
41
+ /** Stops all watchers created through createWatcher for this event store. */
42
+ dispose(): void;
43
+ /** @inheritdoc */
35
44
  dehydrateSession<TReadModel>(sessionId: string, readModelType: Constructor<TReadModel>, key: string): Promise<void>;
36
45
  /** @inheritdoc */
37
46
  release<TReadModel>(readModelType: Constructor<TReadModel>, instance: TReadModel): Promise<TReadModel>;
@@ -43,6 +52,7 @@ export declare class ReadModels implements IReadModels {
43
52
  private copyStoredDocument;
44
53
  private isDocumentObject;
45
54
  private isDocumentSubject;
55
+ private toChangeset;
46
56
  private releaseSnapshotInstances;
47
57
  private resolveReadModels;
48
58
  private addResolved;
@@ -1 +1 @@
1
- {"version":3,"file":"ReadModels.d.ts","sourceRoot":"","sources":["../../readModels/ReadModels.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ReadModels.d.ts","sourceRoot":"","sources":["../../readModels/ReadModels.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,8 @@
1
1
  // Copyright (c) Cratis. All rights reserved.
2
2
  // Licensed under the MIT license. See LICENSE file in the project root for full license information.
3
- import { ReadModelObserverType as ContractReadModelObserverType } from '@cratis/chronicle.contracts';
3
+ import { ReadModelObserverType as ContractReadModelObserverType, ReadModelChangeType as ContractReadModelChangeType } from '@cratis/chronicle.contracts';
4
4
  import { JsonSerializer } from '@cratis/fundamentals';
5
+ import { fromContractsGuid } from '../connection/Guid.js';
5
6
  import { ensureQuerySuccess } from '../connection/callResults.js';
6
7
  import { EventSequenceId } from '../eventSequences/EventSequenceId.js';
7
8
  import { getProjectionMetadata } from '../projections/declarative/projection.js';
@@ -18,6 +19,8 @@ import { rootReadModelTypes } from './rootReadModelTypes.js';
18
19
  import { MaterializedReadModels } from './MaterializedReadModels.js';
19
20
  import { ReadModelSubjectResolver } from './ReadModelSubjectResolver.js';
20
21
  import { deserializeReadModel } from './deserializeReadModel.js';
22
+ import { ReadModelWatcher } from './ReadModelWatcher.js';
23
+ import { ReadModelChangeType } from './ReadModelChangeType.js';
21
24
  const unlimitedEventCount = BigInt('18446744073709551615');
22
25
  /**
23
26
  * Implements {@link IReadModels} by working with the Chronicle read-model gRPC service.
@@ -30,8 +33,10 @@ export class ReadModels {
30
33
  _defaultSinkTypeId;
31
34
  _isModelBoundProjectionRegistered;
32
35
  _readModelNamingPolicy;
36
+ _lifecycle;
33
37
  materialized;
34
- constructor(_eventStore, _namespace, _connection, _clientArtifacts, _defaultSinkTypeId, _isModelBoundProjectionRegistered, _readModelNamingPolicy) {
38
+ _watchCancellation = new AbortController();
39
+ constructor(_eventStore, _namespace, _connection, _clientArtifacts, _defaultSinkTypeId, _isModelBoundProjectionRegistered, _readModelNamingPolicy, _lifecycle) {
35
40
  this._eventStore = _eventStore;
36
41
  this._namespace = _namespace;
37
42
  this._connection = _connection;
@@ -39,6 +44,7 @@ export class ReadModels {
39
44
  this._defaultSinkTypeId = _defaultSinkTypeId;
40
45
  this._isModelBoundProjectionRegistered = _isModelBoundProjectionRegistered;
41
46
  this._readModelNamingPolicy = _readModelNamingPolicy;
47
+ this._lifecycle = _lifecycle;
42
48
  this.materialized = new MaterializedReadModels(_eventStore, _namespace, _connection);
43
49
  }
44
50
  /** @inheritdoc */
@@ -141,18 +147,27 @@ export class ReadModels {
141
147
  if (changeset.Subscribed) {
142
148
  continue;
143
149
  }
144
- const instance = this.deserializeReadModel(readModelType, changeset.ReadModel);
145
- const requiresRelease = !changeset.Removed && readModel.observerType === ContractReadModelObserverType.Reducer &&
146
- this.schemaHasComplianceMetadata(readModel.schema);
147
- yield {
148
- namespace: changeset.Namespace,
149
- key: changeset.ModelKey,
150
- readModel: requiresRelease ? await this.release(readModelType, instance) : instance,
151
- removed: changeset.Removed
152
- };
150
+ yield await this.toChangeset(readModelType, readModel, changeset);
153
151
  }
154
152
  }
155
153
  /** @inheritdoc */
154
+ createWatcher(readModelType, options) {
155
+ const readModel = this.resolveReadModel(readModelType);
156
+ const signal = AbortSignal.any(options?.signal
157
+ ? [options.signal, this._watchCancellation.signal]
158
+ : [this._watchCancellation.signal]);
159
+ return new ReadModelWatcher(streamSignal => this._connection.readModels.watch({
160
+ EventStore: this._eventStore,
161
+ Namespace: this._namespace,
162
+ ReadModelIdentifier: readModel.identifier,
163
+ EventSequenceId: readModel.eventSequenceId
164
+ }, { signal: streamSignal }), changeset => this.toChangeset(readModelType, readModel, changeset), signal, this._lifecycle, options);
165
+ }
166
+ /** Stops all watchers created through createWatcher for this event store. */
167
+ dispose() {
168
+ this._watchCancellation.abort();
169
+ }
170
+ /** @inheritdoc */
156
171
  async dehydrateSession(sessionId, readModelType, key) {
157
172
  const readModel = this.resolveReadModel(readModelType);
158
173
  await this._connection.readModels.dehydrateSession({
@@ -297,6 +312,27 @@ export class ReadModels {
297
312
  isDocumentSubject(value) {
298
313
  return typeof value === 'string' && value.length > 0;
299
314
  }
315
+ async toChangeset(readModelType, readModel, changeset) {
316
+ const instance = this.deserializeReadModel(readModelType, changeset.ReadModel);
317
+ const occurred = changeset.Occurred?.Value ? new Date(changeset.Occurred.Value) : undefined;
318
+ const requiresRelease = !changeset.Removed && readModel.observerType === ContractReadModelObserverType.Reducer &&
319
+ this.schemaHasComplianceMetadata(readModel.schema);
320
+ return {
321
+ namespace: changeset.Namespace,
322
+ key: changeset.ModelKey,
323
+ readModel: requiresRelease ? await this.release(readModelType, instance) : instance,
324
+ removed: changeset.Removed,
325
+ changeType: changeset.ChangeType === ContractReadModelChangeType.Added ? ReadModelChangeType.Added :
326
+ changeset.ChangeType === ContractReadModelChangeType.Removed ? ReadModelChangeType.Removed : ReadModelChangeType.Modified,
327
+ changeContext: {
328
+ eventStore: this._eventStore,
329
+ namespace: changeset.Namespace,
330
+ sequenceNumber: changeset.EventSequenceNumber,
331
+ correlationId: changeset.CorrelationId ? fromContractsGuid(changeset.CorrelationId).toString() : undefined,
332
+ occurred: occurred && !Number.isNaN(occurred.getTime()) ? occurred : undefined
333
+ }
334
+ };
335
+ }
300
336
  async releaseSnapshotInstances(readModelType, snapshots) {
301
337
  return Promise.all(snapshots.map(async (snapshot) => ({
302
338
  ...snapshot,