@powerhousedao/reactor 5.1.0 → 5.2.0-dev.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (225) 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 +22 -10
  24. package/dist/src/client/reactor-client.d.ts.map +1 -1
  25. package/dist/src/client/reactor-client.js +145 -48
  26. package/dist/src/client/reactor-client.js.map +1 -1
  27. package/dist/src/client/types.d.ts +32 -13
  28. package/dist/src/client/types.d.ts.map +1 -1
  29. package/dist/src/core/reactor-builder.d.ts +19 -12
  30. package/dist/src/core/reactor-builder.d.ts.map +1 -1
  31. package/dist/src/core/reactor-builder.js +127 -37
  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 +14 -16
  38. package/dist/src/core/reactor.d.ts.map +1 -1
  39. package/dist/src/core/reactor.js +101 -110
  40. package/dist/src/core/reactor.js.map +1 -1
  41. package/dist/src/core/types.d.ts +101 -22
  42. package/dist/src/core/types.d.ts.map +1 -1
  43. package/dist/src/core/utils.d.ts +9 -1
  44. package/dist/src/core/utils.d.ts.map +1 -1
  45. package/dist/src/core/utils.js +30 -0
  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 +20 -2
  54. package/dist/src/executor/simple-job-executor.d.ts.map +1 -1
  55. package/dist/src/executor/simple-job-executor.js +400 -219
  56. package/dist/src/executor/simple-job-executor.js.map +1 -1
  57. package/dist/src/executor/types.d.ts +2 -0
  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 +17 -6
  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 +24 -0
  116. package/dist/src/shared/errors.d.ts.map +1 -1
  117. package/dist/src/shared/errors.js +42 -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 +41 -4
  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.d.ts.map +1 -1
  143. package/dist/src/storage/kysely/sync-remote-storage.js +11 -12
  144. package/dist/src/storage/kysely/sync-remote-storage.js.map +1 -1
  145. package/dist/src/storage/kysely/types.d.ts +6 -6
  146. package/dist/src/storage/migrations/001_create_operation_table.d.ts.map +1 -1
  147. package/dist/src/storage/migrations/001_create_operation_table.js +2 -1
  148. package/dist/src/storage/migrations/001_create_operation_table.js.map +1 -1
  149. package/dist/src/storage/migrations/008_create_view_state_table.d.ts +1 -1
  150. package/dist/src/storage/migrations/008_create_view_state_table.d.ts.map +1 -1
  151. package/dist/src/storage/migrations/008_create_view_state_table.js +2 -1
  152. package/dist/src/storage/migrations/008_create_view_state_table.js.map +1 -1
  153. package/dist/src/storage/migrations/009_create_operation_index_tables.js +1 -1
  154. package/dist/src/storage/migrations/009_create_operation_index_tables.js.map +1 -1
  155. package/dist/src/storage/migrations/010_create_sync_tables.js +5 -5
  156. package/dist/src/storage/migrations/010_create_sync_tables.js.map +1 -1
  157. package/dist/src/storage/migrations/migrator.d.ts +3 -2
  158. package/dist/src/storage/migrations/migrator.d.ts.map +1 -1
  159. package/dist/src/storage/migrations/migrator.js +29 -6
  160. package/dist/src/storage/migrations/migrator.js.map +1 -1
  161. package/dist/src/storage/migrations/run-migrations.js +3 -3
  162. package/dist/src/storage/migrations/run-migrations.js.map +1 -1
  163. package/dist/src/storage/txn.d.ts.map +1 -1
  164. package/dist/src/storage/txn.js +2 -3
  165. package/dist/src/storage/txn.js.map +1 -1
  166. package/dist/src/subs/subscription-notification-read-model.d.ts +17 -0
  167. package/dist/src/subs/subscription-notification-read-model.d.ts.map +1 -0
  168. package/dist/src/subs/subscription-notification-read-model.js +62 -0
  169. package/dist/src/subs/subscription-notification-read-model.js.map +1 -0
  170. package/dist/src/sync/channels/composite-channel-factory.d.ts +30 -0
  171. package/dist/src/sync/channels/composite-channel-factory.d.ts.map +1 -0
  172. package/dist/src/sync/channels/composite-channel-factory.js +87 -0
  173. package/dist/src/sync/channels/composite-channel-factory.js.map +1 -0
  174. package/dist/src/sync/channels/gql-channel-factory.d.ts +25 -0
  175. package/dist/src/sync/channels/gql-channel-factory.d.ts.map +1 -0
  176. package/dist/src/sync/channels/gql-channel-factory.js +76 -0
  177. package/dist/src/sync/channels/gql-channel-factory.js.map +1 -0
  178. package/dist/src/sync/channels/gql-channel.d.ts +118 -0
  179. package/dist/src/sync/channels/gql-channel.d.ts.map +1 -0
  180. package/dist/src/sync/channels/gql-channel.js +423 -0
  181. package/dist/src/sync/channels/gql-channel.js.map +1 -0
  182. package/dist/src/sync/channels/index.d.ts +4 -1
  183. package/dist/src/sync/channels/index.d.ts.map +1 -1
  184. package/dist/src/sync/channels/index.js +4 -1
  185. package/dist/src/sync/channels/index.js.map +1 -1
  186. package/dist/src/sync/channels/polling-channel.d.ts +39 -0
  187. package/dist/src/sync/channels/polling-channel.d.ts.map +1 -0
  188. package/dist/src/sync/channels/polling-channel.js +72 -0
  189. package/dist/src/sync/channels/polling-channel.js.map +1 -0
  190. package/dist/src/sync/channels/utils.d.ts +17 -2
  191. package/dist/src/sync/channels/utils.d.ts.map +1 -1
  192. package/dist/src/sync/channels/utils.js +76 -6
  193. package/dist/src/sync/channels/utils.js.map +1 -1
  194. package/dist/src/sync/errors.d.ts +1 -1
  195. package/dist/src/sync/errors.d.ts.map +1 -1
  196. package/dist/src/sync/errors.js +2 -2
  197. package/dist/src/sync/errors.js.map +1 -1
  198. package/dist/src/sync/index.d.ts +2 -2
  199. package/dist/src/sync/index.d.ts.map +1 -1
  200. package/dist/src/sync/index.js +2 -2
  201. package/dist/src/sync/index.js.map +1 -1
  202. package/dist/src/sync/interfaces.d.ts +33 -3
  203. package/dist/src/sync/interfaces.d.ts.map +1 -1
  204. package/dist/src/sync/sync-builder.d.ts +4 -2
  205. package/dist/src/sync/sync-builder.d.ts.map +1 -1
  206. package/dist/src/sync/sync-builder.js +12 -2
  207. package/dist/src/sync/sync-builder.js.map +1 -1
  208. package/dist/src/sync/sync-manager.d.ts +7 -3
  209. package/dist/src/sync/sync-manager.d.ts.map +1 -1
  210. package/dist/src/sync/sync-manager.js +79 -10
  211. package/dist/src/sync/sync-manager.js.map +1 -1
  212. package/dist/src/sync/types.d.ts +1 -2
  213. package/dist/src/sync/types.d.ts.map +1 -1
  214. package/dist/src/sync/utils.d.ts +19 -0
  215. package/dist/src/sync/utils.d.ts.map +1 -1
  216. package/dist/src/sync/utils.js +44 -0
  217. package/dist/src/sync/utils.js.map +1 -1
  218. package/package.json +6 -5
  219. package/dist/src/core/builder.d.ts.map +0 -1
  220. package/dist/src/core/builder.js +0 -88
  221. package/dist/src/core/builder.js.map +0 -1
  222. package/dist/src/sync/channels/internal-channel.d.ts +0 -57
  223. package/dist/src/sync/channels/internal-channel.d.ts.map +0 -1
  224. package/dist/src/sync/channels/internal-channel.js +0 -106
  225. package/dist/src/sync/channels/internal-channel.js.map +0 -1
