@powerhousedao/reactor 4.1.0-dev.9 → 4.1.0-dev.91

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 (226) hide show
  1. package/dist/src/cache/buffer/ring-buffer.d.ts +37 -0
  2. package/dist/src/cache/buffer/ring-buffer.d.ts.map +1 -0
  3. package/dist/src/cache/buffer/ring-buffer.js +69 -0
  4. package/dist/src/cache/buffer/ring-buffer.js.map +1 -0
  5. package/dist/src/cache/kysely-write-cache.d.ts +133 -0
  6. package/dist/src/cache/kysely-write-cache.d.ts.map +1 -0
  7. package/dist/src/cache/kysely-write-cache.js +375 -0
  8. package/dist/src/cache/kysely-write-cache.js.map +1 -0
  9. package/dist/src/cache/lru/lru-tracker.d.ts +15 -0
  10. package/dist/src/cache/lru/lru-tracker.d.ts.map +1 -0
  11. package/dist/src/cache/lru/lru-tracker.js +96 -0
  12. package/dist/src/cache/lru/lru-tracker.js.map +1 -0
  13. package/dist/src/cache/types.d.ts +42 -0
  14. package/dist/src/cache/types.d.ts.map +1 -0
  15. package/dist/src/cache/types.js +2 -0
  16. package/dist/src/cache/types.js.map +1 -0
  17. package/dist/src/cache/write/interfaces.d.ts +83 -0
  18. package/dist/src/cache/write/interfaces.d.ts.map +1 -0
  19. package/dist/src/cache/write/interfaces.js +2 -0
  20. package/dist/src/cache/write/interfaces.js.map +1 -0
  21. package/dist/src/client/reactor-client.d.ts +103 -0
  22. package/dist/src/client/reactor-client.d.ts.map +1 -0
  23. package/dist/src/client/reactor-client.js +184 -0
  24. package/dist/src/client/reactor-client.js.map +1 -0
  25. package/dist/src/client/types.d.ts +213 -0
  26. package/dist/src/client/types.d.ts.map +1 -0
  27. package/dist/src/client/types.js +14 -0
  28. package/dist/src/client/types.js.map +1 -0
  29. package/dist/src/core/builder.d.ts +20 -0
  30. package/dist/src/core/builder.d.ts.map +1 -0
  31. package/dist/src/core/builder.js +47 -0
  32. package/dist/src/core/builder.js.map +1 -0
  33. package/dist/src/core/reactor.d.ts +92 -0
  34. package/dist/src/core/reactor.d.ts.map +1 -0
  35. package/dist/src/core/reactor.js +646 -0
  36. package/dist/src/core/reactor.js.map +1 -0
  37. package/dist/src/core/types.d.ts +121 -0
  38. package/dist/src/core/types.d.ts.map +1 -0
  39. package/dist/src/core/types.js +2 -0
  40. package/dist/src/core/types.js.map +1 -0
  41. package/dist/src/core/utils.d.ts +11 -0
  42. package/dist/src/core/utils.d.ts.map +1 -0
  43. package/dist/src/core/utils.js +31 -0
  44. package/dist/src/core/utils.js.map +1 -0
  45. package/dist/src/events/event-bus.d.ts +3 -3
  46. package/dist/src/events/event-bus.d.ts.map +1 -1
  47. package/dist/src/events/event-bus.js.map +1 -1
  48. package/dist/src/events/interfaces.d.ts +1 -1
  49. package/dist/src/events/interfaces.d.ts.map +1 -1
  50. package/dist/src/events/types.d.ts +15 -1
  51. package/dist/src/events/types.d.ts.map +1 -1
  52. package/dist/src/events/types.js +6 -0
  53. package/dist/src/events/types.js.map +1 -1
  54. package/dist/src/executor/interfaces.d.ts +31 -54
  55. package/dist/src/executor/interfaces.d.ts.map +1 -1
  56. package/dist/src/executor/simple-job-executor-manager.d.ts +31 -0
  57. package/dist/src/executor/simple-job-executor-manager.d.ts.map +1 -0
  58. package/dist/src/executor/simple-job-executor-manager.js +190 -0
  59. package/dist/src/executor/simple-job-executor-manager.js.map +1 -0
  60. package/dist/src/executor/simple-job-executor.d.ts +48 -0
  61. package/dist/src/executor/simple-job-executor.d.ts.map +1 -0
  62. package/dist/src/executor/simple-job-executor.js +488 -0
  63. package/dist/src/executor/simple-job-executor.js.map +1 -0
  64. package/dist/src/executor/types.d.ts +30 -8
  65. package/dist/src/executor/types.d.ts.map +1 -1
  66. package/dist/src/executor/types.js.map +1 -1
  67. package/dist/src/executor/util.d.ts +47 -0
  68. package/dist/src/executor/util.d.ts.map +1 -0
  69. package/dist/src/executor/util.js +113 -0
  70. package/dist/src/executor/util.js.map +1 -0
  71. package/dist/src/index.d.ts +30 -3
  72. package/dist/src/index.d.ts.map +1 -1
  73. package/dist/src/index.js +36 -2
  74. package/dist/src/index.js.map +1 -1
  75. package/dist/src/job-tracker/in-memory-job-tracker.d.ts +15 -0
  76. package/dist/src/job-tracker/in-memory-job-tracker.d.ts.map +1 -0
  77. package/dist/src/job-tracker/in-memory-job-tracker.js +78 -0
  78. package/dist/src/job-tracker/in-memory-job-tracker.js.map +1 -0
  79. package/dist/src/job-tracker/index.d.ts +3 -0
  80. package/dist/src/job-tracker/index.d.ts.map +1 -0
  81. package/dist/src/job-tracker/index.js +2 -0
  82. package/dist/src/job-tracker/index.js.map +1 -0
  83. package/dist/src/job-tracker/interfaces.d.ts +41 -0
  84. package/dist/src/job-tracker/interfaces.d.ts.map +1 -0
  85. package/dist/src/job-tracker/interfaces.js +2 -0
  86. package/dist/src/job-tracker/interfaces.js.map +1 -0
  87. package/dist/src/queue/interfaces.d.ts +45 -5
  88. package/dist/src/queue/interfaces.d.ts.map +1 -1
  89. package/dist/src/queue/job-execution-handle.d.ts +24 -0
  90. package/dist/src/queue/job-execution-handle.d.ts.map +1 -0
  91. package/dist/src/queue/job-execution-handle.js +62 -0
  92. package/dist/src/queue/job-execution-handle.js.map +1 -0
  93. package/dist/src/queue/queue.d.ts +54 -5
  94. package/dist/src/queue/queue.d.ts.map +1 -1
  95. package/dist/src/queue/queue.js +272 -36
  96. package/dist/src/queue/queue.js.map +1 -1
  97. package/dist/src/queue/types.d.ts +32 -5
  98. package/dist/src/queue/types.d.ts.map +1 -1
  99. package/dist/src/queue/types.js +12 -0
  100. package/dist/src/queue/types.js.map +1 -1
  101. package/dist/src/read-models/coordinator.d.ts +38 -0
  102. package/dist/src/read-models/coordinator.d.ts.map +1 -0
  103. package/dist/src/read-models/coordinator.js +62 -0
  104. package/dist/src/read-models/coordinator.js.map +1 -0
  105. package/dist/src/read-models/document-view.d.ts +20 -0
  106. package/dist/src/read-models/document-view.d.ts.map +1 -0
  107. package/dist/src/read-models/document-view.js +365 -0
  108. package/dist/src/read-models/document-view.js.map +1 -0
  109. package/dist/src/read-models/interfaces.d.ts +29 -0
  110. package/dist/src/read-models/interfaces.d.ts.map +1 -0
  111. package/dist/src/read-models/interfaces.js +2 -0
  112. package/dist/src/read-models/interfaces.js.map +1 -0
  113. package/dist/src/read-models/types.d.ts +46 -0
  114. package/dist/src/read-models/types.d.ts.map +1 -0
  115. package/dist/src/read-models/types.js +2 -0
  116. package/dist/src/read-models/types.js.map +1 -0
  117. package/dist/src/registry/implementation.d.ts +62 -0
  118. package/dist/src/registry/implementation.d.ts.map +1 -0
  119. package/dist/src/registry/implementation.js +96 -0
  120. package/dist/src/registry/implementation.js.map +1 -0
  121. package/dist/src/registry/index.d.ts +3 -0
  122. package/dist/src/registry/index.d.ts.map +1 -0
  123. package/dist/src/registry/index.js +2 -0
  124. package/dist/src/registry/index.js.map +1 -0
  125. package/dist/src/registry/interfaces.d.ts +39 -0
  126. package/dist/src/registry/interfaces.d.ts.map +1 -0
  127. package/dist/src/registry/interfaces.js +2 -0
  128. package/dist/src/registry/interfaces.js.map +1 -0
  129. package/dist/src/shared/awaiter.d.ts +32 -0
  130. package/dist/src/shared/awaiter.d.ts.map +1 -0
  131. package/dist/src/shared/awaiter.js +132 -0
  132. package/dist/src/shared/awaiter.js.map +1 -0
  133. package/dist/src/shared/errors.d.ts +17 -0
  134. package/dist/src/shared/errors.d.ts.map +1 -0
  135. package/dist/src/shared/errors.js +33 -0
  136. package/dist/src/shared/errors.js.map +1 -0
  137. package/dist/src/shared/factories.d.ts +16 -0
  138. package/dist/src/shared/factories.d.ts.map +1 -0
  139. package/dist/src/shared/factories.js +33 -0
  140. package/dist/src/shared/factories.js.map +1 -0
  141. package/dist/src/shared/types.d.ts +91 -19
  142. package/dist/src/shared/types.d.ts.map +1 -1
  143. package/dist/src/shared/types.js +35 -1
  144. package/dist/src/shared/types.js.map +1 -1
  145. package/dist/src/shared/utils.d.ts +3 -0
  146. package/dist/src/shared/utils.d.ts.map +1 -0
  147. package/dist/src/shared/utils.js +8 -0
  148. package/dist/src/shared/utils.js.map +1 -0
  149. package/dist/src/signer/passthrough-signer.d.ts +6 -0
  150. package/dist/src/signer/passthrough-signer.d.ts.map +1 -0
  151. package/dist/src/signer/passthrough-signer.js +6 -0
  152. package/dist/src/signer/passthrough-signer.js.map +1 -0
  153. package/dist/src/signer/types.d.ts +15 -0
  154. package/dist/src/signer/types.d.ts.map +1 -0
  155. package/dist/src/signer/types.js +2 -0
  156. package/dist/src/signer/types.js.map +1 -0
  157. package/dist/src/storage/interfaces.d.ts +121 -0
  158. package/dist/src/storage/interfaces.d.ts.map +1 -0
  159. package/dist/src/storage/interfaces.js +19 -0
  160. package/dist/src/storage/interfaces.js.map +1 -0
  161. package/dist/src/storage/kysely/keyframe-store.d.ts +15 -0
  162. package/dist/src/storage/kysely/keyframe-store.d.ts.map +1 -0
  163. package/dist/src/storage/kysely/keyframe-store.js +71 -0
  164. package/dist/src/storage/kysely/keyframe-store.js.map +1 -0
  165. package/dist/src/storage/kysely/store.d.ts +15 -0
  166. package/dist/src/storage/kysely/store.d.ts.map +1 -0
  167. package/dist/src/storage/kysely/store.js +196 -0
  168. package/dist/src/storage/kysely/store.js.map +1 -0
  169. package/dist/src/storage/kysely/types.d.ts +39 -0
  170. package/dist/src/storage/kysely/types.d.ts.map +1 -0
  171. package/dist/src/storage/kysely/types.js +2 -0
  172. package/dist/src/storage/kysely/types.js.map +1 -0
  173. package/dist/src/storage/txn.d.ts +15 -0
  174. package/dist/src/storage/txn.d.ts.map +1 -0
  175. package/dist/src/storage/txn.js +41 -0
  176. package/dist/src/storage/txn.js.map +1 -0
  177. package/dist/src/subs/default-error-handler.d.ts +13 -0
  178. package/dist/src/subs/default-error-handler.d.ts.map +1 -0
  179. package/dist/src/subs/default-error-handler.js +27 -0
  180. package/dist/src/subs/default-error-handler.js.map +1 -0
  181. package/dist/src/subs/react-subscription-manager.d.ts +45 -0
  182. package/dist/src/subs/react-subscription-manager.d.ts.map +1 -0
  183. package/dist/src/subs/react-subscription-manager.js +185 -0
  184. package/dist/src/subs/react-subscription-manager.js.map +1 -0
  185. package/dist/src/subs/types.d.ts +64 -0
  186. package/dist/src/subs/types.d.ts.map +1 -0
  187. package/dist/src/subs/types.js +2 -0
  188. package/dist/src/subs/types.js.map +1 -0
  189. package/dist/src/utils/reshuffle.d.ts +30 -0
  190. package/dist/src/utils/reshuffle.d.ts.map +1 -0
  191. package/dist/src/utils/reshuffle.js +47 -0
  192. package/dist/src/utils/reshuffle.js.map +1 -0
  193. package/package.json +18 -7
  194. package/dist/bench/end-to-end-flow.bench.d.ts +0 -2
  195. package/dist/bench/end-to-end-flow.bench.d.ts.map +0 -1
  196. package/dist/bench/end-to-end-flow.bench.js +0 -256
  197. package/dist/bench/end-to-end-flow.bench.js.map +0 -1
  198. package/dist/bench/event-bus.bench.d.ts +0 -2
  199. package/dist/bench/event-bus.bench.d.ts.map +0 -1
  200. package/dist/bench/event-bus.bench.js +0 -238
  201. package/dist/bench/event-bus.bench.js.map +0 -1
  202. package/dist/bench/queue-only.bench.d.ts +0 -2
  203. package/dist/bench/queue-only.bench.d.ts.map +0 -1
  204. package/dist/bench/queue-only.bench.js +0 -40
  205. package/dist/bench/queue-only.bench.js.map +0 -1
  206. package/dist/bench/reactor-throughput.bench.d.ts +0 -2
  207. package/dist/bench/reactor-throughput.bench.d.ts.map +0 -1
  208. package/dist/bench/reactor-throughput.bench.js +0 -137
  209. package/dist/bench/reactor-throughput.bench.js.map +0 -1
  210. package/dist/src/executor/job-executor.d.ts +0 -62
  211. package/dist/src/executor/job-executor.d.ts.map +0 -1
  212. package/dist/src/executor/job-executor.js +0 -325
  213. package/dist/src/executor/job-executor.js.map +0 -1
  214. package/dist/test/event-bus.test.d.ts +0 -2
  215. package/dist/test/event-bus.test.d.ts.map +0 -1
  216. package/dist/test/event-bus.test.js +0 -532
  217. package/dist/test/event-bus.test.js.map +0 -1
  218. package/dist/test/job-executor.test.d.ts +0 -2
  219. package/dist/test/job-executor.test.d.ts.map +0 -1
  220. package/dist/test/job-executor.test.js +0 -581
  221. package/dist/test/job-executor.test.js.map +0 -1
  222. package/dist/test/queue.test.d.ts +0 -2
  223. package/dist/test/queue.test.d.ts.map +0 -1
  224. package/dist/test/queue.test.js +0 -396
  225. package/dist/test/queue.test.js.map +0 -1
  226. package/dist/tsconfig.tsbuildinfo +0 -1
