@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.
- package/dist/src/actions/index.d.ts +24 -0
- package/dist/src/actions/index.d.ts.map +1 -0
- package/dist/src/actions/index.js +76 -0
- package/dist/src/actions/index.js.map +1 -0
- package/dist/src/cache/document-meta-cache-types.d.ts +114 -0
- package/dist/src/cache/document-meta-cache-types.d.ts.map +1 -0
- package/dist/src/cache/document-meta-cache-types.js +2 -0
- package/dist/src/cache/document-meta-cache-types.js.map +1 -0
- package/dist/src/cache/document-meta-cache.d.ts +30 -0
- package/dist/src/cache/document-meta-cache.d.ts.map +1 -0
- package/dist/src/cache/document-meta-cache.js +128 -0
- package/dist/src/cache/document-meta-cache.js.map +1 -0
- package/dist/src/cache/kysely-operation-index.d.ts +4 -2
- package/dist/src/cache/kysely-operation-index.d.ts.map +1 -1
- package/dist/src/cache/kysely-operation-index.js +67 -24
- package/dist/src/cache/kysely-operation-index.js.map +1 -1
- package/dist/src/cache/kysely-write-cache.d.ts.map +1 -1
- package/dist/src/cache/kysely-write-cache.js +3 -2
- package/dist/src/cache/kysely-write-cache.js.map +1 -1
- package/dist/src/cache/operation-index-types.d.ts +4 -3
- package/dist/src/cache/operation-index-types.d.ts.map +1 -1
- package/dist/src/cache/operation-index-types.js.map +1 -1
- package/dist/src/client/reactor-client.d.ts +22 -10
- package/dist/src/client/reactor-client.d.ts.map +1 -1
- package/dist/src/client/reactor-client.js +145 -48
- package/dist/src/client/reactor-client.js.map +1 -1
- package/dist/src/client/types.d.ts +32 -13
- package/dist/src/client/types.d.ts.map +1 -1
- package/dist/src/core/reactor-builder.d.ts +19 -12
- package/dist/src/core/reactor-builder.d.ts.map +1 -1
- package/dist/src/core/reactor-builder.js +127 -37
- package/dist/src/core/reactor-builder.js.map +1 -1
- package/dist/src/core/{builder.d.ts → reactor-client-builder.d.ts} +20 -4
- package/dist/src/core/reactor-client-builder.d.ts.map +1 -0
- package/dist/src/core/reactor-client-builder.js +123 -0
- package/dist/src/core/reactor-client-builder.js.map +1 -0
- package/dist/src/core/reactor.d.ts +14 -16
- package/dist/src/core/reactor.d.ts.map +1 -1
- package/dist/src/core/reactor.js +101 -110
- package/dist/src/core/reactor.js.map +1 -1
- package/dist/src/core/types.d.ts +101 -22
- package/dist/src/core/types.d.ts.map +1 -1
- package/dist/src/core/utils.d.ts +9 -1
- package/dist/src/core/utils.d.ts.map +1 -1
- package/dist/src/core/utils.js +30 -0
- package/dist/src/core/utils.js.map +1 -1
- package/dist/src/events/types.d.ts +1 -0
- package/dist/src/events/types.d.ts.map +1 -1
- package/dist/src/executor/simple-job-executor-manager.d.ts +3 -1
- package/dist/src/executor/simple-job-executor-manager.d.ts.map +1 -1
- package/dist/src/executor/simple-job-executor-manager.js +10 -7
- package/dist/src/executor/simple-job-executor-manager.js.map +1 -1
- package/dist/src/executor/simple-job-executor.d.ts +20 -2
- package/dist/src/executor/simple-job-executor.d.ts.map +1 -1
- package/dist/src/executor/simple-job-executor.js +400 -219
- package/dist/src/executor/simple-job-executor.js.map +1 -1
- package/dist/src/executor/types.d.ts +2 -0
- package/dist/src/executor/types.d.ts.map +1 -1
- package/dist/src/executor/types.js.map +1 -1
- package/dist/src/executor/util.d.ts +14 -5
- package/dist/src/executor/util.d.ts.map +1 -1
- package/dist/src/executor/util.js +36 -9
- package/dist/src/executor/util.js.map +1 -1
- package/dist/src/index.d.ts +17 -6
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +15 -3
- package/dist/src/index.js.map +1 -1
- package/dist/src/logging/console.d.ts +23 -0
- package/dist/src/logging/console.d.ts.map +1 -0
- package/dist/src/logging/console.js +108 -0
- package/dist/src/logging/console.js.map +1 -0
- package/dist/src/logging/types.d.ts +12 -0
- package/dist/src/logging/types.d.ts.map +1 -0
- package/dist/src/logging/types.js +2 -0
- package/dist/src/logging/types.js.map +1 -0
- package/dist/src/processors/index.d.ts +3 -0
- package/dist/src/processors/index.d.ts.map +1 -0
- package/dist/src/processors/index.js +2 -0
- package/dist/src/processors/index.js.map +1 -0
- package/dist/src/processors/processor-manager.d.ts +38 -0
- package/dist/src/processors/processor-manager.d.ts.map +1 -0
- package/dist/src/processors/processor-manager.js +165 -0
- package/dist/src/processors/processor-manager.js.map +1 -0
- package/dist/src/processors/types.d.ts +63 -0
- package/dist/src/processors/types.d.ts.map +1 -0
- package/dist/src/processors/types.js +2 -0
- package/dist/src/processors/types.js.map +1 -0
- package/dist/src/processors/utils.d.ts +10 -0
- package/dist/src/processors/utils.d.ts.map +1 -0
- package/dist/src/processors/utils.js +58 -0
- package/dist/src/processors/utils.js.map +1 -0
- package/dist/src/queue/types.d.ts +2 -0
- package/dist/src/queue/types.d.ts.map +1 -1
- package/dist/src/queue/types.js.map +1 -1
- package/dist/src/read-models/base-read-model.d.ts +60 -0
- package/dist/src/read-models/base-read-model.d.ts.map +1 -0
- package/dist/src/read-models/base-read-model.js +143 -0
- package/dist/src/read-models/base-read-model.js.map +1 -0
- package/dist/src/read-models/coordinator.d.ts +3 -2
- package/dist/src/read-models/coordinator.d.ts.map +1 -1
- package/dist/src/read-models/coordinator.js +12 -13
- package/dist/src/read-models/coordinator.js.map +1 -1
- package/dist/src/read-models/document-view.d.ts +6 -7
- package/dist/src/read-models/document-view.d.ts.map +1 -1
- package/dist/src/read-models/document-view.js +18 -81
- package/dist/src/read-models/document-view.js.map +1 -1
- package/dist/src/read-models/types.d.ts +2 -1
- package/dist/src/read-models/types.d.ts.map +1 -1
- package/dist/src/registry/implementation.d.ts +42 -34
- package/dist/src/registry/implementation.d.ts.map +1 -1
- package/dist/src/registry/implementation.js +168 -48
- package/dist/src/registry/implementation.js.map +1 -1
- package/dist/src/registry/interfaces.d.ts +69 -8
- package/dist/src/registry/interfaces.d.ts.map +1 -1
- package/dist/src/shared/errors.d.ts +24 -0
- package/dist/src/shared/errors.d.ts.map +1 -1
- package/dist/src/shared/errors.js +42 -0
- package/dist/src/shared/errors.js.map +1 -1
- package/dist/src/shared/types.d.ts +4 -0
- package/dist/src/shared/types.d.ts.map +1 -1
- package/dist/src/shared/types.js.map +1 -1
- package/dist/src/signer/passthrough-signer.d.ts +9 -3
- package/dist/src/signer/passthrough-signer.d.ts.map +1 -1
- package/dist/src/signer/passthrough-signer.js +13 -0
- package/dist/src/signer/passthrough-signer.js.map +1 -1
- package/dist/src/signer/types.d.ts +12 -10
- package/dist/src/signer/types.d.ts.map +1 -1
- package/dist/src/storage/consistency-aware-legacy-storage.d.ts +33 -0
- package/dist/src/storage/consistency-aware-legacy-storage.d.ts.map +1 -0
- package/dist/src/storage/consistency-aware-legacy-storage.js +65 -0
- package/dist/src/storage/consistency-aware-legacy-storage.js.map +1 -0
- package/dist/src/storage/interfaces.d.ts +94 -1
- package/dist/src/storage/interfaces.d.ts.map +1 -1
- package/dist/src/storage/interfaces.js +2 -2
- package/dist/src/storage/interfaces.js.map +1 -1
- package/dist/src/storage/kysely/store.d.ts +1 -0
- package/dist/src/storage/kysely/store.d.ts.map +1 -1
- package/dist/src/storage/kysely/store.js +41 -4
- package/dist/src/storage/kysely/store.js.map +1 -1
- package/dist/src/storage/kysely/sync-cursor-storage.js +2 -2
- package/dist/src/storage/kysely/sync-cursor-storage.js.map +1 -1
- package/dist/src/storage/kysely/sync-remote-storage.d.ts.map +1 -1
- package/dist/src/storage/kysely/sync-remote-storage.js +11 -12
- package/dist/src/storage/kysely/sync-remote-storage.js.map +1 -1
- package/dist/src/storage/kysely/types.d.ts +6 -6
- package/dist/src/storage/migrations/001_create_operation_table.d.ts.map +1 -1
- package/dist/src/storage/migrations/001_create_operation_table.js +2 -1
- package/dist/src/storage/migrations/001_create_operation_table.js.map +1 -1
- package/dist/src/storage/migrations/008_create_view_state_table.d.ts +1 -1
- package/dist/src/storage/migrations/008_create_view_state_table.d.ts.map +1 -1
- package/dist/src/storage/migrations/008_create_view_state_table.js +2 -1
- package/dist/src/storage/migrations/008_create_view_state_table.js.map +1 -1
- package/dist/src/storage/migrations/009_create_operation_index_tables.js +1 -1
- package/dist/src/storage/migrations/009_create_operation_index_tables.js.map +1 -1
- package/dist/src/storage/migrations/010_create_sync_tables.js +5 -5
- package/dist/src/storage/migrations/010_create_sync_tables.js.map +1 -1
- package/dist/src/storage/migrations/migrator.d.ts +3 -2
- package/dist/src/storage/migrations/migrator.d.ts.map +1 -1
- package/dist/src/storage/migrations/migrator.js +29 -6
- package/dist/src/storage/migrations/migrator.js.map +1 -1
- package/dist/src/storage/migrations/run-migrations.js +3 -3
- package/dist/src/storage/migrations/run-migrations.js.map +1 -1
- package/dist/src/storage/txn.d.ts.map +1 -1
- package/dist/src/storage/txn.js +2 -3
- package/dist/src/storage/txn.js.map +1 -1
- package/dist/src/subs/subscription-notification-read-model.d.ts +17 -0
- package/dist/src/subs/subscription-notification-read-model.d.ts.map +1 -0
- package/dist/src/subs/subscription-notification-read-model.js +62 -0
- package/dist/src/subs/subscription-notification-read-model.js.map +1 -0
- package/dist/src/sync/channels/composite-channel-factory.d.ts +30 -0
- package/dist/src/sync/channels/composite-channel-factory.d.ts.map +1 -0
- package/dist/src/sync/channels/composite-channel-factory.js +87 -0
- package/dist/src/sync/channels/composite-channel-factory.js.map +1 -0
- package/dist/src/sync/channels/gql-channel-factory.d.ts +25 -0
- package/dist/src/sync/channels/gql-channel-factory.d.ts.map +1 -0
- package/dist/src/sync/channels/gql-channel-factory.js +76 -0
- package/dist/src/sync/channels/gql-channel-factory.js.map +1 -0
- package/dist/src/sync/channels/gql-channel.d.ts +118 -0
- package/dist/src/sync/channels/gql-channel.d.ts.map +1 -0
- package/dist/src/sync/channels/gql-channel.js +423 -0
- package/dist/src/sync/channels/gql-channel.js.map +1 -0
- package/dist/src/sync/channels/index.d.ts +4 -1
- package/dist/src/sync/channels/index.d.ts.map +1 -1
- package/dist/src/sync/channels/index.js +4 -1
- package/dist/src/sync/channels/index.js.map +1 -1
- package/dist/src/sync/channels/polling-channel.d.ts +39 -0
- package/dist/src/sync/channels/polling-channel.d.ts.map +1 -0
- package/dist/src/sync/channels/polling-channel.js +72 -0
- package/dist/src/sync/channels/polling-channel.js.map +1 -0
- package/dist/src/sync/channels/utils.d.ts +17 -2
- package/dist/src/sync/channels/utils.d.ts.map +1 -1
- package/dist/src/sync/channels/utils.js +76 -6
- package/dist/src/sync/channels/utils.js.map +1 -1
- package/dist/src/sync/errors.d.ts +1 -1
- package/dist/src/sync/errors.d.ts.map +1 -1
- package/dist/src/sync/errors.js +2 -2
- package/dist/src/sync/errors.js.map +1 -1
- package/dist/src/sync/index.d.ts +2 -2
- package/dist/src/sync/index.d.ts.map +1 -1
- package/dist/src/sync/index.js +2 -2
- package/dist/src/sync/index.js.map +1 -1
- package/dist/src/sync/interfaces.d.ts +33 -3
- package/dist/src/sync/interfaces.d.ts.map +1 -1
- package/dist/src/sync/sync-builder.d.ts +4 -2
- package/dist/src/sync/sync-builder.d.ts.map +1 -1
- package/dist/src/sync/sync-builder.js +12 -2
- package/dist/src/sync/sync-builder.js.map +1 -1
- package/dist/src/sync/sync-manager.d.ts +7 -3
- package/dist/src/sync/sync-manager.d.ts.map +1 -1
- package/dist/src/sync/sync-manager.js +79 -10
- package/dist/src/sync/sync-manager.js.map +1 -1
- package/dist/src/sync/types.d.ts +1 -2
- package/dist/src/sync/types.d.ts.map +1 -1
- package/dist/src/sync/utils.d.ts +19 -0
- package/dist/src/sync/utils.d.ts.map +1 -1
- package/dist/src/sync/utils.js +44 -0
- package/dist/src/sync/utils.js.map +1 -1
- package/package.json +6 -5
- package/dist/src/core/builder.d.ts.map +0 -1
- package/dist/src/core/builder.js +0 -88
- package/dist/src/core/builder.js.map +0 -1
- package/dist/src/sync/channels/internal-channel.d.ts +0 -57
- package/dist/src/sync/channels/internal-channel.d.ts.map +0 -1
- package/dist/src/sync/channels/internal-channel.js +0 -106
- package/dist/src/sync/channels/internal-channel.js.map +0 -1
package/dist/src/core/reactor.js
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
313
|
-
const input = {
|
|
313
|
+
const createInput = {
|
|
314
314
|
model: document.header.documentType,
|
|
315
|
-
version:
|
|
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
|
-
|
|
319
|
-
|
|
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
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
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
|
|
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
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
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
|
|
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
|
|
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,
|
|
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
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
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,
|
|
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
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
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 },
|
|
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 },
|
|
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 },
|
|
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 },
|
|
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 },
|
|
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,
|
|
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 },
|
|
972
|
+
? async () => this.findByType(type, view, { cursor: result.nextCursor, limit }, consistencyToken, signal)
|
|
982
973
|
: undefined,
|
|
983
974
|
};
|
|
984
975
|
}
|