@powerhousedao/reactor 5.1.0-dev.4 → 5.1.0-dev.41

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 (222) hide show
  1. package/dist/src/actions/index.d.ts +24 -0
  2. package/dist/src/actions/index.d.ts.map +1 -0
  3. package/dist/src/actions/index.js +76 -0
  4. package/dist/src/actions/index.js.map +1 -0
  5. package/dist/src/cache/document-meta-cache-types.d.ts +114 -0
  6. package/dist/src/cache/document-meta-cache-types.d.ts.map +1 -0
  7. package/dist/src/cache/document-meta-cache-types.js +2 -0
  8. package/dist/src/cache/document-meta-cache-types.js.map +1 -0
  9. package/dist/src/cache/document-meta-cache.d.ts +30 -0
  10. package/dist/src/cache/document-meta-cache.d.ts.map +1 -0
  11. package/dist/src/cache/document-meta-cache.js +128 -0
  12. package/dist/src/cache/document-meta-cache.js.map +1 -0
  13. package/dist/src/cache/kysely-operation-index.d.ts +4 -2
  14. package/dist/src/cache/kysely-operation-index.d.ts.map +1 -1
  15. package/dist/src/cache/kysely-operation-index.js +67 -24
  16. package/dist/src/cache/kysely-operation-index.js.map +1 -1
  17. package/dist/src/cache/kysely-write-cache.d.ts.map +1 -1
  18. package/dist/src/cache/kysely-write-cache.js +3 -2
  19. package/dist/src/cache/kysely-write-cache.js.map +1 -1
  20. package/dist/src/cache/operation-index-types.d.ts +4 -3
  21. package/dist/src/cache/operation-index-types.d.ts.map +1 -1
  22. package/dist/src/cache/operation-index-types.js.map +1 -1
  23. package/dist/src/client/reactor-client.d.ts +16 -4
  24. package/dist/src/client/reactor-client.d.ts.map +1 -1
  25. package/dist/src/client/reactor-client.js +122 -5
  26. package/dist/src/client/reactor-client.js.map +1 -1
  27. package/dist/src/client/types.d.ts +22 -3
  28. package/dist/src/client/types.d.ts.map +1 -1
  29. package/dist/src/core/reactor-builder.d.ts +18 -12
  30. package/dist/src/core/reactor-builder.d.ts.map +1 -1
  31. package/dist/src/core/reactor-builder.js +88 -24
  32. package/dist/src/core/reactor-builder.js.map +1 -1
  33. package/dist/src/core/{builder.d.ts → reactor-client-builder.d.ts} +20 -4
  34. package/dist/src/core/reactor-client-builder.d.ts.map +1 -0
  35. package/dist/src/core/reactor-client-builder.js +123 -0
  36. package/dist/src/core/reactor-client-builder.js.map +1 -0
  37. package/dist/src/core/reactor.d.ts +11 -10
  38. package/dist/src/core/reactor.d.ts.map +1 -1
  39. package/dist/src/core/reactor.js +78 -91
  40. package/dist/src/core/reactor.js.map +1 -1
  41. package/dist/src/core/types.d.ts +40 -7
  42. package/dist/src/core/types.d.ts.map +1 -1
  43. package/dist/src/core/utils.d.ts +1 -2
  44. package/dist/src/core/utils.d.ts.map +1 -1
  45. package/dist/src/core/utils.js +2 -2
  46. package/dist/src/core/utils.js.map +1 -1
  47. package/dist/src/events/types.d.ts +1 -0
  48. package/dist/src/events/types.d.ts.map +1 -1
  49. package/dist/src/executor/simple-job-executor-manager.d.ts +3 -1
  50. package/dist/src/executor/simple-job-executor-manager.d.ts.map +1 -1
  51. package/dist/src/executor/simple-job-executor-manager.js +10 -7
  52. package/dist/src/executor/simple-job-executor-manager.js.map +1 -1
  53. package/dist/src/executor/simple-job-executor.d.ts +18 -3
  54. package/dist/src/executor/simple-job-executor.d.ts.map +1 -1
  55. package/dist/src/executor/simple-job-executor.js +327 -221
  56. package/dist/src/executor/simple-job-executor.js.map +1 -1
  57. package/dist/src/executor/types.d.ts +2 -8
  58. package/dist/src/executor/types.d.ts.map +1 -1
  59. package/dist/src/executor/types.js.map +1 -1
  60. package/dist/src/executor/util.d.ts +14 -5
  61. package/dist/src/executor/util.d.ts.map +1 -1
  62. package/dist/src/executor/util.js +36 -9
  63. package/dist/src/executor/util.js.map +1 -1
  64. package/dist/src/index.d.ts +16 -5
  65. package/dist/src/index.d.ts.map +1 -1
  66. package/dist/src/index.js +15 -3
  67. package/dist/src/index.js.map +1 -1
  68. package/dist/src/logging/console.d.ts +23 -0
  69. package/dist/src/logging/console.d.ts.map +1 -0
  70. package/dist/src/logging/console.js +108 -0
  71. package/dist/src/logging/console.js.map +1 -0
  72. package/dist/src/logging/types.d.ts +12 -0
  73. package/dist/src/logging/types.d.ts.map +1 -0
  74. package/dist/src/logging/types.js +2 -0
  75. package/dist/src/logging/types.js.map +1 -0
  76. package/dist/src/processors/index.d.ts +3 -0
  77. package/dist/src/processors/index.d.ts.map +1 -0
  78. package/dist/src/processors/index.js +2 -0
  79. package/dist/src/processors/index.js.map +1 -0
  80. package/dist/src/processors/processor-manager.d.ts +38 -0
  81. package/dist/src/processors/processor-manager.d.ts.map +1 -0
  82. package/dist/src/processors/processor-manager.js +165 -0
  83. package/dist/src/processors/processor-manager.js.map +1 -0
  84. package/dist/src/processors/types.d.ts +63 -0
  85. package/dist/src/processors/types.d.ts.map +1 -0
  86. package/dist/src/processors/types.js +2 -0
  87. package/dist/src/processors/types.js.map +1 -0
  88. package/dist/src/processors/utils.d.ts +10 -0
  89. package/dist/src/processors/utils.d.ts.map +1 -0
  90. package/dist/src/processors/utils.js +58 -0
  91. package/dist/src/processors/utils.js.map +1 -0
  92. package/dist/src/queue/types.d.ts +2 -0
  93. package/dist/src/queue/types.d.ts.map +1 -1
  94. package/dist/src/queue/types.js.map +1 -1
  95. package/dist/src/read-models/base-read-model.d.ts +60 -0
  96. package/dist/src/read-models/base-read-model.d.ts.map +1 -0
  97. package/dist/src/read-models/base-read-model.js +143 -0
  98. package/dist/src/read-models/base-read-model.js.map +1 -0
  99. package/dist/src/read-models/coordinator.d.ts +3 -2
  100. package/dist/src/read-models/coordinator.d.ts.map +1 -1
  101. package/dist/src/read-models/coordinator.js +12 -13
  102. package/dist/src/read-models/coordinator.js.map +1 -1
  103. package/dist/src/read-models/document-view.d.ts +6 -7
  104. package/dist/src/read-models/document-view.d.ts.map +1 -1
  105. package/dist/src/read-models/document-view.js +18 -81
  106. package/dist/src/read-models/document-view.js.map +1 -1
  107. package/dist/src/read-models/types.d.ts +2 -1
  108. package/dist/src/read-models/types.d.ts.map +1 -1
  109. package/dist/src/registry/implementation.d.ts +42 -34
  110. package/dist/src/registry/implementation.d.ts.map +1 -1
  111. package/dist/src/registry/implementation.js +168 -48
  112. package/dist/src/registry/implementation.js.map +1 -1
  113. package/dist/src/registry/interfaces.d.ts +69 -8
  114. package/dist/src/registry/interfaces.d.ts.map +1 -1
  115. package/dist/src/shared/errors.d.ts +16 -0
  116. package/dist/src/shared/errors.d.ts.map +1 -1
  117. package/dist/src/shared/errors.js +28 -0
  118. package/dist/src/shared/errors.js.map +1 -1
  119. package/dist/src/shared/types.d.ts +4 -0
  120. package/dist/src/shared/types.d.ts.map +1 -1
  121. package/dist/src/shared/types.js.map +1 -1
  122. package/dist/src/signer/passthrough-signer.d.ts +9 -3
  123. package/dist/src/signer/passthrough-signer.d.ts.map +1 -1
  124. package/dist/src/signer/passthrough-signer.js +13 -0
  125. package/dist/src/signer/passthrough-signer.js.map +1 -1
  126. package/dist/src/signer/types.d.ts +12 -10
  127. package/dist/src/signer/types.d.ts.map +1 -1
  128. package/dist/src/storage/consistency-aware-legacy-storage.d.ts +33 -0
  129. package/dist/src/storage/consistency-aware-legacy-storage.d.ts.map +1 -0
  130. package/dist/src/storage/consistency-aware-legacy-storage.js +65 -0
  131. package/dist/src/storage/consistency-aware-legacy-storage.js.map +1 -0
  132. package/dist/src/storage/interfaces.d.ts +94 -1
  133. package/dist/src/storage/interfaces.d.ts.map +1 -1
  134. package/dist/src/storage/interfaces.js +2 -2
  135. package/dist/src/storage/interfaces.js.map +1 -1
  136. package/dist/src/storage/kysely/store.d.ts +1 -0
  137. package/dist/src/storage/kysely/store.d.ts.map +1 -1
  138. package/dist/src/storage/kysely/store.js +40 -3
  139. package/dist/src/storage/kysely/store.js.map +1 -1
  140. package/dist/src/storage/kysely/sync-cursor-storage.js +2 -2
  141. package/dist/src/storage/kysely/sync-cursor-storage.js.map +1 -1
  142. package/dist/src/storage/kysely/sync-remote-storage.js +8 -8
  143. package/dist/src/storage/kysely/sync-remote-storage.js.map +1 -1
  144. package/dist/src/storage/kysely/types.d.ts +6 -6
  145. package/dist/src/storage/migrations/001_create_operation_table.d.ts.map +1 -1
  146. package/dist/src/storage/migrations/001_create_operation_table.js +2 -1
  147. package/dist/src/storage/migrations/001_create_operation_table.js.map +1 -1
  148. package/dist/src/storage/migrations/008_create_view_state_table.d.ts +1 -1
  149. package/dist/src/storage/migrations/008_create_view_state_table.d.ts.map +1 -1
  150. package/dist/src/storage/migrations/008_create_view_state_table.js +2 -1
  151. package/dist/src/storage/migrations/008_create_view_state_table.js.map +1 -1
  152. package/dist/src/storage/migrations/009_create_operation_index_tables.js +1 -1
  153. package/dist/src/storage/migrations/009_create_operation_index_tables.js.map +1 -1
  154. package/dist/src/storage/migrations/010_create_sync_tables.js +5 -5
  155. package/dist/src/storage/migrations/010_create_sync_tables.js.map +1 -1
  156. package/dist/src/storage/migrations/migrator.d.ts +3 -2
  157. package/dist/src/storage/migrations/migrator.d.ts.map +1 -1
  158. package/dist/src/storage/migrations/migrator.js +29 -6
  159. package/dist/src/storage/migrations/migrator.js.map +1 -1
  160. package/dist/src/storage/migrations/run-migrations.js +3 -3
  161. package/dist/src/storage/migrations/run-migrations.js.map +1 -1
  162. package/dist/src/storage/txn.d.ts.map +1 -1
  163. package/dist/src/storage/txn.js +2 -3
  164. package/dist/src/storage/txn.js.map +1 -1
  165. package/dist/src/subs/subscription-notification-read-model.d.ts +17 -0
  166. package/dist/src/subs/subscription-notification-read-model.d.ts.map +1 -0
  167. package/dist/src/subs/subscription-notification-read-model.js +62 -0
  168. package/dist/src/subs/subscription-notification-read-model.js.map +1 -0
  169. package/dist/src/sync/channels/composite-channel-factory.d.ts +30 -0
  170. package/dist/src/sync/channels/composite-channel-factory.d.ts.map +1 -0
  171. package/dist/src/sync/channels/composite-channel-factory.js +87 -0
  172. package/dist/src/sync/channels/composite-channel-factory.js.map +1 -0
  173. package/dist/src/sync/channels/gql-channel-factory.d.ts +5 -2
  174. package/dist/src/sync/channels/gql-channel-factory.d.ts.map +1 -1
  175. package/dist/src/sync/channels/gql-channel-factory.js +8 -2
  176. package/dist/src/sync/channels/gql-channel-factory.js.map +1 -1
  177. package/dist/src/sync/channels/gql-channel.d.ts +28 -1
  178. package/dist/src/sync/channels/gql-channel.d.ts.map +1 -1
  179. package/dist/src/sync/channels/gql-channel.js +150 -22
  180. package/dist/src/sync/channels/gql-channel.js.map +1 -1
  181. package/dist/src/sync/channels/index.d.ts +2 -1
  182. package/dist/src/sync/channels/index.d.ts.map +1 -1
  183. package/dist/src/sync/channels/index.js +2 -1
  184. package/dist/src/sync/channels/index.js.map +1 -1
  185. package/dist/src/sync/channels/polling-channel.d.ts +39 -0
  186. package/dist/src/sync/channels/polling-channel.d.ts.map +1 -0
  187. package/dist/src/sync/channels/polling-channel.js +72 -0
  188. package/dist/src/sync/channels/polling-channel.js.map +1 -0
  189. package/dist/src/sync/channels/utils.d.ts +17 -2
  190. package/dist/src/sync/channels/utils.d.ts.map +1 -1
  191. package/dist/src/sync/channels/utils.js +76 -6
  192. package/dist/src/sync/channels/utils.js.map +1 -1
  193. package/dist/src/sync/errors.d.ts +1 -1
  194. package/dist/src/sync/errors.d.ts.map +1 -1
  195. package/dist/src/sync/errors.js +2 -2
  196. package/dist/src/sync/errors.js.map +1 -1
  197. package/dist/src/sync/index.d.ts +2 -2
  198. package/dist/src/sync/index.d.ts.map +1 -1
  199. package/dist/src/sync/index.js +2 -2
  200. package/dist/src/sync/index.js.map +1 -1
  201. package/dist/src/sync/interfaces.d.ts +16 -1
  202. package/dist/src/sync/interfaces.d.ts.map +1 -1
  203. package/dist/src/sync/sync-builder.d.ts +3 -2
  204. package/dist/src/sync/sync-builder.d.ts.map +1 -1
  205. package/dist/src/sync/sync-builder.js +4 -4
  206. package/dist/src/sync/sync-builder.js.map +1 -1
  207. package/dist/src/sync/sync-manager.d.ts +4 -1
  208. package/dist/src/sync/sync-manager.d.ts.map +1 -1
  209. package/dist/src/sync/sync-manager.js +65 -8
  210. package/dist/src/sync/sync-manager.js.map +1 -1
  211. package/dist/src/sync/utils.d.ts +19 -0
  212. package/dist/src/sync/utils.d.ts.map +1 -1
  213. package/dist/src/sync/utils.js +44 -0
  214. package/dist/src/sync/utils.js.map +1 -1
  215. package/package.json +4 -4
  216. package/dist/src/core/builder.d.ts.map +0 -1
  217. package/dist/src/core/builder.js +0 -88
  218. package/dist/src/core/builder.js.map +0 -1
  219. package/dist/src/sync/channels/internal-channel.d.ts +0 -57
  220. package/dist/src/sync/channels/internal-channel.d.ts.map +0 -1
  221. package/dist/src/sync/channels/internal-channel.js +0 -106
  222. package/dist/src/sync/channels/internal-channel.js.map +0 -1
