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

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,646 @@
1
+ import { AbortError } from "document-drive";
2
+ import { v4 as uuidv4 } from "uuid";
3
+ import { createMutableShutdownStatus } from "../shared/factories.js";
4
+ import { JobStatus } from "../shared/types.js";
5
+ import { matchesScope } from "../shared/utils.js";
6
+ import { filterByParentId, filterByType } from "./utils.js";
7
+ /**
8
+ * This class implements the IReactor interface and serves as the main entry point
9
+ * for the new Reactor architecture.
10
+ */
11
+ export class Reactor {
12
+ driveServer;
13
+ documentStorage;
14
+ shutdownStatus;
15
+ setShutdown;
16
+ queue;
17
+ jobTracker;
18
+ readModelCoordinator;
19
+ constructor(driveServer, documentStorage, queue, jobTracker, readModelCoordinator) {
20
+ // Store required dependencies
21
+ this.driveServer = driveServer;
22
+ this.documentStorage = documentStorage;
23
+ this.queue = queue;
24
+ this.jobTracker = jobTracker;
25
+ this.readModelCoordinator = readModelCoordinator;
26
+ // Start the read model coordinator
27
+ this.readModelCoordinator.start();
28
+ // Create mutable shutdown status using factory method
29
+ const [status, setter] = createMutableShutdownStatus(false);
30
+ this.shutdownStatus = status;
31
+ this.setShutdown = setter;
32
+ }
33
+ /**
34
+ * Signals that the reactor should shutdown.
35
+ */
36
+ kill() {
37
+ // Mark the reactor as shutdown
38
+ this.setShutdown(true);
39
+ // Stop the read model coordinator
40
+ this.readModelCoordinator.stop();
41
+ // TODO: Phase 3+ - Implement graceful shutdown for queue, executors, etc.
42
+ // For now, we just mark as shutdown and return status
43
+ return this.shutdownStatus;
44
+ }
45
+ /**
46
+ * Retrieves a list of document model specifications
47
+ */
48
+ getDocumentModels(namespace, paging, signal) {
49
+ // Get document model modules from the drive server + filter
50
+ const modules = this.driveServer.getDocumentModelModules();
51
+ const filteredModels = modules.filter((module) => !namespace || module.documentModel.global.name.startsWith(namespace));
52
+ // Apply paging
53
+ const startIndex = paging ? parseInt(paging.cursor) || 0 : 0;
54
+ const limit = paging?.limit || filteredModels.length;
55
+ const pagedModels = filteredModels.slice(startIndex, startIndex + limit);
56
+ // Create paged results
57
+ const hasMore = startIndex + limit < filteredModels.length;
58
+ const nextCursor = hasMore ? String(startIndex + limit) : undefined;
59
+ // even thought this is currently synchronous, they could have passed in an already-aborted signal
60
+ if (signal?.aborted) {
61
+ throw new AbortError();
62
+ }
63
+ return Promise.resolve({
64
+ results: pagedModels,
65
+ options: paging || { cursor: "0", limit: filteredModels.length },
66
+ nextCursor,
67
+ next: hasMore
68
+ ? () => this.getDocumentModels(namespace, { cursor: nextCursor, limit }, signal)
69
+ : undefined,
70
+ });
71
+ }
72
+ /**
73
+ * Retrieves a specific PHDocument by id
74
+ */
75
+ async get(id, view, signal) {
76
+ const document = await this.documentStorage.get(id);
77
+ if (signal?.aborted) {
78
+ throw new AbortError();
79
+ }
80
+ const childIds = await this.documentStorage.getChildren(id);
81
+ if (signal?.aborted) {
82
+ throw new AbortError();
83
+ }
84
+ // Apply view filter - This will be removed when we pass the viewfilter along
85
+ // to the underlying store, but is here now for the interface.
86
+ for (const scope in document.state) {
87
+ if (!matchesScope(view, scope)) {
88
+ delete document.state[scope];
89
+ }
90
+ }
91
+ return {
92
+ document,
93
+ childIds,
94
+ };
95
+ }
96
+ /**
97
+ * Retrieves a specific PHDocument by slug
98
+ */
99
+ async getBySlug(slug, view, signal) {
100
+ // Use the storage layer to resolve slug to ID
101
+ let ids;
102
+ try {
103
+ ids = await this.documentStorage.resolveIds([slug], signal);
104
+ }
105
+ catch (error) {
106
+ // If the error is from resolveIds (document not found), wrap it with our message
107
+ if (error instanceof Error && error.message.includes("not found")) {
108
+ throw new Error(`Document not found with slug: ${slug}`);
109
+ }
110
+ throw error;
111
+ }
112
+ if (ids.length === 0 || !ids[0]) {
113
+ throw new Error(`Document not found with slug: ${slug}`);
114
+ }
115
+ // Now get the document by its resolved ID
116
+ return await this.get(ids[0], view, signal);
117
+ }
118
+ /**
119
+ * Retrieves the operations for a document
120
+ */
121
+ async getOperations(documentId, view, paging, signal) {
122
+ // Use storage directly to get the document
123
+ const document = await this.documentStorage.get(documentId);
124
+ if (signal?.aborted) {
125
+ throw new AbortError();
126
+ }
127
+ const operations = document.operations;
128
+ const result = {};
129
+ // apply view filter, per scope -- this will be removed when we pass the viewfilter along
130
+ // to the underlying store, but is here now for the interface.
131
+ for (const scope in operations) {
132
+ if (matchesScope(view, scope)) {
133
+ const scopeOperations = operations[scope];
134
+ // apply paging too
135
+ const startIndex = paging ? parseInt(paging.cursor) || 0 : 0;
136
+ const limit = paging?.limit || scopeOperations.length;
137
+ const pagedOperations = scopeOperations.slice(startIndex, startIndex + limit);
138
+ result[scope] = {
139
+ results: pagedOperations,
140
+ options: { cursor: String(startIndex + limit), limit },
141
+ };
142
+ }
143
+ }
144
+ return Promise.resolve(result);
145
+ }
146
+ /**
147
+ * Filters documents by criteria and returns a list of them
148
+ */
149
+ async find(search, view, paging, signal) {
150
+ let results;
151
+ if (search.ids) {
152
+ if (search.slugs && search.slugs.length > 0) {
153
+ throw new Error("Cannot use both ids and slugs in the same search");
154
+ }
155
+ results = await this.findByIds(search.ids, view, paging, signal);
156
+ if (search.parentId) {
157
+ results = filterByParentId(results, search.parentId);
158
+ }
159
+ if (search.type) {
160
+ results = filterByType(results, search.type);
161
+ }
162
+ }
163
+ else if (search.slugs) {
164
+ results = await this.findBySlugs(search.slugs, view, paging, signal);
165
+ if (search.parentId) {
166
+ results = filterByParentId(results, search.parentId);
167
+ }
168
+ if (search.type) {
169
+ results = filterByType(results, search.type);
170
+ }
171
+ }
172
+ else if (search.parentId) {
173
+ results = await this.findByParentId(search.parentId, view, paging, signal);
174
+ if (search.type) {
175
+ results = filterByType(results, search.type);
176
+ }
177
+ }
178
+ else if (search.type) {
179
+ results = await this.findByType(search.type, view, paging, signal);
180
+ }
181
+ else {
182
+ throw new Error("No search criteria provided");
183
+ }
184
+ if (signal?.aborted) {
185
+ throw new AbortError();
186
+ }
187
+ return results;
188
+ }
189
+ /**
190
+ * Creates a document
191
+ */
192
+ async create(document, signal) {
193
+ const createdAtUtcIso = new Date().toISOString();
194
+ if (signal?.aborted) {
195
+ throw new AbortError();
196
+ }
197
+ // Create a CREATE_DOCUMENT action with proper CreateDocumentActionInput
198
+ const input = {
199
+ model: document.header.documentType,
200
+ version: "0.0.0",
201
+ documentId: document.header.id,
202
+ };
203
+ // Add signing info
204
+ input.signing = {
205
+ signature: document.header.id,
206
+ publicKey: document.header.sig.publicKey,
207
+ nonce: document.header.sig.nonce,
208
+ createdAtUtcIso: document.header.createdAtUtcIso,
209
+ documentType: document.header.documentType,
210
+ };
211
+ // Add optional mutable header fields (always include even if empty/undefined)
212
+ input.slug = document.header.slug;
213
+ input.name = document.header.name;
214
+ input.branch = document.header.branch;
215
+ input.meta = document.header.meta;
216
+ const createAction = {
217
+ id: `${document.header.id}-create`,
218
+ type: "CREATE_DOCUMENT",
219
+ scope: "document",
220
+ timestampUtcMs: new Date().toISOString(),
221
+ input,
222
+ };
223
+ // Create an UPGRADE_DOCUMENT action to set the initial state
224
+ const upgradeInput = {
225
+ model: document.header.documentType,
226
+ fromVersion: "0.0.0",
227
+ toVersion: "0.0.0", // Same version since we're just setting initial state
228
+ documentId: document.header.id,
229
+ initialState: document.state,
230
+ };
231
+ const upgradeAction = {
232
+ id: `${document.header.id}-upgrade`,
233
+ type: "UPGRADE_DOCUMENT",
234
+ scope: "document",
235
+ timestampUtcMs: new Date().toISOString(),
236
+ input: upgradeInput,
237
+ };
238
+ // Create a single job with both CREATE_DOCUMENT and UPGRADE_DOCUMENT actions
239
+ const job = {
240
+ id: uuidv4(),
241
+ documentId: document.header.id,
242
+ scope: "document",
243
+ branch: "main",
244
+ actions: [createAction, upgradeAction],
245
+ createdAt: new Date().toISOString(),
246
+ queueHint: [],
247
+ maxRetries: 3,
248
+ errorHistory: [],
249
+ };
250
+ // Create job info and register with tracker
251
+ const jobInfo = {
252
+ id: job.id,
253
+ status: JobStatus.PENDING,
254
+ createdAtUtcIso,
255
+ };
256
+ this.jobTracker.registerJob(jobInfo);
257
+ // Enqueue the job
258
+ await this.queue.enqueue(job);
259
+ return jobInfo;
260
+ }
261
+ /**
262
+ * Deletes a document
263
+ */
264
+ async deleteDocument(id, propagate, signal) {
265
+ const createdAtUtcIso = new Date().toISOString();
266
+ if (signal?.aborted) {
267
+ throw new AbortError();
268
+ }
269
+ const deleteInput = {
270
+ documentId: id,
271
+ propagate,
272
+ };
273
+ const action = {
274
+ id: `${id}-delete`,
275
+ type: "DELETE_DOCUMENT",
276
+ scope: "document",
277
+ timestampUtcMs: new Date().toISOString(),
278
+ input: deleteInput,
279
+ };
280
+ const job = {
281
+ id: uuidv4(),
282
+ documentId: id,
283
+ scope: "document",
284
+ branch: "main",
285
+ actions: [action],
286
+ createdAt: new Date().toISOString(),
287
+ queueHint: [],
288
+ maxRetries: 3,
289
+ errorHistory: [],
290
+ };
291
+ const jobInfo = {
292
+ id: job.id,
293
+ status: JobStatus.PENDING,
294
+ createdAtUtcIso,
295
+ };
296
+ this.jobTracker.registerJob(jobInfo);
297
+ await this.queue.enqueue(job);
298
+ return jobInfo;
299
+ }
300
+ /**
301
+ * Applies a list of actions to a document
302
+ */
303
+ async mutate(id, actions) {
304
+ const createdAtUtcIso = new Date().toISOString();
305
+ // Determine scope from first action (all actions should have the same scope)
306
+ const scope = actions.length > 0 ? actions[0].scope || "global" : "global";
307
+ // Create a single job with all actions
308
+ const job = {
309
+ id: uuidv4(),
310
+ documentId: id,
311
+ scope: scope,
312
+ branch: "main", // Default to main branch
313
+ actions: actions,
314
+ createdAt: new Date().toISOString(),
315
+ queueHint: [],
316
+ maxRetries: 3,
317
+ errorHistory: [],
318
+ };
319
+ // Create job info and register with tracker
320
+ const jobInfo = {
321
+ id: job.id,
322
+ status: JobStatus.PENDING,
323
+ createdAtUtcIso,
324
+ };
325
+ this.jobTracker.registerJob(jobInfo);
326
+ // Enqueue the job
327
+ await this.queue.enqueue(job);
328
+ return jobInfo;
329
+ }
330
+ /**
331
+ * Adds multiple documents as children to another
332
+ */
333
+ async addChildren(parentId, documentIds, view, signal) {
334
+ const createdAtUtcIso = new Date().toISOString();
335
+ const jobId = uuidv4();
336
+ // Check abort signal before starting
337
+ if (signal?.aborted) {
338
+ throw new AbortError();
339
+ }
340
+ // TODO: Implement when drive server supports hierarchical documents
341
+ // For now, this is a placeholder implementation
342
+ // Verify parent exists
343
+ try {
344
+ await this.driveServer.getDocument(parentId);
345
+ }
346
+ catch (error) {
347
+ return {
348
+ id: jobId,
349
+ status: JobStatus.FAILED,
350
+ createdAtUtcIso,
351
+ error: error instanceof Error ? error.message : "Unknown error",
352
+ };
353
+ }
354
+ // Check abort signal after parent verification
355
+ if (signal?.aborted) {
356
+ throw new AbortError();
357
+ }
358
+ // Verify all children exist
359
+ for (const childId of documentIds) {
360
+ try {
361
+ await this.driveServer.getDocument(childId);
362
+ }
363
+ catch (error) {
364
+ return {
365
+ id: jobId,
366
+ status: JobStatus.FAILED,
367
+ createdAtUtcIso,
368
+ error: error instanceof Error ? error.message : "Unknown error",
369
+ };
370
+ }
371
+ // Check abort signal after each child verification
372
+ if (signal?.aborted) {
373
+ throw new AbortError();
374
+ }
375
+ }
376
+ // TODO: Actually establish parent-child relationships
377
+ // Return success job info
378
+ return {
379
+ id: jobId,
380
+ status: JobStatus.COMPLETED,
381
+ createdAtUtcIso,
382
+ completedAtUtcIso: new Date().toISOString(),
383
+ };
384
+ }
385
+ /**
386
+ * Removes multiple documents as children from another
387
+ */
388
+ async removeChildren(parentId, documentIds, view, signal) {
389
+ const createdAtUtcIso = new Date().toISOString();
390
+ const jobId = uuidv4();
391
+ // Check abort signal before starting
392
+ if (signal?.aborted) {
393
+ throw new AbortError();
394
+ }
395
+ // TODO: Implement when drive server supports hierarchical documents
396
+ // For now, this is a placeholder implementation
397
+ // Verify parent exists
398
+ try {
399
+ await this.driveServer.getDocument(parentId);
400
+ }
401
+ catch (error) {
402
+ return {
403
+ id: jobId,
404
+ status: JobStatus.FAILED,
405
+ createdAtUtcIso,
406
+ error: error instanceof Error ? error.message : "Unknown error",
407
+ };
408
+ }
409
+ // Check abort signal after parent verification
410
+ if (signal?.aborted) {
411
+ throw new AbortError();
412
+ }
413
+ // TODO: Actually remove parent-child relationships
414
+ // Return success job info
415
+ return {
416
+ id: jobId,
417
+ status: JobStatus.COMPLETED,
418
+ createdAtUtcIso,
419
+ completedAtUtcIso: new Date().toISOString(),
420
+ };
421
+ }
422
+ /**
423
+ * Retrieves the status of a job
424
+ */
425
+ getJobStatus(jobId, signal) {
426
+ if (signal?.aborted) {
427
+ throw new AbortError();
428
+ }
429
+ const jobInfo = this.jobTracker.getJobStatus(jobId);
430
+ if (!jobInfo) {
431
+ // Job not found - return FAILED status with appropriate error
432
+ return Promise.resolve({
433
+ id: jobId,
434
+ status: JobStatus.FAILED,
435
+ createdAtUtcIso: new Date().toISOString(),
436
+ completedAtUtcIso: new Date().toISOString(),
437
+ error: "Job not found",
438
+ });
439
+ }
440
+ return Promise.resolve(jobInfo);
441
+ }
442
+ /**
443
+ * Finds documents by their IDs
444
+ */
445
+ async findByIds(ids, view, paging, signal) {
446
+ const documents = [];
447
+ // Fetch each document by ID using storage directly
448
+ for (const id of ids) {
449
+ if (signal?.aborted) {
450
+ throw new AbortError();
451
+ }
452
+ let document;
453
+ try {
454
+ document = await this.documentStorage.get(id);
455
+ }
456
+ catch {
457
+ // Skip documents that don't exist or can't be accessed
458
+ // This matches the behavior expected from a search operation
459
+ continue;
460
+ }
461
+ // Apply view filter - This will be removed when we pass the viewfilter along
462
+ // to the underlying store, but is here now for the interface.
463
+ for (const scope in document.state) {
464
+ if (!matchesScope(view, scope)) {
465
+ delete document.state[scope];
466
+ }
467
+ }
468
+ documents.push(document);
469
+ }
470
+ if (signal?.aborted) {
471
+ throw new AbortError();
472
+ }
473
+ // Apply paging
474
+ const startIndex = paging ? parseInt(paging.cursor) || 0 : 0;
475
+ const limit = paging?.limit || documents.length;
476
+ const pagedDocuments = documents.slice(startIndex, startIndex + limit);
477
+ // Create paged results
478
+ const hasMore = startIndex + limit < documents.length;
479
+ const nextCursor = hasMore ? String(startIndex + limit) : undefined;
480
+ return {
481
+ results: pagedDocuments,
482
+ options: paging || { cursor: "0", limit: documents.length },
483
+ nextCursor,
484
+ next: hasMore
485
+ ? () => this.findByIds(ids, view, { cursor: nextCursor, limit }, signal)
486
+ : undefined,
487
+ };
488
+ }
489
+ /**
490
+ * Finds documents by their slugs
491
+ */
492
+ async findBySlugs(slugs, view, paging, signal) {
493
+ const documents = [];
494
+ // Use storage to resolve slugs to IDs
495
+ let ids;
496
+ try {
497
+ ids = await this.documentStorage.resolveIds(slugs, signal);
498
+ }
499
+ catch {
500
+ // If slug resolution fails, return empty results
501
+ // This matches the behavior expected from a search operation
502
+ ids = [];
503
+ }
504
+ // Fetch each document by resolved ID
505
+ for (const id of ids) {
506
+ if (signal?.aborted) {
507
+ throw new AbortError();
508
+ }
509
+ let document;
510
+ try {
511
+ document = await this.documentStorage.get(id);
512
+ }
513
+ catch {
514
+ // Skip documents that don't exist or can't be accessed
515
+ continue;
516
+ }
517
+ // Apply view filter - This will be removed when we pass the viewfilter along
518
+ // to the underlying store, but is here now for the interface.
519
+ for (const scope in document.state) {
520
+ if (!matchesScope(view, scope)) {
521
+ delete document.state[scope];
522
+ }
523
+ }
524
+ documents.push(document);
525
+ }
526
+ if (signal?.aborted) {
527
+ throw new AbortError();
528
+ }
529
+ // Apply paging - this will be removed when we pass the paging along
530
+ // to the underlying store, but is here now for the interface.
531
+ const startIndex = paging ? parseInt(paging.cursor) || 0 : 0;
532
+ const limit = paging?.limit || documents.length;
533
+ const pagedDocuments = documents.slice(startIndex, startIndex + limit);
534
+ // Create paged results
535
+ const hasMore = startIndex + limit < documents.length;
536
+ const nextCursor = hasMore ? String(startIndex + limit) : undefined;
537
+ return {
538
+ results: pagedDocuments,
539
+ options: paging || { cursor: "0", limit: documents.length },
540
+ nextCursor,
541
+ next: hasMore
542
+ ? () => this.findBySlugs(slugs, view, { cursor: nextCursor, limit }, signal)
543
+ : undefined,
544
+ };
545
+ }
546
+ /**
547
+ * Finds documents by parent ID
548
+ */
549
+ async findByParentId(parentId, view, paging, signal) {
550
+ // Get child document IDs from storage
551
+ const childIds = await this.documentStorage.getChildren(parentId);
552
+ if (signal?.aborted) {
553
+ throw new AbortError();
554
+ }
555
+ const documents = [];
556
+ // Fetch each child document
557
+ for (const childId of childIds) {
558
+ if (signal?.aborted) {
559
+ throw new AbortError();
560
+ }
561
+ let document;
562
+ try {
563
+ document = await this.documentStorage.get(childId);
564
+ }
565
+ catch {
566
+ // Skip documents that don't exist or can't be accessed
567
+ // This matches the behavior expected from a search operation
568
+ continue;
569
+ }
570
+ // Apply view filter - This will be removed when we pass the viewfilter along
571
+ // to the underlying store, but is here now for the interface.
572
+ for (const scope in document.state) {
573
+ if (!matchesScope(view, scope)) {
574
+ delete document.state[scope];
575
+ }
576
+ }
577
+ documents.push(document);
578
+ }
579
+ if (signal?.aborted) {
580
+ throw new AbortError();
581
+ }
582
+ // Apply paging
583
+ const startIndex = paging ? parseInt(paging.cursor) || 0 : 0;
584
+ const limit = paging?.limit || documents.length;
585
+ const pagedDocuments = documents.slice(startIndex, startIndex + limit);
586
+ // Create paged results
587
+ const hasMore = startIndex + limit < documents.length;
588
+ const nextCursor = hasMore ? String(startIndex + limit) : undefined;
589
+ return {
590
+ results: pagedDocuments,
591
+ options: paging || { cursor: "0", limit: documents.length },
592
+ nextCursor,
593
+ next: hasMore
594
+ ? () => this.findByParentId(parentId, view, { cursor: nextCursor, limit }, signal)
595
+ : undefined,
596
+ };
597
+ }
598
+ /**
599
+ * Finds documents by type
600
+ */
601
+ async findByType(type, view, paging, signal) {
602
+ const documents = [];
603
+ // Use storage's findByType method directly
604
+ const cursor = paging?.cursor;
605
+ const limit = paging?.limit || 100;
606
+ // Get document IDs of the specified type
607
+ const { documents: documentIds, nextCursor } = await this.documentStorage.findByType(type, limit, cursor);
608
+ if (signal?.aborted) {
609
+ throw new AbortError();
610
+ }
611
+ // Fetch each document by its ID
612
+ for (const documentId of documentIds) {
613
+ if (signal?.aborted) {
614
+ throw new AbortError();
615
+ }
616
+ let document;
617
+ try {
618
+ document = await this.documentStorage.get(documentId);
619
+ }
620
+ catch {
621
+ // Skip documents that can't be retrieved
622
+ continue;
623
+ }
624
+ // Apply view filter
625
+ for (const scope in document.state) {
626
+ if (!matchesScope(view, scope)) {
627
+ delete document.state[scope];
628
+ }
629
+ }
630
+ documents.push(document);
631
+ }
632
+ if (signal?.aborted) {
633
+ throw new AbortError();
634
+ }
635
+ // Results are already paged from the storage layer
636
+ return {
637
+ results: documents,
638
+ options: paging || { cursor: cursor || "0", limit },
639
+ nextCursor,
640
+ next: nextCursor
641
+ ? async () => this.findByType(type, view, { cursor: nextCursor, limit }, signal)
642
+ : undefined,
643
+ };
644
+ }
645
+ }
646
+ //# sourceMappingURL=reactor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reactor.js","sourceRoot":"","sources":["../../../src/core/reactor.ts"],"names":[],"mappings":"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"}