@@ -0,0 +1,62 @@
1
+ import { OperationEventTypes, } from "../events/types.js";
2
+ /**
3
+ * Coordinates read model synchronization by listening to operation write events
4
+ * and updating all registered read models in parallel.
5
+ *
6
+ * This coordinator is responsible for:
7
+ * - Subscribing to OPERATION_WRITTEN events from the event bus
8
+ * - Distributing operation updates to all registered read models
9
+ * - Managing the lifecycle of read model subscriptions
10
+ *
11
+ * Read models are updated asynchronously and in parallel to avoid blocking
12
+ * the write path. Errors in read model updates are propagated through the
13
+ * event bus but do not affect the write operation success.
14
+ */
15
+ export class ReadModelCoordinator {
16
+ eventBus;
17
+ readModels;
18
+ unsubscribe;
19
+ isRunning = false;
20
+ constructor(eventBus, readModels) {
21
+ this.eventBus = eventBus;
22
+ this.readModels = readModels;
23
+ }
24
+ /**
25
+ * Start listening for operation events and updating read models.
26
+ * Can be called multiple times safely (subsequent calls are no-ops).
27
+ */
28
+ start() {
29
+ if (this.isRunning) {
30
+ return;
31
+ }
32
+ // Subscribe to OPERATION_WRITTEN events
33
+ this.unsubscribe = this.eventBus.subscribe(OperationEventTypes.OPERATION_WRITTEN, async (type, event) => {
34
+ await this.handleOperationWritten(event);
35
+ });
36
+ this.isRunning = true;
37
+ }
38
+ /**
39
+ * Stop listening and clean up subscriptions.
40
+ * Can be called multiple times safely (subsequent calls are no-ops).
41
+ */
42
+ stop() {
43
+ if (!this.isRunning) {
44
+ return;
45
+ }
46
+ if (this.unsubscribe) {
47
+ this.unsubscribe();
48
+ this.unsubscribe = undefined;
49
+ }
50
+ this.isRunning = false;
51
+ }
52
+ /**
53
+ * Handle operation written events by updating all read models in parallel.
54
+ * Errors from individual read models are collected and re-thrown as an aggregate.
55
+ */
56
+ async handleOperationWritten(event) {
57
+ // Index into all read models in parallel
58
+ // If any read model fails, the error will be collected by the event bus
59
+ await Promise.all(this.readModels.map((readModel) => readModel.indexOperations(event.operations)));
60
+ }
61
+ }
62
+ //# sourceMappingURL=coordinator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"coordinator.js","sourceRoot":"","sources":["../../../src/read-models/coordinator.ts"],"names":[],"mappings":"AACA,OAAO,EACL,mBAAmB,GAGpB,MAAM,oBAAoB,CAAC;AAG5B;;;;;;;;;;;;GAYG;AACH,MAAM,OAAO,oBAAoB;IAKrB;IACA;IALF,WAAW,CAAe;IAC1B,SAAS,GAAG,KAAK,CAAC;IAE1B,YACU,QAAmB,EACnB,UAAwB;QADxB,aAAQ,GAAR,QAAQ,CAAW;QACnB,eAAU,GAAV,UAAU,CAAc;IAC/B,CAAC;IAEJ;;;OAGG;IACH,KAAK;QACH,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,OAAO;QACT,CAAC;QAED,wCAAwC;QACxC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,CACxC,mBAAmB,CAAC,iBAAiB,EACrC,KAAK,EAAE,IAAI,EAAE,KAA4B,EAAE,EAAE;YAC3C,MAAM,IAAI,CAAC,sBAAsB,CAAC,KAAK,CAAC,CAAC;QAC3C,CAAC,CACF,CAAC;QAEF,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;IACxB,CAAC;IAED;;;OAGG;IACH,IAAI;QACF,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YACpB,OAAO;QACT,CAAC;QAED,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,IAAI,CAAC,WAAW,EAAE,CAAC;YACnB,IAAI,CAAC,WAAW,GAAG,SAAS,CAAC;QAC/B,CAAC;QAED,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;IACzB,CAAC;IAED;;;OAGG;IACK,KAAK,CAAC,sBAAsB,CAClC,KAA4B;QAE5B,yCAAyC;QACzC,wEAAwE;QACxE,MAAM,OAAO,CAAC,GAAG,CACf,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAChC,SAAS,CAAC,eAAe,CAAC,KAAK,CAAC,UAAU,CAAC,CAC5C,CACF,CAAC;IACJ,CAAC;CACF"}
@@ -0,0 +1,20 @@
1
+ import type { PHDocument } from "document-model";
2
+ import type { Kysely } from "kysely";
3
+ import type { IDocumentView, IOperationStore, OperationWithContext, ViewFilter } from "../storage/interfaces.js";
4
+ import type { Database as StorageDatabase } from "../storage/kysely/types.js";
5
+ import type { DocumentViewDatabase } from "./types.js";
6
+ type Database = StorageDatabase & DocumentViewDatabase;
7
+ export declare class KyselyDocumentView implements IDocumentView {
8
+ private db;
9
+ private operationStore;
10
+ private lastOperationId;
11
+ constructor(db: Kysely<Database>, operationStore: IOperationStore);
12
+ init(): Promise<void>;
13
+ indexOperations(items: OperationWithContext[]): Promise<void>;
14
+ exists(documentIds: string[], signal?: AbortSignal): Promise<boolean[]>;
15
+ get<TDocument extends PHDocument>(documentId: string, view?: ViewFilter, signal?: AbortSignal): Promise<TDocument>;
16
+ private checkTablesExist;
17
+ private createTablesIfNotExist;
18
+ }
19
+ export {};
20
+ //# sourceMappingURL=document-view.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"document-view.d.ts","sourceRoot":"","sources":["../../../src/read-models/document-view.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAa,UAAU,EAAoB,MAAM,gBAAgB,CAAC;AAC9E,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAErC,OAAO,KAAK,EACV,aAAa,EACb,eAAe,EACf,oBAAoB,EACpB,UAAU,EACX,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,EAAE,QAAQ,IAAI,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC9E,OAAO,KAAK,EACV,oBAAoB,EAErB,MAAM,YAAY,CAAC;AAEpB,KAAK,QAAQ,GAAG,eAAe,GAAG,oBAAoB,CAAC;AAEvD,qBAAa,kBAAmB,YAAW,aAAa;IAIpD,OAAO,CAAC,EAAE;IACV,OAAO,CAAC,cAAc;IAJxB,OAAO,CAAC,eAAe,CAAa;gBAG1B,EAAE,EAAE,MAAM,CAAC,QAAQ,CAAC,EACpB,cAAc,EAAE,eAAe;IAGnC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAiCrB,eAAe,CAAC,KAAK,EAAE,oBAAoB,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAgI7D,MAAM,CACV,WAAW,EAAE,MAAM,EAAE,EACrB,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,OAAO,EAAE,CAAC;IAsBf,GAAG,CAAC,SAAS,SAAS,UAAU,EACpC,UAAU,EAAE,MAAM,EAClB,IAAI,CAAC,EAAE,UAAU,EACjB,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,SAAS,CAAC;YAoIP,gBAAgB;YAchB,sBAAsB;CAsGrC"}
@@ -0,0 +1,365 @@
1
+ import { v4 as uuidv4 } from "uuid";
2
+ export class KyselyDocumentView {
3
+ db;
4
+ operationStore;
5
+ lastOperationId = 0;
6
+ constructor(db, operationStore) {
7
+ this.db = db;
8
+ this.operationStore = operationStore;
9
+ }
10
+ async init() {
11
+ await this.createTablesIfNotExist();
12
+ const viewState = await this.db
13
+ .selectFrom("ViewState")
14
+ .selectAll()
15
+ .executeTakeFirst();
16
+ if (viewState) {
17
+ this.lastOperationId = viewState.lastOperationId;
18
+ const missedOperations = await this.operationStore.getSinceId(this.lastOperationId);
19
+ if (missedOperations.items.length > 0) {
20
+ await this.indexOperations(missedOperations.items);
21
+ }
22
+ }
23
+ else {
24
+ await this.db
25
+ .insertInto("ViewState")
26
+ .values({
27
+ lastOperationId: 0,
28
+ })
29
+ .execute();
30
+ const allOperations = await this.operationStore.getSinceId(0);
31
+ if (allOperations.items.length > 0) {
32
+ await this.indexOperations(allOperations.items);
33
+ }
34
+ }
35
+ }
36
+ async indexOperations(items) {
37
+ if (items.length === 0)
38
+ return;
39
+ await this.db.transaction().execute(async (trx) => {
40
+ for (const item of items) {
41
+ const { operation, context } = item;
42
+ const { documentId, scope, branch, documentType, resultingState } = context;
43
+ const { index, hash } = operation;
44
+ // We never rebuild here
45
+ if (!resultingState) {
46
+ throw new Error(`Missing resultingState in context for operation ${operation.id || "unknown"}. ` +
47
+ `IDocumentView requires resultingState from upstream - it does not rebuild documents.`);
48
+ }
49
+ let fullState = {};
50
+ try {
51
+ fullState = JSON.parse(resultingState);
52
+ }
53
+ catch (error) {
54
+ throw new Error(`Failed to parse resultingState for operation ${operation.id || "unknown"}: ${error instanceof Error ? error.message : String(error)}`);
55
+ }
56
+ const operationType = operation.action.type;
57
+ let scopesToIndex;
58
+ if (operationType === "CREATE_DOCUMENT") {
59
+ scopesToIndex = Object.entries(fullState).filter(([key]) => key === "header" || key === "document" || key === "auth");
60
+ }
61
+ else if (operationType === "UPGRADE_DOCUMENT") {
62
+ const scopeStatesToIndex = [];
63
+ for (const [scopeName, scopeState] of Object.entries(fullState)) {
64
+ if (scopeName === "header") {
65
+ scopeStatesToIndex.push([scopeName, scopeState]);
66
+ continue;
67
+ }
68
+ if (scopeName === scope) {
69
+ scopeStatesToIndex.push([scopeName, scopeState]);
70
+ continue;
71
+ }
72
+ const existingSnapshot = await trx
73
+ .selectFrom("DocumentSnapshot")
74
+ .select("scope")
75
+ .where("documentId", "=", documentId)
76
+ .where("scope", "=", scopeName)
77
+ .where("branch", "=", branch)
78
+ .executeTakeFirst();
79
+ if (!existingSnapshot) {
80
+ scopeStatesToIndex.push([scopeName, scopeState]);
81
+ }
82
+ }
83
+ scopesToIndex = scopeStatesToIndex;
84
+ }
85
+ else {
86
+ scopesToIndex = [];
87
+ if (fullState.header !== undefined) {
88
+ scopesToIndex.push(["header", fullState.header]);
89
+ }
90
+ if (fullState[scope] !== undefined) {
91
+ scopesToIndex.push([scope, fullState[scope]]);
92
+ }
93
+ else {
94
+ scopesToIndex.push([scope, {}]);
95
+ }
96
+ }
97
+ for (const [scopeName, scopeState] of scopesToIndex) {
98
+ const existingSnapshot = await trx
99
+ .selectFrom("DocumentSnapshot")
100
+ .selectAll()
101
+ .where("documentId", "=", documentId)
102
+ .where("scope", "=", scopeName)
103
+ .where("branch", "=", branch)
104
+ .executeTakeFirst();
105
+ const newState = typeof scopeState === "object" && scopeState !== null
106
+ ? scopeState
107
+ : {};
108
+ if (existingSnapshot) {
109
+ await trx
110
+ .updateTable("DocumentSnapshot")
111
+ .set({
112
+ lastOperationIndex: index,
113
+ lastOperationHash: hash,
114
+ lastUpdatedAt: new Date(),
115
+ snapshotVersion: existingSnapshot.snapshotVersion + 1,
116
+ content: JSON.stringify(newState),
117
+ })
118
+ .where("documentId", "=", documentId)
119
+ .where("scope", "=", scopeName)
120
+ .where("branch", "=", branch)
121
+ .execute();
122
+ }
123
+ else {
124
+ const snapshot = {
125
+ id: uuidv4(),
126
+ documentId,
127
+ slug: null,
128
+ name: null,
129
+ scope: scopeName,
130
+ branch,
131
+ content: JSON.stringify(newState),
132
+ documentType,
133
+ lastOperationIndex: index,
134
+ lastOperationHash: hash,
135
+ identifiers: null,
136
+ metadata: null,
137
+ deletedAt: null,
138
+ };
139
+ await trx.insertInto("DocumentSnapshot").values(snapshot).execute();
140
+ }
141
+ }
142
+ }
143
+ });
144
+ }
145
+ async exists(documentIds, signal) {
146
+ if (signal?.aborted) {
147
+ throw new Error("Operation aborted");
148
+ }
149
+ if (documentIds.length === 0) {
150
+ return [];
151
+ }
152
+ const snapshots = await this.db
153
+ .selectFrom("DocumentSnapshot")
154
+ .select(["documentId"])
155
+ .where("documentId", "in", documentIds)
156
+ .where("isDeleted", "=", false)
157
+ .distinct()
158
+ .execute();
159
+ const existingIds = new Set(snapshots.map((s) => s.documentId));
160
+ return documentIds.map((id) => existingIds.has(id));
161
+ }
162
+ async get(documentId, view, signal) {
163
+ if (signal?.aborted) {
164
+ throw new Error("Operation aborted");
165
+ }
166
+ const branch = view?.branch || "main";
167
+ // Determine which scopes to retrieve
168
+ let scopesToQuery;
169
+ if (view?.scopes && view.scopes.length > 0) {
170
+ // If scopes has values, always include header + document + specified scopes
171
+ // (header and document are the minimum scopes that must be returned)
172
+ scopesToQuery = [...new Set(["header", "document", ...view.scopes])];
173
+ }
174
+ else {
175
+ // If scopes is undefined, null, or empty array [], get all scopes (no filter)
176
+ scopesToQuery = [];
177
+ }
178
+ // Build query to get snapshots
179
+ let query = this.db
180
+ .selectFrom("DocumentSnapshot")
181
+ .selectAll()
182
+ .where("documentId", "=", documentId)
183
+ .where("branch", "=", branch)
184
+ .where("isDeleted", "=", false);
185
+ // Apply scope filter if we have specific scopes to query
186
+ if (scopesToQuery.length > 0) {
187
+ query = query.where("scope", "in", scopesToQuery);
188
+ }
189
+ // Execute the query
190
+ const snapshots = await query.execute();
191
+ if (snapshots.length === 0) {
192
+ throw new Error(`Document not found: ${documentId}`);
193
+ }
194
+ if (signal?.aborted) {
195
+ throw new Error("Operation aborted");
196
+ }
197
+ // Find the header snapshot
198
+ const headerSnapshot = snapshots.find((s) => s.scope === "header");
199
+ if (!headerSnapshot) {
200
+ throw new Error(`Document header not found: ${documentId}`);
201
+ }
202
+ // Parse the header
203
+ let header;
204
+ try {
205
+ header = JSON.parse(headerSnapshot.content);
206
+ }
207
+ catch (error) {
208
+ throw new Error(`Failed to parse header for document ${documentId}: ${error instanceof Error ? error.message : String(error)}`);
209
+ }
210
+ // Reconstruct cross-scope header metadata (revision, lastModifiedAtUtcIso)
211
+ // by aggregating information from all scopes
212
+ const revisions = await this.operationStore.getRevisions(documentId, branch, signal);
213
+ header.revision = revisions.revision;
214
+ header.lastModifiedAtUtcIso = revisions.latestTimestamp;
215
+ // Reconstruct the document state from all snapshots
216
+ // Note: exclude "header" scope from state since it's already in the header field
217
+ const state = {};
218
+ for (const snapshot of snapshots) {
219
+ // Skip header scope - it's stored separately in the header field
220
+ if (snapshot.scope === "header") {
221
+ continue;
222
+ }
223
+ try {
224
+ const scopeState = JSON.parse(snapshot.content);
225
+ state[snapshot.scope] = scopeState;
226
+ }
227
+ catch {
228
+ // Failed to parse snapshot content, use empty state
229
+ state[snapshot.scope] = {};
230
+ }
231
+ }
232
+ // Retrieve operations from the operation store to match legacy storage format
233
+ const operations = {};
234
+ // Get all operations for this document across all scopes
235
+ const allOps = await this.operationStore.getSinceId(0, undefined, signal);
236
+ const docOps = allOps.items.filter((op) => op.context.documentId === documentId && op.context.branch === branch);
237
+ // Group operations by scope and normalize to match legacy storage structure
238
+ for (const { operation, context } of docOps) {
239
+ operations[context.scope] ??= [];
240
+ // Normalize operation to match legacy storage format
241
+ // Legacy storage includes redundant top-level fields that duplicate action fields
242
+ const normalizedOp = {
243
+ action: operation.action,
244
+ index: operation.index,
245
+ timestampUtcMs: operation.timestampUtcMs,
246
+ hash: operation.hash,
247
+ skip: operation.skip,
248
+ // Add top-level fields that mirror action fields (legacy format)
249
+ ...operation.action,
250
+ // Legacy storage includes these optional fields
251
+ error: operation.error,
252
+ resultingState: operation.resultingState,
253
+ };
254
+ operations[context.scope].push(normalizedOp);
255
+ }
256
+ // Construct the PHDocument
257
+ const document = {
258
+ header,
259
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
260
+ state: state,
261
+ operations,
262
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
263
+ initialState: state,
264
+ clipboard: [],
265
+ };
266
+ return document;
267
+ }
268
+ async checkTablesExist() {
269
+ try {
270
+ // Try to query ViewState table
271
+ await this.db
272
+ .selectFrom("ViewState")
273
+ .select("lastOperationId")
274
+ .limit(1)
275
+ .execute();
276
+ return true;
277
+ }
278
+ catch {
279
+ return false;
280
+ }
281
+ }
282
+ async createTablesIfNotExist() {
283
+ // Check if tables exist by trying to query them
284
+ const tablesExist = await this.checkTablesExist();
285
+ if (!tablesExist) {
286
+ // Create ViewState table
287
+ await this.db.schema
288
+ .createTable("ViewState")
289
+ .ifNotExists()
290
+ .addColumn("lastOperationId", "integer", (col) => col.primaryKey())
291
+ .addColumn("lastOperationTimestamp", "timestamptz", (col) => col.defaultTo("now()").notNull())
292
+ .execute();
293
+ // Create DocumentSnapshot table
294
+ await this.db.schema
295
+ .createTable("DocumentSnapshot")
296
+ .ifNotExists()
297
+ .addColumn("id", "text", (col) => col.primaryKey())
298
+ .addColumn("documentId", "text", (col) => col.notNull())
299
+ .addColumn("slug", "text")
300
+ .addColumn("name", "text")
301
+ .addColumn("scope", "text", (col) => col.notNull())
302
+ .addColumn("branch", "text", (col) => col.notNull())
303
+ .addColumn("content", "text", (col) => col.notNull())
304
+ .addColumn("documentType", "text", (col) => col.notNull())
305
+ .addColumn("lastOperationIndex", "integer", (col) => col.notNull())
306
+ .addColumn("lastOperationHash", "text", (col) => col.notNull())
307
+ .addColumn("lastUpdatedAt", "timestamptz", (col) => col.defaultTo("now()").notNull())
308
+ .addColumn("snapshotVersion", "integer", (col) => col.defaultTo(1).notNull())
309
+ .addColumn("identifiers", "text")
310
+ .addColumn("metadata", "text")
311
+ .addColumn("isDeleted", "boolean", (col) => col.defaultTo(false).notNull())
312
+ .addColumn("deletedAt", "timestamptz")
313
+ .addUniqueConstraint("unique_doc_scope_branch", [
314
+ "documentId",
315
+ "scope",
316
+ "branch",
317
+ ])
318
+ .execute();
319
+ // Create indexes for DocumentSnapshot
320
+ await this.db.schema
321
+ .createIndex("idx_slug_scope_branch")
322
+ .on("DocumentSnapshot")
323
+ .columns(["slug", "scope", "branch"])
324
+ .execute();
325
+ await this.db.schema
326
+ .createIndex("idx_doctype_scope_branch")
327
+ .on("DocumentSnapshot")
328
+ .columns(["documentType", "scope", "branch"])
329
+ .execute();
330
+ await this.db.schema
331
+ .createIndex("idx_last_updated")
332
+ .on("DocumentSnapshot")
333
+ .column("lastUpdatedAt")
334
+ .execute();
335
+ await this.db.schema
336
+ .createIndex("idx_is_deleted")
337
+ .on("DocumentSnapshot")
338
+ .column("isDeleted")
339
+ .execute();
340
+ // Create SlugMapping table
341
+ await this.db.schema
342
+ .createTable("SlugMapping")
343
+ .ifNotExists()
344
+ .addColumn("slug", "text", (col) => col.primaryKey())
345
+ .addColumn("documentId", "text", (col) => col.notNull())
346
+ .addColumn("scope", "text", (col) => col.notNull())
347
+ .addColumn("branch", "text", (col) => col.notNull())
348
+ .addColumn("createdAt", "timestamptz", (col) => col.defaultTo("now()").notNull())
349
+ .addColumn("updatedAt", "timestamptz", (col) => col.defaultTo("now()").notNull())
350
+ .addUniqueConstraint("unique_docid_scope_branch", [
351
+ "documentId",
352
+ "scope",
353
+ "branch",
354
+ ])
355
+ .execute();
356
+ // Create index for SlugMapping
357
+ await this.db.schema
358
+ .createIndex("idx_slug_documentid")
359
+ .on("SlugMapping")
360
+ .column("documentId")
361
+ .execute();
362
+ }
363
+ }
364
+ }
365
+ //# sourceMappingURL=document-view.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"document-view.js","sourceRoot":"","sources":["../../../src/read-models/document-view.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ import type { OperationWithContext } from "../storage/interfaces.js";
2
+ /**
3
+ * Generic interface for any read model that can index operations.
4
+ * Implementations include IDocumentView, search indices, caches, etc.
5
+ */
6
+ export interface IReadModel {
7
+ /**
8
+ * Indexes a list of operations into the read model.
9
+ * This method is called asynchronously when operations are written to the operation store.
10
+ *
11
+ * @param operations - The operations with their context to index
12
+ */
13
+ indexOperations(operations: OperationWithContext[]): Promise<void>;
14
+ }
15
+ /**
16
+ * Coordinates read model synchronization with operation writes.
17
+ * Listens to operation events from the event bus and updates all registered read models.
18
+ */
19
+ export interface IReadModelCoordinator {
20
+ /**
21
+ * Start listening for operation events and updating read models.
22
+ */
23
+ start(): void;
24
+ /**
25
+ * Stop listening and clean up subscriptions.
26
+ */
27
+ stop(): void;
28
+ }
29
+ //# sourceMappingURL=interfaces.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../../../src/read-models/interfaces.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAErE;;;GAGG;AACH,MAAM,WAAW,UAAU;IACzB;;;;;OAKG;IACH,eAAe,CAAC,UAAU,EAAE,oBAAoB,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACpE;AAED;;;GAGG;AACH,MAAM,WAAW,qBAAqB;IACpC;;OAEG;IACH,KAAK,IAAI,IAAI,CAAC;IAEd;;OAEG;IACH,IAAI,IAAI,IAAI,CAAC;CACd"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=interfaces.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interfaces.js","sourceRoot":"","sources":["../../../src/read-models/interfaces.ts"],"names":[],"mappings":""}
@@ -0,0 +1,46 @@
1
+ import type { Generated, Insertable, Selectable, Updateable } from "kysely";
2
+ export interface ViewStateTable {
3
+ lastOperationId: number;
4
+ lastOperationTimestamp: Generated<Date>;
5
+ }
6
+ export interface DocumentSnapshotTable {
7
+ id: Generated<string>;
8
+ documentId: string;
9
+ slug: string | null;
10
+ name: string | null;
11
+ scope: string;
12
+ branch: string;
13
+ content: string;
14
+ documentType: string;
15
+ lastOperationIndex: number;
16
+ lastOperationHash: string;
17
+ lastUpdatedAt: Generated<Date>;
18
+ snapshotVersion: Generated<number>;
19
+ identifiers: string | null;
20
+ metadata: string | null;
21
+ isDeleted: Generated<boolean>;
22
+ deletedAt: Date | null;
23
+ }
24
+ export interface SlugMappingTable {
25
+ slug: string;
26
+ documentId: string;
27
+ scope: string;
28
+ branch: string;
29
+ createdAt: Generated<Date>;
30
+ updatedAt: Generated<Date>;
31
+ }
32
+ export interface DocumentViewDatabase {
33
+ ViewState: ViewStateTable;
34
+ DocumentSnapshot: DocumentSnapshotTable;
35
+ SlugMapping: SlugMappingTable;
36
+ }
37
+ export type ViewStateRow = Selectable<ViewStateTable>;
38
+ export type InsertableViewState = Insertable<ViewStateTable>;
39
+ export type UpdateableViewState = Updateable<ViewStateTable>;
40
+ export type DocumentSnapshotRow = Selectable<DocumentSnapshotTable>;
41
+ export type InsertableDocumentSnapshot = Insertable<DocumentSnapshotTable>;
42
+ export type UpdateableDocumentSnapshot = Updateable<DocumentSnapshotTable>;
43
+ export type SlugMappingRow = Selectable<SlugMappingTable>;
44
+ export type InsertableSlugMapping = Insertable<SlugMappingTable>;
45
+ export type UpdateableSlugMapping = Updateable<SlugMappingTable>;
46
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/read-models/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAE5E,MAAM,WAAW,cAAc;IAC7B,eAAe,EAAE,MAAM,CAAC;IACxB,sBAAsB,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;CACzC;AAED,MAAM,WAAW,qBAAqB;IACpC,EAAE,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,aAAa,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;IAC/B,eAAe,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;IACnC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,SAAS,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC;IAC9B,SAAS,EAAE,IAAI,GAAG,IAAI,CAAC;CACxB;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;IAC3B,SAAS,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;CAC5B;AAED,MAAM,WAAW,oBAAoB;IACnC,SAAS,EAAE,cAAc,CAAC;IAC1B,gBAAgB,EAAE,qBAAqB,CAAC;IACxC,WAAW,EAAE,gBAAgB,CAAC;CAC/B;AAED,MAAM,MAAM,YAAY,GAAG,UAAU,CAAC,cAAc,CAAC,CAAC;AACtD,MAAM,MAAM,mBAAmB,GAAG,UAAU,CAAC,cAAc,CAAC,CAAC;AAC7D,MAAM,MAAM,mBAAmB,GAAG,UAAU,CAAC,cAAc,CAAC,CAAC;AAE7D,MAAM,MAAM,mBAAmB,GAAG,UAAU,CAAC,qBAAqB,CAAC,CAAC;AACpE,MAAM,MAAM,0BAA0B,GAAG,UAAU,CAAC,qBAAqB,CAAC,CAAC;AAC3E,MAAM,MAAM,0BAA0B,GAAG,UAAU,CAAC,qBAAqB,CAAC,CAAC;AAE3E,MAAM,MAAM,cAAc,GAAG,UAAU,CAAC,gBAAgB,CAAC,CAAC;AAC1D,MAAM,MAAM,qBAAqB,GAAG,UAAU,CAAC,gBAAgB,CAAC,CAAC;AACjE,MAAM,MAAM,qBAAqB,GAAG,UAAU,CAAC,gBAAgB,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/read-models/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,62 @@
1
+ import type { DocumentModelModule } from "document-model";
2
+ import type { IDocumentModelRegistry } from "./interfaces.js";
3
+ /**
4
+ * Error thrown when a document model module is not found in the registry.
5
+ */
6
+ export declare class ModuleNotFoundError extends Error {
7
+ constructor(documentType: string);
8
+ }
9
+ /**
10
+ * Error thrown when attempting to register a module that already exists.
11
+ */
12
+ export declare class DuplicateModuleError extends Error {
13
+ constructor(documentType: string);
14
+ }
15
+ /**
16
+ * Error thrown when a module is invalid or malformed.
17
+ */
18
+ export declare class InvalidModuleError extends Error {
19
+ constructor(message: string);
20
+ }
21
+ /**
22
+ * In-memory implementation of the IDocumentModelRegistry interface.
23
+ * Manages document model modules and provides centralized access to their reducers, utils, and specifications.
24
+ */
25
+ export declare class DocumentModelRegistry implements IDocumentModelRegistry {
26
+ private modules;
27
+ /**
28
+ * Register multiple modules at once.
29
+ *
30
+ * @param modules Document model modules to register
31
+ * @throws DuplicateModuleError if a module with the same document type is already registered
32
+ * @throws InvalidModuleError if a module is malformed
33
+ */
34
+ registerModules(...modules: DocumentModelModule<any>[]): void;
35
+ /**
36
+ * Unregister multiple document model modules at once.
37
+ *
38
+ * @param documentTypes The document types to unregister
39
+ * @returns true if all modules were unregistered, false if any were not found
40
+ */
41
+ unregisterModules(...documentTypes: string[]): boolean;
42
+ /**
43
+ * Get a specific document model module by document type.
44
+ *
45
+ * @param documentType The document type identifier
46
+ * @returns The document model module
47
+ * @throws ModuleNotFoundError if the document type is not registered
48
+ */
49
+ getModule(documentType: string): DocumentModelModule<any>;
50
+ /**
51
+ * Get all registered document model modules.
52
+ * Note: This only returns loaded modules, not lazy-loaded ones.
53
+ *
54
+ * @returns Array of all registered modules
55
+ */
56
+ getAllModules(): DocumentModelModule<any>[];
57
+ /**
58
+ * Clear all registered modules
59
+ */
60
+ clear(): void;
61
+ }
62
+ //# sourceMappingURL=implementation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"implementation.d.ts","sourceRoot":"","sources":["../../../src/registry/implementation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAC1D,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AAE9D;;GAEG;AACH,qBAAa,mBAAoB,SAAQ,KAAK;gBAChC,YAAY,EAAE,MAAM;CAIjC;AAED;;GAEG;AACH,qBAAa,oBAAqB,SAAQ,KAAK;gBACjC,YAAY,EAAE,MAAM;CAIjC;AAED;;GAEG;AACH,qBAAa,kBAAmB,SAAQ,KAAK;gBAC/B,OAAO,EAAE,MAAM;CAI5B;AAED;;;GAGG;AACH,qBAAa,qBAAsB,YAAW,sBAAsB;IAClE,OAAO,CAAC,OAAO,CAA+C;IAE9D;;;;;;OAMG;IACH,eAAe,CAAC,GAAG,OAAO,EAAE,mBAAmB,CAAC,GAAG,CAAC,EAAE,GAAG,IAAI;IAY7D;;;;;OAKG;IACH,iBAAiB,CAAC,GAAG,aAAa,EAAE,MAAM,EAAE,GAAG,OAAO;IAatD;;;;;;OAMG;IACH,SAAS,CAAC,YAAY,EAAE,MAAM,GAAG,mBAAmB,CAAC,GAAG,CAAC;IAUzD;;;;;OAKG;IACH,aAAa,IAAI,mBAAmB,CAAC,GAAG,CAAC,EAAE;IAI3C;;OAEG;IACH,KAAK,IAAI,IAAI;CAGd"}