@@ -1,14 +1,16 @@
1
+ import { addRelationshipAction, createDocumentAction, deleteDocumentAction, removeRelationshipAction, upgradeDocumentAction, } from "#actions/index.js";
1
2
  import { AbortError } from "document-drive";
2
3
  import { v4 as uuidv4 } from "uuid";
3
4
  import { createMutableShutdownStatus } from "../shared/factories.js";
4
5
  import { JobStatus } from "../shared/types.js";
5
6
  import { matchesScope } from "../shared/utils.js";
6
- import { filterByType, getSharedScope, toErrorInfo, topologicalSort, validateActionScopes, validateBatchRequest, } from "./utils.js";
7
+ import { filterByType, getSharedScope, signAction, signActions, toErrorInfo, topologicalSort, validateActionScopes, validateBatchRequest, } from "./utils.js";
7
8
  /**
8
9
  * This class implements the IReactor interface and serves as the main entry point
9
10
  * for the new Reactor architecture.
10
11
  */
11
12
  export class Reactor {
13
+ logger;
12
14
  driveServer;
13
15
  documentStorage;
14
16
  shutdownStatus;
@@ -20,9 +22,9 @@ export class Reactor {
20
22
  documentView;
21
23
  _documentIndexer;
22
24
  operationStore;
23
- _syncManager;
24
- constructor(driveServer, documentStorage, queue, jobTracker, readModelCoordinator, features, documentView, documentIndexer, operationStore) {
25
+ constructor(logger, driveServer, documentStorage, queue, jobTracker, readModelCoordinator, features, documentView, documentIndexer, operationStore) {
25
26
  // Store required dependencies
27
+ this.logger = logger;
26
28
  this.driveServer = driveServer;
27
29
  this.documentStorage = documentStorage;
28
30
  this.queue = queue;
@@ -36,24 +38,16 @@ export class Reactor {
36
38
  const [status, setter] = createMutableShutdownStatus(false);
37
39
  this.shutdownStatus = status;
38
40
  this.setShutdown = setter;
41
+ this.logger.verbose("Reactor({ legacyStorage: @legacy })", features.legacyStorageEnabled);
39
42
  this.readModelCoordinator.start();
40
43
  }
41
- get syncManager() {
42
- return this._syncManager;
43
- }
44
- setSync(syncManager) {
45
- this._syncManager = syncManager;
46
- }
47
44
  /**
48
45
  * Signals that the reactor should shutdown.
49
46
  */
50
47
  kill() {
48
+ this.logger.verbose("kill()");
51
49
  // Mark the reactor as shutdown
52
50
  this.setShutdown(true);
53
- // Stop the sync manager if enabled
54
- if (this._syncManager) {
55
- this._syncManager.shutdown();
56
- }
57
51
  // Stop the read model coordinator
58
52
  this.readModelCoordinator.stop();
59
53
  // Stop the job tracker
@@ -64,6 +58,7 @@ export class Reactor {
64
58
  * Retrieves a list of document model specifications
65
59
  */
66
60
  getDocumentModels(namespace, paging, signal) {
61
+ this.logger.verbose("getDocumentModels(@namespace, @paging)", namespace, paging);
67
62
  // Get document model modules from the drive server + filter
68
63
  const modules = this.driveServer.getDocumentModelModules();
69
64
  const filteredModels = modules.filter((module) => !namespace || module.documentModel.global.id.startsWith(namespace));
@@ -91,12 +86,13 @@ export class Reactor {
91
86
  * Retrieves a specific PHDocument by id
92
87
  */
93
88
  async get(id, view, consistencyToken, signal) {
89
+ this.logger.verbose("get(@id, @view)", id, view);
94
90
  if (this.features.legacyStorageEnabled) {
95
- const document = await this.documentStorage.get(id);
91
+ const document = await this.documentStorage.get(id, consistencyToken, signal);
96
92
  if (signal?.aborted) {
97
93
  throw new AbortError();
98
94
  }
99
- const childIds = await this.documentStorage.getChildren(id);
95
+ const childIds = await this.documentStorage.getChildren(id, consistencyToken, signal);
100
96
  if (signal?.aborted) {
101
97
  throw new AbortError();
102
98
  }
@@ -130,10 +126,11 @@ export class Reactor {
130
126
  * Retrieves a specific PHDocument by slug
131
127
  */
132
128
  async getBySlug(slug, view, consistencyToken, signal) {
129
+ this.logger.verbose("getBySlug(@slug, @view)", slug, view);
133
130
  if (this.features.legacyStorageEnabled) {
134
131
  let ids;
135
132
  try {
136
- ids = await this.documentStorage.resolveIds([slug], signal);
133
+ ids = await this.documentStorage.resolveIds([slug], consistencyToken, signal);
137
134
  }
138
135
  catch (error) {
139
136
  if (error instanceof Error && error.message.includes("not found")) {
@@ -158,13 +155,14 @@ export class Reactor {
158
155
  * Retrieves a specific PHDocument by identifier (either id or slug)
159
156
  */
160
157
  async getByIdOrSlug(identifier, view, consistencyToken, signal) {
158
+ this.logger.verbose("getByIdOrSlug(@identifier, @view)", identifier, view);
161
159
  if (this.features.legacyStorageEnabled) {
162
160
  try {
163
161
  return await this.get(identifier, view, consistencyToken, signal);
164
162
  }
165
163
  catch {
166
164
  try {
167
- const ids = await this.documentStorage.resolveIds([identifier], signal);
165
+ const ids = await this.documentStorage.resolveIds([identifier], consistencyToken, signal);
168
166
  if (ids.length === 0 || !ids[0]) {
169
167
  throw new Error(`Document not found: ${identifier}`);
170
168
  }
@@ -195,9 +193,10 @@ export class Reactor {
195
193
  * Retrieves the operations for a document
196
194
  */
197
195
  async getOperations(documentId, view, paging, consistencyToken, signal) {
196
+ this.logger.verbose("getOperations(@documentId, @view, @paging)", documentId, view, paging);
198
197
  if (this.features.legacyStorageEnabled) {
199
198
  // Use storage directly to get the document
200
- const document = await this.documentStorage.get(documentId);
199
+ const document = await this.documentStorage.get(documentId, consistencyToken, signal);
201
200
  if (signal?.aborted) {
202
201
  throw new AbortError();
203
202
  }
@@ -268,6 +267,7 @@ export class Reactor {
268
267
  * Filters documents by criteria and returns a list of them
269
268
  */
270
269
  async find(search, view, paging, consistencyToken, signal) {
270
+ this.logger.verbose("find(@search, @view, @paging)", search, view, paging);
271
271
  let results;
272
272
  if (search.ids) {
273
273
  if (search.slugs && search.slugs.length > 0) {
@@ -304,52 +304,41 @@ export class Reactor {
304
304
  /**
305
305
  * Creates a document
306
306
  */
307
- async create(document, signal) {
307
+ async create(document, signer, signal, meta) {
308
+ this.logger.verbose("create(@id, @type, @slug)", document.header.id, document.header.documentType, document.header.slug);
308
309
  const createdAtUtcIso = new Date().toISOString();
309
310
  if (signal?.aborted) {
310
311
  throw new AbortError();
311
312
  }
312
- // Create a CREATE_DOCUMENT action with proper CreateDocumentActionInput
313
- const input = {
313
+ const createInput = {
314
314
  model: document.header.documentType,
315
- version: "0.0.0",
315
+ version: 0,
316
316
  documentId: document.header.id,
317
+ signing: {
318
+ signature: document.header.id,
319
+ publicKey: document.header.sig.publicKey,
320
+ nonce: document.header.sig.nonce,
321
+ createdAtUtcIso: document.header.createdAtUtcIso,
322
+ documentType: document.header.documentType,
323
+ },
324
+ slug: document.header.slug,
325
+ name: document.header.name,
326
+ branch: document.header.branch,
327
+ meta: document.header.meta,
317
328
  };
318
- // Add signing info
319
- input.signing = {
320
- signature: document.header.id,
321
- publicKey: document.header.sig.publicKey,
322
- nonce: document.header.sig.nonce,
323
- createdAtUtcIso: document.header.createdAtUtcIso,
324
- documentType: document.header.documentType,
325
- };
326
- // Add optional mutable header fields (always include even if empty/undefined)
327
- input.slug = document.header.slug;
328
- input.name = document.header.name;
329
- input.branch = document.header.branch;
330
- input.meta = document.header.meta;
331
- const createAction = {
332
- id: `${document.header.id}-create`,
333
- type: "CREATE_DOCUMENT",
334
- scope: "document",
335
- timestampUtcMs: new Date().toISOString(),
336
- input,
337
- };
338
- // Create an UPGRADE_DOCUMENT action to set the initial state
339
- const upgradeInput = {
340
- model: document.header.documentType,
341
- fromVersion: "0.0.0",
342
- toVersion: "0.0.0", // Same version since we're just setting initial state
329
+ const createAction = createDocumentAction(createInput);
330
+ const upgradeAction = upgradeDocumentAction({
343
331
  documentId: document.header.id,
332
+ model: document.header.documentType,
333
+ fromVersion: 0,
334
+ toVersion: 1,
344
335
  initialState: document.state,
345
- };
346
- const upgradeAction = {
347
- id: `${document.header.id}-upgrade`,
348
- type: "UPGRADE_DOCUMENT",
349
- scope: "document",
350
- timestampUtcMs: new Date().toISOString(),
351
- input: upgradeInput,
352
- };
336
+ });
337
+ // Sign actions if signer is provided
338
+ let actions = [createAction, upgradeAction];
339
+ if (signer) {
340
+ actions = await signActions(actions, signer, signal);
341
+ }
353
342
  // Create a single job with both CREATE_DOCUMENT and UPGRADE_DOCUMENT actions
354
343
  const job = {
355
344
  id: uuidv4(),
@@ -357,12 +346,13 @@ export class Reactor {
357
346
  documentId: document.header.id,
358
347
  scope: "document",
359
348
  branch: "main",
360
- actions: [createAction, upgradeAction],
349
+ actions,
361
350
  operations: [],
362
351
  createdAt: new Date().toISOString(),
363
352
  queueHint: [],
364
353
  maxRetries: 3,
365
354
  errorHistory: [],
355
+ meta,
366
356
  };
367
357
  // Create job info and register with tracker
368
358
  const jobInfo = {
@@ -374,6 +364,7 @@ export class Reactor {
374
364
  createdAtUtcIso,
375
365
  coordinates: [],
376
366
  },
367
+ meta,
377
368
  };
378
369
  this.jobTracker.registerJob(jobInfo);
379
370
  // Enqueue the job
@@ -383,21 +374,17 @@ export class Reactor {
383
374
  /**
384
375
  * Deletes a document
385
376
  */
386
- async deleteDocument(id, signal) {
377
+ async deleteDocument(id, signer, signal, meta) {
378
+ this.logger.verbose("deleteDocument(@id)", id);
387
379
  const createdAtUtcIso = new Date().toISOString();
388
380
  if (signal?.aborted) {
389
381
  throw new AbortError();
390
382
  }
391
- const deleteInput = {
392
- documentId: id,
393
- };
394
- const action = {
395
- id: `${id}-delete`,
396
- type: "DELETE_DOCUMENT",
397
- scope: "document",
398
- timestampUtcMs: new Date().toISOString(),
399
- input: deleteInput,
400
- };
383
+ let action = deleteDocumentAction(id);
384
+ // Sign action if signer is provided
385
+ if (signer) {
386
+ action = await signAction(action, signer, signal);
387
+ }
401
388
  const job = {
402
389
  id: uuidv4(),
403
390
  kind: "mutation",
@@ -410,6 +397,7 @@ export class Reactor {
410
397
  queueHint: [],
411
398
  maxRetries: 3,
412
399
  errorHistory: [],
400
+ meta,
413
401
  };
414
402
  const jobInfo = {
415
403
  id: job.id,
@@ -420,6 +408,7 @@ export class Reactor {
420
408
  createdAtUtcIso,
421
409
  coordinates: [],
422
410
  },
411
+ meta,
423
412
  };
424
413
  this.jobTracker.registerJob(jobInfo);
425
414
  await this.queue.enqueue(job);
@@ -428,7 +417,8 @@ export class Reactor {
428
417
  /**
429
418
  * Applies a list of actions to a document
430
419
  */
431
- async mutate(docId, branch, actions, signal) {
420
+ async execute(docId, branch, actions, signal, meta) {
421
+ this.logger.verbose("execute(@docId, @branch, @actions)", docId, branch, actions);
432
422
  if (signal?.aborted) {
433
423
  throw new AbortError();
434
424
  }
@@ -448,6 +438,7 @@ export class Reactor {
448
438
  queueHint: [],
449
439
  maxRetries: 3,
450
440
  errorHistory: [],
441
+ meta,
451
442
  };
452
443
  // Create job info and register with tracker
453
444
  const jobInfo = {
@@ -459,6 +450,7 @@ export class Reactor {
459
450
  createdAtUtcIso,
460
451
  coordinates: [],
461
452
  },
453
+ meta,
462
454
  };
463
455
  this.jobTracker.registerJob(jobInfo);
464
456
  // Enqueue the job
@@ -473,7 +465,8 @@ export class Reactor {
473
465
  * This function may cause a reshuffle, which will generate additional
474
466
  * operations.
475
467
  */
476
- async load(docId, branch, operations, signal) {
468
+ async load(docId, branch, operations, signal, meta) {
469
+ this.logger.verbose("load(@docId, @branch, @count, @operations)", docId, branch, operations.length, operations);
477
470
  if (signal?.aborted) {
478
471
  throw new AbortError();
479
472
  }
@@ -500,6 +493,7 @@ export class Reactor {
500
493
  queueHint: [],
501
494
  maxRetries: 3,
502
495
  errorHistory: [],
496
+ meta,
503
497
  };
504
498
  const jobInfo = {
505
499
  id: job.id,
@@ -510,6 +504,7 @@ export class Reactor {
510
504
  createdAtUtcIso,
511
505
  coordinates: [],
512
506
  },
507
+ meta,
513
508
  };
514
509
  this.jobTracker.registerJob(jobInfo);
515
510
  await this.queue.enqueue(job);
@@ -521,7 +516,8 @@ export class Reactor {
521
516
  /**
522
517
  * Applies multiple mutations across documents with dependency management
523
518
  */
524
- async mutateBatch(request, signal) {
519
+ async executeBatch(request, signal, meta) {
520
+ this.logger.verbose("executeBatch(@count jobs)", request.jobs.length);
525
521
  if (signal?.aborted) {
526
522
  throw new AbortError();
527
523
  }
@@ -546,6 +542,7 @@ export class Reactor {
546
542
  createdAtUtcIso,
547
543
  coordinates: [],
548
544
  },
545
+ meta,
549
546
  };
550
547
  this.jobTracker.registerJob(jobInfo);
551
548
  jobInfos.set(jobPlan.key, jobInfo);
@@ -572,6 +569,7 @@ export class Reactor {
572
569
  queueHint,
573
570
  maxRetries: 3,
574
571
  errorHistory: [],
572
+ meta,
575
573
  };
576
574
  await this.queue.enqueue(job);
577
575
  enqueuedKeys.push(key);
@@ -600,49 +598,38 @@ export class Reactor {
600
598
  /**
601
599
  * Adds multiple documents as children to another
602
600
  */
603
- async addChildren(parentId, documentIds, _view, signal) {
601
+ async addChildren(parentId, documentIds, branch = "main", signer, signal) {
602
+ this.logger.verbose("addChildren(@parentId, @count children, @branch)", parentId, documentIds.length, branch);
604
603
  if (signal?.aborted) {
605
604
  throw new AbortError();
606
605
  }
607
- const actions = documentIds.map((childId) => ({
608
- id: uuidv4(),
609
- type: "ADD_RELATIONSHIP",
610
- scope: "document",
611
- timestampUtcMs: new Date().toISOString(),
612
- input: {
613
- sourceId: parentId,
614
- targetId: childId,
615
- relationshipType: "child",
616
- },
617
- }));
618
- const branch = _view?.branch || "main";
619
- return await this.mutate(parentId, branch, actions, signal);
606
+ let actions = documentIds.map((childId) => addRelationshipAction(parentId, childId, "child"));
607
+ // Sign actions if signer is provided
608
+ if (signer) {
609
+ actions = await signActions(actions, signer, signal);
610
+ }
611
+ return await this.execute(parentId, branch, actions, signal);
620
612
  }
621
613
  /**
622
614
  * Removes multiple documents as children from another
623
615
  */
624
- async removeChildren(parentId, documentIds, _view, signal) {
616
+ async removeChildren(parentId, documentIds, branch = "main", signer, signal) {
617
+ this.logger.verbose("removeChildren(@parentId, @count children, @branch)", parentId, documentIds.length, branch);
625
618
  if (signal?.aborted) {
626
619
  throw new AbortError();
627
620
  }
628
- const actions = documentIds.map((childId) => ({
629
- id: uuidv4(),
630
- type: "REMOVE_RELATIONSHIP",
631
- scope: "document",
632
- timestampUtcMs: new Date().toISOString(),
633
- input: {
634
- sourceId: parentId,
635
- targetId: childId,
636
- relationshipType: "child",
637
- },
638
- }));
639
- const branch = _view?.branch || "main";
640
- return await this.mutate(parentId, branch, actions, signal);
621
+ let actions = documentIds.map((childId) => removeRelationshipAction(parentId, childId, "child"));
622
+ // Sign actions if signer is provided
623
+ if (signer) {
624
+ actions = await signActions(actions, signer, signal);
625
+ }
626
+ return await this.execute(parentId, branch, actions, signal);
641
627
  }
642
628
  /**
643
629
  * Retrieves the status of a job
644
630
  */
645
631
  getJobStatus(jobId, signal) {
632
+ this.logger.verbose("getJobStatus(@jobId)", jobId);
646
633
  if (signal?.aborted) {
647
634
  throw new AbortError();
648
635
  }
@@ -669,6 +656,7 @@ export class Reactor {
669
656
  * Finds documents by their IDs
670
657
  */
671
658
  async findByIds(ids, view, paging, consistencyToken, signal) {
659
+ this.logger.verbose("findByIds(@count ids)", ids.length);
672
660
  if (consistencyToken) {
673
661
  await this.documentView.waitForConsistency(consistencyToken, undefined, signal);
674
662
  }
@@ -681,7 +669,7 @@ export class Reactor {
681
669
  }
682
670
  let document;
683
671
  try {
684
- document = await this.documentStorage.get(id);
672
+ document = await this.documentStorage.get(id, consistencyToken, signal);
685
673
  }
686
674
  catch {
687
675
  // Skip documents that don't exist or can't be accessed
@@ -712,7 +700,7 @@ export class Reactor {
712
700
  options: paging || { cursor: "0", limit: documents.length },
713
701
  nextCursor,
714
702
  next: hasMore
715
- ? () => this.findByIds(ids, view, { cursor: nextCursor, limit }, undefined, signal)
703
+ ? () => this.findByIds(ids, view, { cursor: nextCursor, limit }, consistencyToken, signal)
716
704
  : undefined,
717
705
  };
718
706
  }
@@ -747,7 +735,7 @@ export class Reactor {
747
735
  options: paging || { cursor: "0", limit: documents.length },
748
736
  nextCursor,
749
737
  next: hasMore
750
- ? () => this.findByIds(ids, view, { cursor: nextCursor, limit }, undefined, signal)
738
+ ? () => this.findByIds(ids, view, { cursor: nextCursor, limit }, consistencyToken, signal)
751
739
  : undefined,
752
740
  };
753
741
  }
@@ -756,6 +744,7 @@ export class Reactor {
756
744
  * Finds documents by their slugs
757
745
  */
758
746
  async findBySlugs(slugs, view, paging, consistencyToken, signal) {
747
+ this.logger.verbose("findBySlugs(@count slugs)", slugs.length);
759
748
  if (consistencyToken) {
760
749
  await this.documentView.waitForConsistency(consistencyToken, undefined, signal);
761
750
  }
@@ -764,7 +753,7 @@ export class Reactor {
764
753
  // Use storage to resolve slugs to IDs
765
754
  let ids;
766
755
  try {
767
- ids = await this.documentStorage.resolveIds(slugs, signal);
756
+ ids = await this.documentStorage.resolveIds(slugs, consistencyToken, signal);
768
757
  }
769
758
  catch {
770
759
  // If slug resolution fails, return empty results
@@ -778,7 +767,7 @@ export class Reactor {
778
767
  }
779
768
  let document;
780
769
  try {
781
- document = await this.documentStorage.get(id);
770
+ document = await this.documentStorage.get(id, consistencyToken, signal);
782
771
  }
783
772
  catch {
784
773
  // Skip documents that don't exist or can't be accessed
@@ -809,7 +798,7 @@ export class Reactor {
809
798
  options: paging || { cursor: "0", limit: documents.length },
810
799
  nextCursor,
811
800
  next: hasMore
812
- ? () => this.findBySlugs(slugs, view, { cursor: nextCursor, limit }, undefined, signal)
801
+ ? () => this.findBySlugs(slugs, view, { cursor: nextCursor, limit }, consistencyToken, signal)
813
802
  : undefined,
814
803
  };
815
804
  }
@@ -855,7 +844,7 @@ export class Reactor {
855
844
  options: paging || { cursor: "0", limit: documents.length },
856
845
  nextCursor,
857
846
  next: hasMore
858
- ? () => this.findBySlugs(slugs, view, { cursor: nextCursor, limit }, undefined, signal)
847
+ ? () => this.findBySlugs(slugs, view, { cursor: nextCursor, limit }, consistencyToken, signal)
859
848
  : undefined,
860
849
  };
861
850
  }
@@ -864,6 +853,7 @@ export class Reactor {
864
853
  * Finds documents by parent ID
865
854
  */
866
855
  async findByParentId(parentId, view, paging, signal) {
856
+ this.logger.verbose("findByParentId(@parentId)", parentId);
867
857
  // Get child relationships from indexer
868
858
  const relationships = await this._documentIndexer.getOutgoing(parentId, ["child"], undefined, signal);
869
859
  if (signal?.aborted) {
@@ -919,6 +909,7 @@ export class Reactor {
919
909
  * Finds documents by type
920
910
  */
921
911
  async findByType(type, view, paging, consistencyToken, signal) {
912
+ this.logger.verbose("findByType(@type)", type);
922
913
  if (consistencyToken) {
923
914
  await this.documentView.waitForConsistency(consistencyToken, undefined, signal);
924
915
  }
@@ -928,7 +919,7 @@ export class Reactor {
928
919
  const cursor = paging?.cursor;
929
920
  const limit = paging?.limit || 100;
930
921
  // Get document IDs of the specified type
931
- const { documents: documentIds, nextCursor } = await this.documentStorage.findByType(type, limit, cursor);
922
+ const { documents: documentIds, nextCursor } = await this.documentStorage.findByType(type, limit, cursor, consistencyToken, signal);
932
923
  if (signal?.aborted) {
933
924
  throw new AbortError();
934
925
  }
@@ -939,7 +930,7 @@ export class Reactor {
939
930
  }
940
931
  let document;
941
932
  try {
942
- document = await this.documentStorage.get(documentId);
933
+ document = await this.documentStorage.get(documentId, consistencyToken, signal);
943
934
  }
944
935
  catch {
945
936
  // Skip documents that can't be retrieved
@@ -962,12 +953,12 @@ export class Reactor {
962
953
  options: paging || { cursor: cursor || "0", limit },
963
954
  nextCursor,
964
955
  next: nextCursor
965
- ? async () => this.findByType(type, view, { cursor: nextCursor, limit }, undefined, signal)
956
+ ? async () => this.findByType(type, view, { cursor: nextCursor, limit }, consistencyToken, signal)
966
957
  : undefined,
967
958
  };
968
959
  }
969
960
  else {
970
- const result = await this.documentView.findByType(type, view, paging, undefined, signal);
961
+ const result = await this.documentView.findByType(type, view, paging, consistencyToken, signal);
971
962
  if (signal?.aborted) {
972
963
  throw new AbortError();
973
964
  }
@@ -978,7 +969,7 @@ export class Reactor {
978
969
  options: paging || { cursor: cursor || "0", limit },
979
970
  nextCursor: result.nextCursor,
980
971
  next: result.nextCursor
981
- ? async () => this.findByType(type, view, { cursor: result.nextCursor, limit }, undefined, signal)
972
+ ? async () => this.findByType(type, view, { cursor: result.nextCursor, limit }, consistencyToken, signal)
982
973
  : undefined,
983
974
  };
984
975
  }