@powerhousedao/reactor 4.1.0-dev.9 → 5.0.0-staging.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/bench/end-to-end-flow.bench.js +21 -11
- package/dist/bench/end-to-end-flow.bench.js.map +1 -1
- package/dist/bench/event-bus.bench.js +7 -7
- package/dist/bench/event-bus.bench.js.map +1 -1
- package/dist/bench/queue-only.bench.js +8 -3
- package/dist/bench/queue-only.bench.js.map +1 -1
- package/dist/bench/reactor-throughput.bench.js +18 -8
- package/dist/bench/reactor-throughput.bench.js.map +1 -1
- package/dist/src/events/event-bus.d.ts +2 -2
- package/dist/src/events/event-bus.d.ts.map +1 -1
- package/dist/src/events/event-bus.js +1 -1
- package/dist/src/events/event-bus.js.map +1 -1
- package/dist/src/events/interfaces.d.ts +1 -1
- package/dist/src/events/interfaces.d.ts.map +1 -1
- package/dist/src/events/types.d.ts +1 -1
- package/dist/src/events/types.d.ts.map +1 -1
- package/dist/src/events/types.js.map +1 -1
- package/dist/src/executor/interfaces.d.ts +2 -2
- package/dist/src/executor/interfaces.d.ts.map +1 -1
- package/dist/src/executor/job-executor.d.ts +5 -5
- package/dist/src/executor/job-executor.d.ts.map +1 -1
- package/dist/src/executor/job-executor.js +2 -2
- package/dist/src/executor/job-executor.js.map +1 -1
- package/dist/src/executor/types.d.ts +1 -1
- package/dist/src/executor/types.d.ts.map +1 -1
- package/dist/src/index.d.ts +4 -1
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +3 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/interfaces/reactor.d.ts +121 -0
- package/dist/src/interfaces/reactor.d.ts.map +1 -0
- package/dist/src/interfaces/reactor.js +2 -0
- package/dist/src/interfaces/reactor.js.map +1 -0
- package/dist/src/queue/interfaces.d.ts +1 -1
- package/dist/src/queue/interfaces.d.ts.map +1 -1
- package/dist/src/queue/queue.d.ts +3 -3
- package/dist/src/queue/queue.d.ts.map +1 -1
- package/dist/src/queue/queue.js.map +1 -1
- package/dist/src/queue/types.d.ts +1 -1
- package/dist/src/queue/types.d.ts.map +1 -1
- package/dist/src/reactor.d.ts +109 -0
- package/dist/src/reactor.d.ts.map +1 -0
- package/dist/src/reactor.js +602 -0
- package/dist/src/reactor.js.map +1 -0
- package/dist/src/shared/factories.d.ts +16 -0
- package/dist/src/shared/factories.d.ts.map +1 -0
- package/dist/src/shared/factories.js +33 -0
- package/dist/src/shared/factories.js.map +1 -0
- package/dist/src/shared/types.d.ts +83 -19
- package/dist/src/shared/types.d.ts.map +1 -1
- package/dist/src/shared/types.js +30 -1
- package/dist/src/shared/types.js.map +1 -1
- package/dist/src/shared/utils.d.ts +3 -0
- package/dist/src/shared/utils.d.ts.map +1 -0
- package/dist/src/shared/utils.js +8 -0
- package/dist/src/shared/utils.js.map +1 -0
- package/dist/src/utils.d.ts +11 -0
- package/dist/src/utils.d.ts.map +1 -0
- package/dist/src/utils.js +29 -0
- package/dist/src/utils.js.map +1 -0
- package/dist/test/event-bus.test.js +4 -4
- package/dist/test/event-bus.test.js.map +1 -1
- package/dist/test/job-executor.test.js +9 -3
- package/dist/test/job-executor.test.js.map +1 -1
- package/dist/test/queue.test.js +17 -6
- package/dist/test/queue.test.js.map +1 -1
- package/dist/test/reactor-read.test.d.ts +2 -0
- package/dist/test/reactor-read.test.d.ts.map +1 -0
- package/dist/test/reactor-read.test.js +330 -0
- package/dist/test/reactor-read.test.js.map +1 -0
- package/dist/test/reactor-write.test.d.ts +2 -0
- package/dist/test/reactor-write.test.d.ts.map +1 -0
- package/dist/test/reactor-write.test.js +232 -0
- package/dist/test/reactor-write.test.js.map +1 -0
- package/dist/test/utils.test.d.ts +2 -0
- package/dist/test/utils.test.d.ts.map +1 -0
- package/dist/test/utils.test.js +66 -0
- package/dist/test/utils.test.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +6 -1
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
import { MemoryStorage, ReactorBuilder, driveDocumentModelModule, } from "document-drive";
|
|
2
|
+
import { documentModelDocumentModelModule } from "document-model";
|
|
3
|
+
import { v4 as uuidv4 } from "uuid";
|
|
4
|
+
import { beforeEach, describe, expect, it, vi } from "vitest";
|
|
5
|
+
import { EventBus } from "../src/events/event-bus.js";
|
|
6
|
+
import { InMemoryJobExecutor } from "../src/executor/job-executor.js";
|
|
7
|
+
import { InMemoryQueue } from "../src/queue/queue.js";
|
|
8
|
+
import { Reactor } from "../src/reactor.js";
|
|
9
|
+
import { JobStatus } from "../src/shared/types.js";
|
|
10
|
+
// Helper to create a valid PHDocument using the document model utils
|
|
11
|
+
function createMockDocument(overrides = {}) {
|
|
12
|
+
const baseDocument = documentModelDocumentModelModule.utils.createDocument();
|
|
13
|
+
// Apply overrides if provided
|
|
14
|
+
if (overrides.id) {
|
|
15
|
+
baseDocument.header.id = overrides.id;
|
|
16
|
+
}
|
|
17
|
+
if (overrides.slug) {
|
|
18
|
+
baseDocument.header.slug = overrides.slug;
|
|
19
|
+
}
|
|
20
|
+
if (overrides.documentType) {
|
|
21
|
+
baseDocument.header.documentType = overrides.documentType;
|
|
22
|
+
}
|
|
23
|
+
if (overrides.state) {
|
|
24
|
+
baseDocument.state = {
|
|
25
|
+
...baseDocument.state,
|
|
26
|
+
...overrides.state,
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
return baseDocument;
|
|
30
|
+
}
|
|
31
|
+
describe("Reactor Write Interface - Mutate with Queue Integration", () => {
|
|
32
|
+
let reactor;
|
|
33
|
+
let driveServer;
|
|
34
|
+
let storage;
|
|
35
|
+
let eventBus;
|
|
36
|
+
let queue;
|
|
37
|
+
let jobExecutor;
|
|
38
|
+
const documentModels = [
|
|
39
|
+
documentModelDocumentModelModule,
|
|
40
|
+
driveDocumentModelModule,
|
|
41
|
+
];
|
|
42
|
+
beforeEach(async () => {
|
|
43
|
+
// Create shared storage
|
|
44
|
+
storage = new MemoryStorage();
|
|
45
|
+
// Create real drive server with the storage
|
|
46
|
+
const builder = new ReactorBuilder(documentModels);
|
|
47
|
+
builder.withStorage(storage);
|
|
48
|
+
driveServer = builder.build();
|
|
49
|
+
await driveServer.initialize();
|
|
50
|
+
// Create event bus, queue, and executor
|
|
51
|
+
eventBus = new EventBus();
|
|
52
|
+
queue = new InMemoryQueue(eventBus);
|
|
53
|
+
jobExecutor = new InMemoryJobExecutor(eventBus, queue);
|
|
54
|
+
// Create reactor with all dependencies
|
|
55
|
+
reactor = new Reactor(driveServer, storage, eventBus, queue, jobExecutor);
|
|
56
|
+
});
|
|
57
|
+
describe("mutate", () => {
|
|
58
|
+
it("should enqueue jobs for document mutations", async () => {
|
|
59
|
+
// Create a test document
|
|
60
|
+
const testDoc = createMockDocument({
|
|
61
|
+
id: "test-doc-1",
|
|
62
|
+
slug: "test-doc",
|
|
63
|
+
});
|
|
64
|
+
// Add the document to the drive server
|
|
65
|
+
await driveServer.addDocument(testDoc);
|
|
66
|
+
// Create a mock action for the documentmodel document type
|
|
67
|
+
const action = {
|
|
68
|
+
id: uuidv4(),
|
|
69
|
+
type: "SET_NAME",
|
|
70
|
+
scope: "global",
|
|
71
|
+
input: { name: "Updated Document Model" },
|
|
72
|
+
timestampUtcMs: String(Date.now()),
|
|
73
|
+
};
|
|
74
|
+
// Spy on the queue's enqueue method
|
|
75
|
+
const enqueueSpy = vi.spyOn(queue, "enqueue");
|
|
76
|
+
const result = await reactor.mutate(testDoc.header.id, [action]);
|
|
77
|
+
// Verify that the queue's enqueue method was called
|
|
78
|
+
expect(enqueueSpy).toHaveBeenCalledTimes(1);
|
|
79
|
+
// Verify the job structure
|
|
80
|
+
const enqueuedJob = enqueueSpy.mock.calls[0][0];
|
|
81
|
+
expect(enqueuedJob.documentId).toBe(testDoc.header.id);
|
|
82
|
+
expect(enqueuedJob.operation.action).toEqual(action);
|
|
83
|
+
expect(enqueuedJob.scope).toBe(action.scope || "global");
|
|
84
|
+
expect(enqueuedJob.branch).toBe("main");
|
|
85
|
+
// Verify the result
|
|
86
|
+
expect(result).toBeDefined();
|
|
87
|
+
expect(result.id).toBeDefined();
|
|
88
|
+
expect(result.status).toBe(JobStatus.PENDING);
|
|
89
|
+
});
|
|
90
|
+
it("should create proper Job objects from actions", async () => {
|
|
91
|
+
// Create a test document
|
|
92
|
+
const testDoc = createMockDocument({
|
|
93
|
+
id: "test-doc-2",
|
|
94
|
+
slug: "test-doc-2",
|
|
95
|
+
});
|
|
96
|
+
// Add the document to the drive server
|
|
97
|
+
await driveServer.addDocument(testDoc);
|
|
98
|
+
// Create multiple actions
|
|
99
|
+
const actions = [
|
|
100
|
+
{
|
|
101
|
+
id: uuidv4(),
|
|
102
|
+
type: "SET_NAME",
|
|
103
|
+
scope: "global",
|
|
104
|
+
input: { name: "First Update" },
|
|
105
|
+
timestampUtcMs: String(Date.now()),
|
|
106
|
+
},
|
|
107
|
+
{
|
|
108
|
+
id: uuidv4(),
|
|
109
|
+
type: "SET_DESCRIPTION",
|
|
110
|
+
scope: "global",
|
|
111
|
+
input: { description: "Test description" },
|
|
112
|
+
timestampUtcMs: String(Date.now() + 1000),
|
|
113
|
+
},
|
|
114
|
+
];
|
|
115
|
+
// Capture the jobs that are enqueued
|
|
116
|
+
const enqueuedJobs = [];
|
|
117
|
+
vi.spyOn(queue, "enqueue").mockImplementation((job) => {
|
|
118
|
+
enqueuedJobs.push(job);
|
|
119
|
+
return Promise.resolve();
|
|
120
|
+
});
|
|
121
|
+
const result = await reactor.mutate(testDoc.header.id, actions);
|
|
122
|
+
// Verify jobs were enqueued
|
|
123
|
+
expect(enqueuedJobs).toHaveLength(actions.length);
|
|
124
|
+
enqueuedJobs.forEach((job, index) => {
|
|
125
|
+
expect(job.documentId).toBe(testDoc.header.id);
|
|
126
|
+
expect(job.operation.action).toEqual(actions[index]);
|
|
127
|
+
expect(job.scope).toBe(actions[index].scope || "global");
|
|
128
|
+
expect(job.branch).toBe("main");
|
|
129
|
+
expect(job.operation.index).toBe(index);
|
|
130
|
+
});
|
|
131
|
+
// Verify the result
|
|
132
|
+
expect(result.status).toBe(JobStatus.PENDING);
|
|
133
|
+
});
|
|
134
|
+
it("should start the job executor when jobs are enqueued", async () => {
|
|
135
|
+
// Create a test document
|
|
136
|
+
const testDoc = createMockDocument({
|
|
137
|
+
id: "test-doc-3",
|
|
138
|
+
slug: "test-doc-3",
|
|
139
|
+
});
|
|
140
|
+
// Add the document to the drive server
|
|
141
|
+
await driveServer.addDocument(testDoc);
|
|
142
|
+
// Spy on the executor's start method
|
|
143
|
+
const executorStartSpy = vi.spyOn(jobExecutor, "start");
|
|
144
|
+
const action = {
|
|
145
|
+
id: uuidv4(),
|
|
146
|
+
type: "SET_NAME",
|
|
147
|
+
scope: "global",
|
|
148
|
+
input: { name: "Test Name" },
|
|
149
|
+
timestampUtcMs: String(Date.now()),
|
|
150
|
+
};
|
|
151
|
+
await reactor.mutate(testDoc.header.id, [action]);
|
|
152
|
+
// The executor should be started
|
|
153
|
+
expect(executorStartSpy).toHaveBeenCalledTimes(1);
|
|
154
|
+
expect(executorStartSpy).toHaveBeenCalledWith({
|
|
155
|
+
maxConcurrency: 5,
|
|
156
|
+
jobTimeout: 30000,
|
|
157
|
+
});
|
|
158
|
+
});
|
|
159
|
+
it("should return JobInfo with pending status when jobs are enqueued", async () => {
|
|
160
|
+
// Create a test document
|
|
161
|
+
const testDoc = createMockDocument({
|
|
162
|
+
id: "test-doc-4",
|
|
163
|
+
slug: "test-doc-4",
|
|
164
|
+
});
|
|
165
|
+
// Add the document to the drive server
|
|
166
|
+
await driveServer.addDocument(testDoc);
|
|
167
|
+
const action = {
|
|
168
|
+
id: uuidv4(),
|
|
169
|
+
type: "SET_NAME",
|
|
170
|
+
scope: "global",
|
|
171
|
+
input: { name: "Test Name" },
|
|
172
|
+
timestampUtcMs: String(Date.now()),
|
|
173
|
+
};
|
|
174
|
+
const result = await reactor.mutate(testDoc.header.id, [action]);
|
|
175
|
+
// Now that we use the queue, it should return PENDING
|
|
176
|
+
expect(result).toBeDefined();
|
|
177
|
+
expect(result.id).toBeDefined();
|
|
178
|
+
expect(result.status).toBe(JobStatus.PENDING);
|
|
179
|
+
});
|
|
180
|
+
it("should handle multiple actions in sequence", async () => {
|
|
181
|
+
// Create a test document
|
|
182
|
+
const testDoc = createMockDocument({
|
|
183
|
+
id: "test-doc-5",
|
|
184
|
+
slug: "test-doc-5",
|
|
185
|
+
});
|
|
186
|
+
// Add the document to the drive server
|
|
187
|
+
await driveServer.addDocument(testDoc);
|
|
188
|
+
const actions = [
|
|
189
|
+
{
|
|
190
|
+
id: uuidv4(),
|
|
191
|
+
type: "SET_NAME",
|
|
192
|
+
scope: "global",
|
|
193
|
+
input: { name: "Name 1" },
|
|
194
|
+
timestampUtcMs: String(Date.now()),
|
|
195
|
+
},
|
|
196
|
+
{
|
|
197
|
+
id: uuidv4(),
|
|
198
|
+
type: "SET_NAME",
|
|
199
|
+
scope: "global",
|
|
200
|
+
input: { name: "Name 2" },
|
|
201
|
+
timestampUtcMs: String(Date.now() + 1000),
|
|
202
|
+
},
|
|
203
|
+
{
|
|
204
|
+
id: uuidv4(),
|
|
205
|
+
type: "SET_NAME",
|
|
206
|
+
scope: "global",
|
|
207
|
+
input: { name: "Name 3" },
|
|
208
|
+
timestampUtcMs: String(Date.now() + 2000),
|
|
209
|
+
},
|
|
210
|
+
];
|
|
211
|
+
// Track enqueued jobs
|
|
212
|
+
const enqueuedJobs = [];
|
|
213
|
+
vi.spyOn(queue, "enqueue").mockImplementation((job) => {
|
|
214
|
+
enqueuedJobs.push(job);
|
|
215
|
+
return Promise.resolve();
|
|
216
|
+
});
|
|
217
|
+
const result = await reactor.mutate(testDoc.header.id, actions);
|
|
218
|
+
expect(result).toBeDefined();
|
|
219
|
+
expect(result.id).toBeDefined();
|
|
220
|
+
expect(result.status).toBe(JobStatus.PENDING);
|
|
221
|
+
// Verify all jobs were enqueued in order
|
|
222
|
+
expect(enqueuedJobs).toHaveLength(3);
|
|
223
|
+
// Verify jobs maintain order
|
|
224
|
+
enqueuedJobs.forEach((job, index) => {
|
|
225
|
+
expect(job.operation.index).toBe(index);
|
|
226
|
+
const actionInput = job.operation.action.input;
|
|
227
|
+
expect(actionInput.name).toBe(`Name ${index + 1}`);
|
|
228
|
+
});
|
|
229
|
+
});
|
|
230
|
+
});
|
|
231
|
+
});
|
|
232
|
+
//# sourceMappingURL=reactor-write.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reactor-write.test.js","sourceRoot":"","sources":["../../test/reactor-write.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.test.d.ts","sourceRoot":"","sources":["../../test/utils.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import { createShutdownStatus, createMutableShutdownStatus, } from "../src/shared/factories.js";
|
|
3
|
+
describe("ShutdownStatus Factory Methods", () => {
|
|
4
|
+
describe("createShutdownStatus", () => {
|
|
5
|
+
it("should create an immutable shutdown status with true", () => {
|
|
6
|
+
const status = createShutdownStatus(true);
|
|
7
|
+
expect(status.isShutdown).toBe(true);
|
|
8
|
+
// Should remain true
|
|
9
|
+
expect(status.isShutdown).toBe(true);
|
|
10
|
+
});
|
|
11
|
+
it("should create an immutable shutdown status with false", () => {
|
|
12
|
+
const status = createShutdownStatus(false);
|
|
13
|
+
expect(status.isShutdown).toBe(false);
|
|
14
|
+
// Should remain false
|
|
15
|
+
expect(status.isShutdown).toBe(false);
|
|
16
|
+
});
|
|
17
|
+
});
|
|
18
|
+
describe("createMutableShutdownStatus", () => {
|
|
19
|
+
it("should create a mutable shutdown status with default false", () => {
|
|
20
|
+
const [status, setShutdown] = createMutableShutdownStatus();
|
|
21
|
+
expect(status.isShutdown).toBe(false);
|
|
22
|
+
// Update to true
|
|
23
|
+
setShutdown(true);
|
|
24
|
+
expect(status.isShutdown).toBe(true);
|
|
25
|
+
// Update back to false
|
|
26
|
+
setShutdown(false);
|
|
27
|
+
expect(status.isShutdown).toBe(false);
|
|
28
|
+
});
|
|
29
|
+
it("should create a mutable shutdown status with initial true", () => {
|
|
30
|
+
const [status, setShutdown] = createMutableShutdownStatus(true);
|
|
31
|
+
expect(status.isShutdown).toBe(true);
|
|
32
|
+
// Update to false
|
|
33
|
+
setShutdown(false);
|
|
34
|
+
expect(status.isShutdown).toBe(false);
|
|
35
|
+
});
|
|
36
|
+
it("should allow multiple reads of the same state", () => {
|
|
37
|
+
const [status, setShutdown] = createMutableShutdownStatus(false);
|
|
38
|
+
// Multiple reads should return the same value
|
|
39
|
+
expect(status.isShutdown).toBe(false);
|
|
40
|
+
expect(status.isShutdown).toBe(false);
|
|
41
|
+
expect(status.isShutdown).toBe(false);
|
|
42
|
+
setShutdown(true);
|
|
43
|
+
// Multiple reads after update should return the new value
|
|
44
|
+
expect(status.isShutdown).toBe(true);
|
|
45
|
+
expect(status.isShutdown).toBe(true);
|
|
46
|
+
expect(status.isShutdown).toBe(true);
|
|
47
|
+
});
|
|
48
|
+
});
|
|
49
|
+
describe("Reactor integration", () => {
|
|
50
|
+
it("should maintain shutdown state across multiple calls", () => {
|
|
51
|
+
const [status, setShutdown] = createMutableShutdownStatus();
|
|
52
|
+
// Initial state
|
|
53
|
+
expect(status.isShutdown).toBe(false);
|
|
54
|
+
// Simulate kill() being called
|
|
55
|
+
setShutdown(true);
|
|
56
|
+
// Status should be persisted
|
|
57
|
+
expect(status.isShutdown).toBe(true);
|
|
58
|
+
// Even if we get the status multiple times
|
|
59
|
+
const isShut1 = status.isShutdown;
|
|
60
|
+
const isShut2 = status.isShutdown;
|
|
61
|
+
expect(isShut1).toBe(true);
|
|
62
|
+
expect(isShut2).toBe(true);
|
|
63
|
+
});
|
|
64
|
+
});
|
|
65
|
+
});
|
|
66
|
+
//# sourceMappingURL=utils.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.test.js","sourceRoot":"","sources":["../../test/utils.test.ts"],"names":[],"mappings":"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"}
|