@@ -0,0 +1,12 @@
1
+ export type LoggerErrorHandler = (...data: any[]) => void;
2
+ export type ILogger = {
3
+ level: "verbose" | "debug" | "info" | "warn" | "error";
4
+ verbose: (message: string, ...replacements: any[]) => void;
5
+ debug: (message: string, ...replacements: any[]) => void;
6
+ info: (message: string, ...replacements: any[]) => void;
7
+ warn: (message: string, ...replacements: any[]) => void;
8
+ error: (message: string, ...replacements: any[]) => void;
9
+ errorHandler: LoggerErrorHandler;
10
+ child: (tags: string[]) => ILogger;
11
+ };
12
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/logging/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,kBAAkB,GAAG,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,CAAC;AAE1D,MAAM,MAAM,OAAO,GAAG;IACpB,KAAK,EAAE,SAAS,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;IAEvD,OAAO,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,YAAY,EAAE,GAAG,EAAE,KAAK,IAAI,CAAC;IAC3D,KAAK,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,YAAY,EAAE,GAAG,EAAE,KAAK,IAAI,CAAC;IACzD,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,YAAY,EAAE,GAAG,EAAE,KAAK,IAAI,CAAC;IACxD,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,YAAY,EAAE,GAAG,EAAE,KAAK,IAAI,CAAC;IACxD,KAAK,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,YAAY,EAAE,GAAG,EAAE,KAAK,IAAI,CAAC;IAEzD,YAAY,EAAE,kBAAkB,CAAC;IAEjC,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC;CACpC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/logging/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,3 @@
1
+ export { ProcessorManager } from "./processor-manager.js";
2
+ export type { IProcessor, IProcessorManager, ProcessorFactory, ProcessorFilter, ProcessorRecord, } from "./types.js";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/processors/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,YAAY,EACV,UAAU,EACV,iBAAiB,EACjB,gBAAgB,EAChB,eAAe,EACf,eAAe,GAChB,MAAM,YAAY,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { ProcessorManager } from "./processor-manager.js";
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/processors/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC"}
@@ -0,0 +1,38 @@
1
+ import type { Kysely } from "kysely";
2
+ import type { IOperationIndex } from "../cache/operation-index-types.js";
3
+ import type { IWriteCache } from "../cache/write/interfaces.js";
4
+ import { BaseReadModel } from "../read-models/base-read-model.js";
5
+ import type { DocumentViewDatabase } from "../read-models/types.js";
6
+ import type { IConsistencyTracker } from "../shared/consistency-tracker.js";
7
+ import type { OperationWithContext } from "../storage/interfaces.js";
8
+ import type { IProcessorManager, ProcessorFactory, ProcessorRecord } from "./types.js";
9
+ /**
10
+ * Manages processor lifecycle based on operations.
11
+ * Extends BaseReadModel to receive operations from ReadModelCoordinator.
12
+ *
13
+ * Responsibilities:
14
+ * 1. Detect drive creation from CREATE_DOCUMENT operations
15
+ * 2. Create processors for each drive using registered factories
16
+ * 3. Route operations to matching processors based on filters
17
+ * 4. Clean up processors when drives are deleted or factories are unregistered
18
+ */
19
+ export declare class ProcessorManager extends BaseReadModel implements IProcessorManager {
20
+ private factoryRegistry;
21
+ private processorsByDrive;
22
+ private factoryToProcessors;
23
+ private knownDriveIds;
24
+ constructor(db: Kysely<DocumentViewDatabase>, operationIndex: IOperationIndex, writeCache: IWriteCache, consistencyTracker: IConsistencyTracker);
25
+ indexOperations(items: OperationWithContext[]): Promise<void>;
26
+ registerFactory(identifier: string, factory: ProcessorFactory): Promise<void>;
27
+ unregisterFactory(identifier: string): Promise<void>;
28
+ getFactoryIdentifiers(): string[];
29
+ getProcessorsForDrive(driveId: string): ProcessorRecord[];
30
+ private detectAndRegisterNewDrives;
31
+ private detectAndCleanupDeletedDrives;
32
+ private isDeletedDocumentADrive;
33
+ private createProcessorsForDrive;
34
+ private cleanupDriveProcessors;
35
+ private safeDisconnect;
36
+ private routeOperationsToProcessors;
37
+ }
38
+ //# sourceMappingURL=processor-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"processor-manager.d.ts","sourceRoot":"","sources":["../../../src/processors/processor-manager.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAe,MAAM,QAAQ,CAAC;AAClD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AACzE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,EAAE,aAAa,EAAE,MAAM,mCAAmC,CAAC;AAClE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AACpE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AAC5E,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AACrE,OAAO,KAAK,EAEV,iBAAiB,EACjB,gBAAgB,EAChB,eAAe,EAChB,MAAM,YAAY,CAAC;AAUpB;;;;;;;;;GASG;AACH,qBAAa,gBACX,SAAQ,aACR,YAAW,iBAAiB;IAE5B,OAAO,CAAC,eAAe,CAA4C;IACnE,OAAO,CAAC,iBAAiB,CAA6C;IACtE,OAAO,CAAC,mBAAmB,CACf;IACZ,OAAO,CAAC,aAAa,CAA0B;gBAG7C,EAAE,EAAE,MAAM,CAAC,oBAAoB,CAAC,EAChC,cAAc,EAAE,eAAe,EAC/B,UAAU,EAAE,WAAW,EACvB,kBAAkB,EAAE,mBAAmB;IAW1B,eAAe,CAAC,KAAK,EAAE,oBAAoB,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAiBtE,eAAe,CACnB,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,gBAAgB,GACxB,OAAO,CAAC,IAAI,CAAC;IAmBV,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAwB1D,qBAAqB,IAAI,MAAM,EAAE;IAIjC,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,eAAe,EAAE;YAI3C,0BAA0B;YAyB1B,6BAA6B;IAgB3C,OAAO,CAAC,uBAAuB;YAIjB,wBAAwB;YAgCxB,sBAAsB;YAetB,cAAc;YAQd,2BAA2B;CA+B1C"}
@@ -0,0 +1,165 @@
1
+ import { BaseReadModel } from "../read-models/base-read-model.js";
2
+ import { createMinimalDriveHeader, extractDeletedDocumentId, extractDriveHeader, isDriveCreation, isDriveDeletion, matchesFilter, } from "./utils.js";
3
+ /**
4
+ * Manages processor lifecycle based on operations.
5
+ * Extends BaseReadModel to receive operations from ReadModelCoordinator.
6
+ *
7
+ * Responsibilities:
8
+ * 1. Detect drive creation from CREATE_DOCUMENT operations
9
+ * 2. Create processors for each drive using registered factories
10
+ * 3. Route operations to matching processors based on filters
11
+ * 4. Clean up processors when drives are deleted or factories are unregistered
12
+ */
13
+ export class ProcessorManager extends BaseReadModel {
14
+ factoryRegistry = new Map();
15
+ processorsByDrive = new Map();
16
+ factoryToProcessors = new Map();
17
+ knownDriveIds = new Set();
18
+ constructor(db, operationIndex, writeCache, consistencyTracker) {
19
+ super(db, operationIndex, writeCache, consistencyTracker, "processor-manager");
20
+ }
21
+ async indexOperations(items) {
22
+ if (items.length === 0)
23
+ return;
24
+ await this.detectAndRegisterNewDrives(items);
25
+ await this.detectAndCleanupDeletedDrives(items);
26
+ await this.routeOperationsToProcessors(items);
27
+ await this.db.transaction().execute(async (trx) => {
28
+ await this.saveState(trx, items);
29
+ });
30
+ this.updateConsistencyTracker(items);
31
+ }
32
+ async registerFactory(identifier, factory) {
33
+ if (this.factoryRegistry.has(identifier)) {
34
+ await this.unregisterFactory(identifier);
35
+ }
36
+ this.factoryRegistry.set(identifier, factory);
37
+ this.factoryToProcessors.set(identifier, new Map());
38
+ for (const driveId of this.knownDriveIds) {
39
+ const driveHeader = createMinimalDriveHeader(driveId);
40
+ await this.createProcessorsForDrive(driveId, identifier, factory, driveHeader);
41
+ }
42
+ }
43
+ async unregisterFactory(identifier) {
44
+ const factoryProcessors = this.factoryToProcessors.get(identifier);
45
+ if (!factoryProcessors)
46
+ return;
47
+ for (const [driveId, records] of factoryProcessors) {
48
+ for (const record of records) {
49
+ await this.safeDisconnect(record.processor);
50
+ }
51
+ const driveProcessors = this.processorsByDrive.get(driveId);
52
+ if (driveProcessors) {
53
+ const remaining = driveProcessors.filter((p) => !records.includes(p));
54
+ if (remaining.length > 0) {
55
+ this.processorsByDrive.set(driveId, remaining);
56
+ }
57
+ else {
58
+ this.processorsByDrive.delete(driveId);
59
+ }
60
+ }
61
+ }
62
+ this.factoryToProcessors.delete(identifier);
63
+ this.factoryRegistry.delete(identifier);
64
+ }
65
+ getFactoryIdentifiers() {
66
+ return Array.from(this.factoryRegistry.keys());
67
+ }
68
+ getProcessorsForDrive(driveId) {
69
+ return this.processorsByDrive.get(driveId) ?? [];
70
+ }
71
+ async detectAndRegisterNewDrives(operations) {
72
+ for (const op of operations) {
73
+ if (!isDriveCreation(op))
74
+ continue;
75
+ const driveId = op.context.documentId;
76
+ if (this.knownDriveIds.has(driveId))
77
+ continue;
78
+ this.knownDriveIds.add(driveId);
79
+ const driveHeader = extractDriveHeader(op);
80
+ if (!driveHeader)
81
+ continue;
82
+ for (const [identifier, factory] of this.factoryRegistry) {
83
+ await this.createProcessorsForDrive(driveId, identifier, factory, driveHeader);
84
+ }
85
+ }
86
+ }
87
+ async detectAndCleanupDeletedDrives(operations) {
88
+ for (const op of operations) {
89
+ if (!isDriveDeletion(op))
90
+ continue;
91
+ const driveId = extractDeletedDocumentId(op);
92
+ if (!driveId || !this.knownDriveIds.has(driveId))
93
+ continue;
94
+ if (!this.isDeletedDocumentADrive(driveId))
95
+ continue;
96
+ await this.cleanupDriveProcessors(driveId);
97
+ this.knownDriveIds.delete(driveId);
98
+ }
99
+ }
100
+ isDeletedDocumentADrive(documentId) {
101
+ return this.knownDriveIds.has(documentId);
102
+ }
103
+ async createProcessorsForDrive(driveId, identifier, factory, driveHeader) {
104
+ let records = [];
105
+ try {
106
+ records = await factory(driveHeader);
107
+ }
108
+ catch (error) {
109
+ console.error(`ProcessorManager: Factory '${identifier}' failed for drive '${driveId}':`, error);
110
+ return;
111
+ }
112
+ if (records.length === 0)
113
+ return;
114
+ const factoryProcessors = this.factoryToProcessors.get(identifier);
115
+ if (factoryProcessors) {
116
+ factoryProcessors.set(driveId, records);
117
+ }
118
+ const existingDriveProcessors = this.processorsByDrive.get(driveId) ?? [];
119
+ this.processorsByDrive.set(driveId, [
120
+ ...existingDriveProcessors,
121
+ ...records,
122
+ ]);
123
+ }
124
+ async cleanupDriveProcessors(driveId) {
125
+ const processors = this.processorsByDrive.get(driveId);
126
+ if (!processors)
127
+ return;
128
+ for (const record of processors) {
129
+ await this.safeDisconnect(record.processor);
130
+ }
131
+ this.processorsByDrive.delete(driveId);
132
+ for (const factoryProcessors of this.factoryToProcessors.values()) {
133
+ factoryProcessors.delete(driveId);
134
+ }
135
+ }
136
+ async safeDisconnect(processor) {
137
+ try {
138
+ await processor.onDisconnect();
139
+ }
140
+ catch (error) {
141
+ console.error("ProcessorManager: Error disconnecting processor:", error);
142
+ }
143
+ }
144
+ async routeOperationsToProcessors(operations) {
145
+ const processorOperations = new Map();
146
+ for (const [, records] of this.processorsByDrive) {
147
+ for (const { processor, filter } of records) {
148
+ const matching = operations.filter((op) => matchesFilter(op, filter));
149
+ if (matching.length === 0)
150
+ continue;
151
+ const existing = processorOperations.get(processor) ?? [];
152
+ processorOperations.set(processor, [...existing, ...matching]);
153
+ }
154
+ }
155
+ await Promise.all(Array.from(processorOperations.entries()).map(async ([processor, ops]) => {
156
+ try {
157
+ await processor.onOperations(ops);
158
+ }
159
+ catch (error) {
160
+ console.error("ProcessorManager: Error in processor.onOperations:", error);
161
+ }
162
+ }));
163
+ }
164
+ }
165
+ //# sourceMappingURL=processor-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"processor-manager.js","sourceRoot":"","sources":["../../../src/processors/processor-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,63 @@
1
+ import type { PHDocumentHeader } from "document-model";
2
+ import type { OperationWithContext } from "../storage/interfaces.js";
3
+ /**
4
+ * Filter for matching operations to processors.
5
+ * All fields are optional arrays - when provided, operations must match at least one value in each specified field.
6
+ * When a field is undefined or empty, it matches all values for that field.
7
+ */
8
+ export type ProcessorFilter = {
9
+ documentType?: string[];
10
+ scope?: string[];
11
+ branch?: string[];
12
+ documentId?: string[];
13
+ };
14
+ /**
15
+ * Describes an object that can process operations.
16
+ */
17
+ export interface IProcessor {
18
+ /**
19
+ * Processes a list of operations with context.
20
+ * Called when operations match this processor's filter.
21
+ */
22
+ onOperations(operations: OperationWithContext[]): Promise<void>;
23
+ /**
24
+ * Called when the processor is disconnected.
25
+ * Used to clean up any resources allocated during processor creation.
26
+ */
27
+ onDisconnect(): Promise<void>;
28
+ }
29
+ /**
30
+ * Relates a processor to its filter configuration.
31
+ */
32
+ export type ProcessorRecord = {
33
+ processor: IProcessor;
34
+ filter: ProcessorFilter;
35
+ };
36
+ /**
37
+ * A factory function that creates processor records for a given drive.
38
+ * Called once per drive when the drive is first detected or when the factory is registered.
39
+ */
40
+ export type ProcessorFactory = (driveHeader: PHDocumentHeader) => ProcessorRecord[] | Promise<ProcessorRecord[]>;
41
+ /**
42
+ * Manages processor creation and destruction based on drive operations.
43
+ */
44
+ export interface IProcessorManager {
45
+ /**
46
+ * Registers a processor factory.
47
+ * Immediately creates processors for all existing drives.
48
+ */
49
+ registerFactory(identifier: string, factory: ProcessorFactory): Promise<void>;
50
+ /**
51
+ * Unregisters a processor factory and disconnects all processors it created.
52
+ */
53
+ unregisterFactory(identifier: string): Promise<void>;
54
+ /**
55
+ * Gets all registered factory identifiers.
56
+ */
57
+ getFactoryIdentifiers(): string[];
58
+ /**
59
+ * Gets all processor records for a specific drive.
60
+ */
61
+ getProcessorsForDrive(driveId: string): ProcessorRecord[];
62
+ }
63
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/processors/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAErE;;;;GAIG;AACH,MAAM,MAAM,eAAe,GAAG;IAC5B,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;CACvB,CAAC;AAEF;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB;;;OAGG;IACH,YAAY,CAAC,UAAU,EAAE,oBAAoB,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEhE;;;OAGG;IACH,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC/B;AAED;;GAEG;AACH,MAAM,MAAM,eAAe,GAAG;IAC5B,SAAS,EAAE,UAAU,CAAC;IACtB,MAAM,EAAE,eAAe,CAAC;CACzB,CAAC;AAEF;;;GAGG;AACH,MAAM,MAAM,gBAAgB,GAAG,CAC7B,WAAW,EAAE,gBAAgB,KAC1B,eAAe,EAAE,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,CAAC;AAEpD;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC;;;OAGG;IACH,eAAe,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE9E;;OAEG;IACH,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAErD;;OAEG;IACH,qBAAqB,IAAI,MAAM,EAAE,CAAC;IAElC;;OAEG;IACH,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,eAAe,EAAE,CAAC;CAC3D"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/processors/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,10 @@
1
+ import type { PHDocumentHeader } from "document-model";
2
+ import type { OperationWithContext } from "../storage/interfaces.js";
3
+ import type { ProcessorFilter } from "./types.js";
4
+ export declare function isDriveCreation(op: OperationWithContext): boolean;
5
+ export declare function isDriveDeletion(op: OperationWithContext): boolean;
6
+ export declare function extractDriveHeader(op: OperationWithContext): PHDocumentHeader | undefined;
7
+ export declare function extractDeletedDocumentId(op: OperationWithContext): string | undefined;
8
+ export declare function createMinimalDriveHeader(driveId: string): PHDocumentHeader;
9
+ export declare function matchesFilter(op: OperationWithContext, filter: ProcessorFilter): boolean;
10
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/processors/utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AACrE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAIlD,wBAAgB,eAAe,CAAC,EAAE,EAAE,oBAAoB,GAAG,OAAO,CAKjE;AAED,wBAAgB,eAAe,CAAC,EAAE,EAAE,oBAAoB,GAAG,OAAO,CAEjE;AAED,wBAAgB,kBAAkB,CAChC,EAAE,EAAE,oBAAoB,GACvB,gBAAgB,GAAG,SAAS,CAQ9B;AAED,wBAAgB,wBAAwB,CACtC,EAAE,EAAE,oBAAoB,GACvB,MAAM,GAAG,SAAS,CAGpB;AAED,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,MAAM,GAAG,gBAAgB,CAe1E;AAED,wBAAgB,aAAa,CAC3B,EAAE,EAAE,oBAAoB,EACxB,MAAM,EAAE,eAAe,GACtB,OAAO,CA0BT"}
@@ -0,0 +1,58 @@
1
+ const DRIVE_DOCUMENT_TYPE = "powerhouse/document-drive";
2
+ export function isDriveCreation(op) {
3
+ return (op.operation.action.type === "CREATE_DOCUMENT" &&
4
+ op.context.documentType === DRIVE_DOCUMENT_TYPE);
5
+ }
6
+ export function isDriveDeletion(op) {
7
+ return op.operation.action.type === "DELETE_DOCUMENT";
8
+ }
9
+ export function extractDriveHeader(op) {
10
+ if (!op.context.resultingState)
11
+ return undefined;
12
+ const state = JSON.parse(op.context.resultingState);
13
+ return state.header;
14
+ }
15
+ export function extractDeletedDocumentId(op) {
16
+ const input = op.operation.action.input;
17
+ return input.documentId ?? op.context.documentId;
18
+ }
19
+ export function createMinimalDriveHeader(driveId) {
20
+ return {
21
+ id: driveId,
22
+ documentType: DRIVE_DOCUMENT_TYPE,
23
+ sig: {
24
+ publicKey: {},
25
+ nonce: "",
26
+ },
27
+ slug: "",
28
+ name: "",
29
+ branch: "main",
30
+ revision: {},
31
+ createdAtUtcIso: new Date().toISOString(),
32
+ lastModifiedAtUtcIso: new Date().toISOString(),
33
+ };
34
+ }
35
+ export function matchesFilter(op, filter) {
36
+ if (filter.documentType && filter.documentType.length > 0) {
37
+ if (!filter.documentType.includes(op.context.documentType)) {
38
+ return false;
39
+ }
40
+ }
41
+ if (filter.scope && filter.scope.length > 0) {
42
+ if (!filter.scope.includes(op.context.scope)) {
43
+ return false;
44
+ }
45
+ }
46
+ if (filter.branch && filter.branch.length > 0) {
47
+ if (!filter.branch.includes(op.context.branch)) {
48
+ return false;
49
+ }
50
+ }
51
+ if (filter.documentId && filter.documentId.length > 0) {
52
+ if (!filter.documentId.includes(op.context.documentId)) {
53
+ return false;
54
+ }
55
+ }
56
+ return true;
57
+ }
58
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/processors/utils.ts"],"names":[],"mappings":"AAIA,MAAM,mBAAmB,GAAG,2BAA2B,CAAC;AAExD,MAAM,UAAU,eAAe,CAAC,EAAwB;IACtD,OAAO,CACL,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,KAAK,iBAAiB;QAC9C,EAAE,CAAC,OAAO,CAAC,YAAY,KAAK,mBAAmB,CAChD,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,EAAwB;IACtD,OAAO,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,KAAK,iBAAiB,CAAC;AACxD,CAAC;AAED,MAAM,UAAU,kBAAkB,CAChC,EAAwB;IAExB,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,cAAc;QAAE,OAAO,SAAS,CAAC;IAEjD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,CAAC,cAAc,CAGjD,CAAC;IACF,OAAO,KAAK,CAAC,MAAsC,CAAC;AACtD,CAAC;AAED,MAAM,UAAU,wBAAwB,CACtC,EAAwB;IAExB,MAAM,KAAK,GAAG,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,KAAgC,CAAC;IACnE,OAAO,KAAK,CAAC,UAAU,IAAI,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC;AACnD,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,OAAe;IACtD,OAAO;QACL,EAAE,EAAE,OAAO;QACX,YAAY,EAAE,mBAAmB;QACjC,GAAG,EAAE;YACH,SAAS,EAAE,EAAE;YACb,KAAK,EAAE,EAAE;SACV;QACD,IAAI,EAAE,EAAE;QACR,IAAI,EAAE,EAAE;QACR,MAAM,EAAE,MAAM;QACd,QAAQ,EAAE,EAAE;QACZ,eAAe,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACzC,oBAAoB,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KAC/C,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,aAAa,CAC3B,EAAwB,EACxB,MAAuB;IAEvB,IAAI,MAAM,CAAC,YAAY,IAAI,MAAM,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1D,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,EAAE,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,CAAC;YAC3D,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,IAAI,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5C,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YAC7C,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,IAAI,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9C,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YAC/C,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,IAAI,MAAM,CAAC,UAAU,IAAI,MAAM,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtD,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;YACvD,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -52,6 +52,8 @@ export type Job = {
52
52
  lastError?: ErrorInfo;
53
53
  /** History of all errors from each attempt (ordered) */
54
54
  errorHistory: ErrorInfo[];
55
+ /** Optional metadata that flows through the job lifecycle */
56
+ meta?: Record<string, unknown>;
55
57
  };
56
58
  /**
57
59
  * Event types for the queue system
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/queue/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAEpD,MAAM,MAAM,OAAO,GAAG,UAAU,GAAG,MAAM,CAAC;AAE1C;;GAEG;AACH,oBAAY,aAAa;IACvB,OAAO,KAAK;IACZ,aAAa,IAAI;IACjB,OAAO,IAAI;IACX,KAAK,IAAI;IACT,OAAO,IAAI;IACX,QAAQ,IAAI;CACb;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC;IAClB,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC;IAE9B,KAAK,IAAI,IAAI,CAAC;IACd,QAAQ,IAAI,IAAI,CAAC;IACjB,IAAI,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI,CAAC;CAC9B;AAED;;GAEG;AACH,MAAM,MAAM,GAAG,GAAG;IAChB,oCAAoC;IACpC,EAAE,EAAE,MAAM,CAAC;IAEX,iEAAiE;IACjE,IAAI,EAAE,OAAO,CAAC;IAEd,2CAA2C;IAC3C,UAAU,EAAE,MAAM,CAAC;IAEnB,kCAAkC;IAClC,KAAK,EAAE,MAAM,CAAC;IAEd,mCAAmC;IACnC,MAAM,EAAE,MAAM,CAAC;IAEf,0DAA0D;IAC1D,OAAO,EAAE,MAAM,EAAE,CAAC;IAElB,6DAA6D;IAC7D,UAAU,EAAE,SAAS,EAAE,CAAC;IAExB,yCAAyC;IACzC,SAAS,EAAE,MAAM,CAAC;IAElB,yDAAyD;IACzD,SAAS,EAAE,MAAM,EAAE,CAAC;IAEpB,+BAA+B;IAC/B,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB,wCAAwC;IACxC,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB,+BAA+B;IAC/B,SAAS,CAAC,EAAE,SAAS,CAAC;IAEtB,wDAAwD;IACxD,YAAY,EAAE,SAAS,EAAE,CAAC;CAC3B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,eAAe;;CAElB,CAAC;AAEX;;GAEG;AACH,MAAM,MAAM,iBAAiB,GAAG;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf,CAAC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/queue/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAEpD,MAAM,MAAM,OAAO,GAAG,UAAU,GAAG,MAAM,CAAC;AAE1C;;GAEG;AACH,oBAAY,aAAa;IACvB,OAAO,KAAK;IACZ,aAAa,IAAI;IACjB,OAAO,IAAI;IACX,KAAK,IAAI;IACT,OAAO,IAAI;IACX,QAAQ,IAAI;CACb;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC;IAClB,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC;IAE9B,KAAK,IAAI,IAAI,CAAC;IACd,QAAQ,IAAI,IAAI,CAAC;IACjB,IAAI,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI,CAAC;CAC9B;AAED;;GAEG;AACH,MAAM,MAAM,GAAG,GAAG;IAChB,oCAAoC;IACpC,EAAE,EAAE,MAAM,CAAC;IAEX,iEAAiE;IACjE,IAAI,EAAE,OAAO,CAAC;IAEd,2CAA2C;IAC3C,UAAU,EAAE,MAAM,CAAC;IAEnB,kCAAkC;IAClC,KAAK,EAAE,MAAM,CAAC;IAEd,mCAAmC;IACnC,MAAM,EAAE,MAAM,CAAC;IAEf,0DAA0D;IAC1D,OAAO,EAAE,MAAM,EAAE,CAAC;IAElB,6DAA6D;IAC7D,UAAU,EAAE,SAAS,EAAE,CAAC;IAExB,yCAAyC;IACzC,SAAS,EAAE,MAAM,CAAC;IAElB,yDAAyD;IACzD,SAAS,EAAE,MAAM,EAAE,CAAC;IAEpB,+BAA+B;IAC/B,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB,wCAAwC;IACxC,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB,+BAA+B;IAC/B,SAAS,CAAC,EAAE,SAAS,CAAC;IAEtB,wDAAwD;IACxD,YAAY,EAAE,SAAS,EAAE,CAAC;IAE1B,6DAA6D;IAC7D,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAChC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,eAAe;;CAElB,CAAC;AAEX;;GAEG;AACH,MAAM,MAAM,iBAAiB,GAAG;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/queue/types.ts"],"names":[],"mappings":"AAKA;;GAEG;AACH,MAAM,CAAN,IAAY,aAOX;AAPD,WAAY,aAAa;IACvB,wDAAY,CAAA;IACZ,mEAAiB,CAAA;IACjB,uDAAW,CAAA;IACX,mDAAS,CAAA;IACT,uDAAW,CAAA;IACX,yDAAY,CAAA;AACd,CAAC,EAPW,aAAa,KAAb,aAAa,QAOxB;AA0DD;;GAEG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,aAAa,EAAE,KAAK;CACZ,CAAC"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/queue/types.ts"],"names":[],"mappings":"AAKA;;GAEG;AACH,MAAM,CAAN,IAAY,aAOX;AAPD,WAAY,aAAa;IACvB,wDAAY,CAAA;IACZ,mEAAiB,CAAA;IACjB,uDAAW,CAAA;IACX,mDAAS,CAAA;IACT,uDAAW,CAAA;IACX,yDAAY,CAAA;AACd,CAAC,EAPW,aAAa,KAAb,aAAa,QAOxB;AA6DD;;GAEG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,aAAa,EAAE,KAAK;CACZ,CAAC"}
@@ -0,0 +1,60 @@
1
+ import type { Kysely, Transaction } from "kysely";
2
+ import type { IOperationIndex } from "../cache/operation-index-types.js";
3
+ import type { IWriteCache } from "../cache/write/interfaces.js";
4
+ import type { IConsistencyTracker } from "../shared/consistency-tracker.js";
5
+ import type { ConsistencyToken } from "../shared/types.js";
6
+ import type { OperationWithContext } from "../storage/interfaces.js";
7
+ import type { IReadModel } from "./interfaces.js";
8
+ import type { DocumentViewDatabase } from "./types.js";
9
+ /**
10
+ * Base class for read models that provides catch-up/rewind functionality.
11
+ * Handles initialization, state tracking via ViewState table, and consistency tracking.
12
+ * Subclasses should override indexOperations() with their specific indexing logic.
13
+ */
14
+ export declare class BaseReadModel implements IReadModel {
15
+ protected db: Kysely<DocumentViewDatabase>;
16
+ protected operationIndex: IOperationIndex;
17
+ protected writeCache: IWriteCache;
18
+ protected consistencyTracker: IConsistencyTracker;
19
+ protected readModelId: string;
20
+ protected lastOrdinal: number;
21
+ constructor(db: Kysely<DocumentViewDatabase>, operationIndex: IOperationIndex, writeCache: IWriteCache, consistencyTracker: IConsistencyTracker, readModelId: string);
22
+ /**
23
+ * Initializes the read model by loading state and catching up on missed operations.
24
+ */
25
+ init(): Promise<void>;
26
+ /**
27
+ * Indexes operations into the read model.
28
+ * Subclasses should override this method to implement their specific indexing logic.
29
+ * The overriding method should call saveState() and updateConsistencyTracker() at the end.
30
+ */
31
+ indexOperations(items: OperationWithContext[]): Promise<void>;
32
+ /**
33
+ * Waits for the read model to reach the specified consistency level.
34
+ */
35
+ waitForConsistency(token: ConsistencyToken, timeoutMs?: number, signal?: AbortSignal): Promise<void>;
36
+ /**
37
+ * Rebuilds document state for each operation using the write cache.
38
+ */
39
+ protected rebuildStateForOperations(operations: OperationWithContext[]): Promise<OperationWithContext[]>;
40
+ /**
41
+ * Loads the last processed ordinal from the ViewState table.
42
+ * Returns undefined if no state exists for this read model.
43
+ */
44
+ protected loadState(): Promise<number | undefined>;
45
+ /**
46
+ * Initializes the ViewState row for this read model.
47
+ */
48
+ protected initializeState(): Promise<void>;
49
+ /**
50
+ * Saves the last processed ordinal to the ViewState table.
51
+ * Should be called at the end of indexOperations() within a transaction.
52
+ */
53
+ protected saveState(trx: Transaction<DocumentViewDatabase>, items: OperationWithContext[]): Promise<void>;
54
+ /**
55
+ * Updates the consistency tracker with the processed operations.
56
+ * Should be called at the end of indexOperations() after the transaction commits.
57
+ */
58
+ protected updateConsistencyTracker(items: OperationWithContext[]): void;
59
+ }
60
+ //# sourceMappingURL=base-read-model.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base-read-model.d.ts","sourceRoot":"","sources":["../../../src/read-models/base-read-model.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AAClD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AACzE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AAC5E,OAAO,KAAK,EAEV,gBAAgB,EACjB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AACrE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAEvD;;;;GAIG;AACH,qBAAa,aAAc,YAAW,UAAU;IAI5C,SAAS,CAAC,EAAE,EAAE,MAAM,CAAC,oBAAoB,CAAC;IAC1C,SAAS,CAAC,cAAc,EAAE,eAAe;IACzC,SAAS,CAAC,UAAU,EAAE,WAAW;IACjC,SAAS,CAAC,kBAAkB,EAAE,mBAAmB;IACjD,SAAS,CAAC,WAAW,EAAE,MAAM;IAP/B,SAAS,CAAC,WAAW,EAAE,MAAM,CAAK;gBAGtB,EAAE,EAAE,MAAM,CAAC,oBAAoB,CAAC,EAChC,cAAc,EAAE,eAAe,EAC/B,UAAU,EAAE,WAAW,EACvB,kBAAkB,EAAE,mBAAmB,EACvC,WAAW,EAAE,MAAM;IAG/B;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IA4B3B;;;;OAIG;IACG,eAAe,CAAC,KAAK,EAAE,oBAAoB,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAUnE;;OAEG;IACG,kBAAkB,CACtB,KAAK,EAAE,gBAAgB,EACvB,SAAS,CAAC,EAAE,MAAM,EAClB,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,IAAI,CAAC;IAOhB;;OAEG;cACa,yBAAyB,CACvC,UAAU,EAAE,oBAAoB,EAAE,GACjC,OAAO,CAAC,oBAAoB,EAAE,CAAC;IA0BlC;;;OAGG;cACa,SAAS,IAAI,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IAWxD;;OAEG;cACa,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC;IAWhD;;;OAGG;cACa,SAAS,CACvB,GAAG,EAAE,WAAW,CAAC,oBAAoB,CAAC,EACtC,KAAK,EAAE,oBAAoB,EAAE,GAC5B,OAAO,CAAC,IAAI,CAAC;IAchB;;;OAGG;IACH,SAAS,CAAC,wBAAwB,CAAC,KAAK,EAAE,oBAAoB,EAAE,GAAG,IAAI;CAexE"}