@powerhousedao/reactor 4.1.0-dev.58 → 4.1.0-dev.60

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 (136) hide show
  1. package/dist/src/client/reactor-client.d.ts +8 -47
  2. package/dist/src/client/reactor-client.d.ts.map +1 -1
  3. package/dist/src/client/reactor-client.js +3 -14
  4. package/dist/src/client/reactor-client.js.map +1 -1
  5. package/dist/src/client/types.d.ts +4 -4
  6. package/dist/src/client/types.d.ts.map +1 -1
  7. package/dist/src/client/types.js.map +1 -1
  8. package/dist/src/core/reactor.d.ts +2 -2
  9. package/dist/src/core/reactor.d.ts.map +1 -1
  10. package/dist/src/core/reactor.js +35 -36
  11. package/dist/src/core/reactor.js.map +1 -1
  12. package/dist/src/core/types.d.ts +4 -4
  13. package/dist/src/core/types.d.ts.map +1 -1
  14. package/dist/src/executor/simple-job-executor.d.ts +5 -0
  15. package/dist/src/executor/simple-job-executor.d.ts.map +1 -1
  16. package/dist/src/executor/simple-job-executor.js +45 -0
  17. package/dist/src/executor/simple-job-executor.js.map +1 -1
  18. package/dist/src/index.d.ts +3 -0
  19. package/dist/src/index.d.ts.map +1 -1
  20. package/dist/src/index.js +3 -0
  21. package/dist/src/index.js.map +1 -1
  22. package/dist/src/queue/queue.js +8 -8
  23. package/dist/src/queue/queue.js.map +1 -1
  24. package/dist/src/read-models/document-view.d.ts +21 -0
  25. package/dist/src/read-models/document-view.d.ts.map +1 -0
  26. package/dist/src/read-models/document-view.js +285 -0
  27. package/dist/src/read-models/document-view.js.map +1 -0
  28. package/dist/src/read-models/types.d.ts +46 -0
  29. package/dist/src/read-models/types.d.ts.map +1 -0
  30. package/dist/src/read-models/types.js +2 -0
  31. package/dist/src/read-models/types.js.map +1 -0
  32. package/dist/src/registry/implementation.d.ts.map +1 -1
  33. package/dist/src/registry/implementation.js +1 -2
  34. package/dist/src/registry/implementation.js.map +1 -1
  35. package/dist/src/shared/awaiter.d.ts +1 -1
  36. package/dist/src/shared/awaiter.d.ts.map +1 -1
  37. package/dist/src/shared/awaiter.js +3 -3
  38. package/dist/src/shared/awaiter.js.map +1 -1
  39. package/dist/src/shared/types.d.ts +5 -0
  40. package/dist/src/shared/types.d.ts.map +1 -1
  41. package/dist/src/shared/types.js +5 -0
  42. package/dist/src/shared/types.js.map +1 -1
  43. package/dist/src/storage/interfaces.d.ts +124 -0
  44. package/dist/src/storage/interfaces.d.ts.map +1 -0
  45. package/dist/src/storage/interfaces.js +19 -0
  46. package/dist/src/storage/interfaces.js.map +1 -0
  47. package/dist/src/storage/kysely/store.d.ts +15 -0
  48. package/dist/src/storage/kysely/store.d.ts.map +1 -0
  49. package/dist/src/storage/kysely/store.js +173 -0
  50. package/dist/src/storage/kysely/store.js.map +1 -0
  51. package/dist/src/storage/kysely/types.d.ts +26 -0
  52. package/dist/src/storage/kysely/types.d.ts.map +1 -0
  53. package/dist/src/storage/kysely/types.js +2 -0
  54. package/dist/src/storage/kysely/types.js.map +1 -0
  55. package/dist/src/storage/txn.d.ts +15 -0
  56. package/dist/src/storage/txn.d.ts.map +1 -0
  57. package/dist/src/storage/txn.js +42 -0
  58. package/dist/src/storage/txn.js.map +1 -0
  59. package/package.json +21 -8
  60. package/dist/bench/event-bus.bench.d.ts +0 -2
  61. package/dist/bench/event-bus.bench.d.ts.map +0 -1
  62. package/dist/bench/event-bus.bench.js +0 -228
  63. package/dist/bench/event-bus.bench.js.map +0 -1
  64. package/dist/bench/queue-only.bench.d.ts +0 -2
  65. package/dist/bench/queue-only.bench.d.ts.map +0 -1
  66. package/dist/bench/queue-only.bench.js +0 -47
  67. package/dist/bench/queue-only.bench.js.map +0 -1
  68. package/dist/bench/reactor-throughput.bench.d.ts +0 -2
  69. package/dist/bench/reactor-throughput.bench.d.ts.map +0 -1
  70. package/dist/bench/reactor-throughput.bench.js +0 -145
  71. package/dist/bench/reactor-throughput.bench.js.map +0 -1
  72. package/dist/test/client/client-passthrough.test.d.ts +0 -2
  73. package/dist/test/client/client-passthrough.test.d.ts.map +0 -1
  74. package/dist/test/client/client-passthrough.test.js +0 -199
  75. package/dist/test/client/client-passthrough.test.js.map +0 -1
  76. package/dist/test/event-bus.test.d.ts +0 -2
  77. package/dist/test/event-bus.test.d.ts.map +0 -1
  78. package/dist/test/event-bus.test.js +0 -541
  79. package/dist/test/event-bus.test.js.map +0 -1
  80. package/dist/test/executor/executor-integration.test.d.ts +0 -2
  81. package/dist/test/executor/executor-integration.test.d.ts.map +0 -1
  82. package/dist/test/executor/executor-integration.test.js +0 -287
  83. package/dist/test/executor/executor-integration.test.js.map +0 -1
  84. package/dist/test/executor/job-execution-handle.test.d.ts +0 -2
  85. package/dist/test/executor/job-execution-handle.test.d.ts.map +0 -1
  86. package/dist/test/executor/job-execution-handle.test.js +0 -272
  87. package/dist/test/executor/job-execution-handle.test.js.map +0 -1
  88. package/dist/test/executor/simple-job-executor-manager.test.d.ts +0 -2
  89. package/dist/test/executor/simple-job-executor-manager.test.d.ts.map +0 -1
  90. package/dist/test/executor/simple-job-executor-manager.test.js +0 -132
  91. package/dist/test/executor/simple-job-executor-manager.test.js.map +0 -1
  92. package/dist/test/executor/simple-job-executor.test.d.ts +0 -2
  93. package/dist/test/executor/simple-job-executor.test.d.ts.map +0 -1
  94. package/dist/test/executor/simple-job-executor.test.js +0 -139
  95. package/dist/test/executor/simple-job-executor.test.js.map +0 -1
  96. package/dist/test/factories.d.ts +0 -122
  97. package/dist/test/factories.d.ts.map +0 -1
  98. package/dist/test/factories.js +0 -319
  99. package/dist/test/factories.js.map +0 -1
  100. package/dist/test/integration/document-drive-integration.test.d.ts +0 -2
  101. package/dist/test/integration/document-drive-integration.test.d.ts.map +0 -1
  102. package/dist/test/integration/document-drive-integration.test.js +0 -1102
  103. package/dist/test/integration/document-drive-integration.test.js.map +0 -1
  104. package/dist/test/integration/reactor-read.test.d.ts +0 -2
  105. package/dist/test/integration/reactor-read.test.d.ts.map +0 -1
  106. package/dist/test/integration/reactor-read.test.js +0 -291
  107. package/dist/test/integration/reactor-read.test.js.map +0 -1
  108. package/dist/test/queue/queue-integration.test.d.ts +0 -2
  109. package/dist/test/queue/queue-integration.test.d.ts.map +0 -1
  110. package/dist/test/queue/queue-integration.test.js +0 -322
  111. package/dist/test/queue/queue-integration.test.js.map +0 -1
  112. package/dist/test/queue/queue.test.d.ts +0 -2
  113. package/dist/test/queue/queue.test.d.ts.map +0 -1
  114. package/dist/test/queue/queue.test.js +0 -770
  115. package/dist/test/queue/queue.test.js.map +0 -1
  116. package/dist/test/registry/registry.test.d.ts +0 -2
  117. package/dist/test/registry/registry.test.d.ts.map +0 -1
  118. package/dist/test/registry/registry.test.js +0 -182
  119. package/dist/test/registry/registry.test.js.map +0 -1
  120. package/dist/test/shared/awaiter.test.d.ts +0 -2
  121. package/dist/test/shared/awaiter.test.d.ts.map +0 -1
  122. package/dist/test/shared/awaiter.test.js +0 -330
  123. package/dist/test/shared/awaiter.test.js.map +0 -1
  124. package/dist/test/subs/react-subscription-manager.test.d.ts +0 -2
  125. package/dist/test/subs/react-subscription-manager.test.d.ts.map +0 -1
  126. package/dist/test/subs/react-subscription-manager.test.js +0 -693
  127. package/dist/test/subs/react-subscription-manager.test.js.map +0 -1
  128. package/dist/test/utils.test.d.ts +0 -2
  129. package/dist/test/utils.test.d.ts.map +0 -1
  130. package/dist/test/utils.test.js +0 -66
  131. package/dist/test/utils.test.js.map +0 -1
  132. package/dist/tsconfig.tsbuildinfo +0 -1
  133. package/dist/vitest.config.d.ts +0 -3
  134. package/dist/vitest.config.d.ts.map +0 -1
  135. package/dist/vitest.config.js +0 -11
  136. package/dist/vitest.config.js.map +0 -1
@@ -0,0 +1,124 @@
1
+ import type { Operation, PHDocumentHeader } from "document-model";
2
+ export type OperationContext = {
3
+ documentId: string;
4
+ documentType: string;
5
+ scope: string;
6
+ branch: string;
7
+ };
8
+ export type OperationWithContext = {
9
+ operation: Operation;
10
+ context: OperationContext;
11
+ };
12
+ export declare class DuplicateOperationError extends Error {
13
+ constructor(opId: string);
14
+ }
15
+ export declare class OptimisticLockError extends Error {
16
+ constructor(message: string);
17
+ }
18
+ export declare class RevisionMismatchError extends Error {
19
+ constructor(expected: number, actual: number);
20
+ }
21
+ export interface AtomicTxn {
22
+ addOperations(...operations: Operation[]): void;
23
+ }
24
+ export type DocumentRevisions = {
25
+ /** Map of scope to operation index for that scope */
26
+ revision: Record<string, number>;
27
+ /** Latest timestamp across revisions */
28
+ latestTimestamp: string;
29
+ };
30
+ export interface IOperationStore {
31
+ apply(documentId: string, documentType: string, scope: string, branch: string, revision: number, fn: (txn: AtomicTxn) => void | Promise<void>, signal?: AbortSignal): Promise<void>;
32
+ get(documentId: string, scope: string, branch: string, revision: number, signal?: AbortSignal): Promise<OperationWithContext>;
33
+ getSince(documentId: string, scope: string, branch: string, revision: number, signal?: AbortSignal): Promise<OperationWithContext[]>;
34
+ getSinceTimestamp(documentId: string, scope: string, branch: string, timestampUtcMs: number, signal?: AbortSignal): Promise<OperationWithContext[]>;
35
+ getSinceId(id: number, signal?: AbortSignal): Promise<OperationWithContext[]>;
36
+ /**
37
+ * Gets the latest operation index for each scope of a document, along with
38
+ * the latest timestamp across all scopes. This is used to efficiently reconstruct
39
+ * the revision map and lastModified timestamp for document headers.
40
+ *
41
+ * @param documentId - The document id
42
+ * @param branch - The branch name
43
+ * @param signal - Optional abort signal to cancel the request
44
+ * @returns Object containing revision map and latest timestamp
45
+ */
46
+ getRevisions(documentId: string, branch: string, signal?: AbortSignal): Promise<DocumentRevisions>;
47
+ }
48
+ export interface ViewFilter {
49
+ branch?: string;
50
+ scopes?: string[];
51
+ }
52
+ export interface SearchFilter {
53
+ documentType?: string;
54
+ parentId?: string;
55
+ identifiers?: Record<string, any>;
56
+ }
57
+ export interface PagingOptions {
58
+ cursor?: string;
59
+ limit?: number;
60
+ }
61
+ export interface PagedResults<T> {
62
+ items: T[];
63
+ nextCursor?: string;
64
+ hasMore: boolean;
65
+ }
66
+ export interface DocumentSnapshot {
67
+ id: string;
68
+ documentId: string;
69
+ slug: string | null;
70
+ name: string | null;
71
+ scope: string;
72
+ branch: string;
73
+ content: string;
74
+ documentType: string;
75
+ lastOperationIndex: number;
76
+ lastOperationHash: string;
77
+ lastUpdatedAt: Date;
78
+ snapshotVersion: number;
79
+ identifiers: string | null;
80
+ metadata: string | null;
81
+ isDeleted: boolean;
82
+ deletedAt: Date | null;
83
+ }
84
+ export interface IDocumentView {
85
+ /**
86
+ * Initializes the view.
87
+ */
88
+ init(): Promise<void>;
89
+ /**
90
+ * Indexes a list of operations.
91
+ */
92
+ indexOperations(items: OperationWithContext[]): Promise<void>;
93
+ /**
94
+ * Retrieves a document header by reconstructing it from operations across all scopes.
95
+ *
96
+ * Headers contain cross-scope metadata (revision tracking, lastModified timestamps)
97
+ * that require aggregating information from multiple scopes, making this a
98
+ * view-layer concern rather than an operation store concern.
99
+ *
100
+ * @param documentId - The document id
101
+ * @param branch - The branch name
102
+ * @param signal - Optional abort signal to cancel the request
103
+ * @returns The reconstructed document header
104
+ */
105
+ getHeader(documentId: string, branch: string, signal?: AbortSignal): Promise<PHDocumentHeader>;
106
+ /**
107
+ * Returns true if and only if the documents exist.
108
+ *
109
+ * @param documentIds - The list of document ids to check.
110
+ * @param signal - Optional abort signal to cancel the request
111
+ */
112
+ exists(documentIds: string[], signal?: AbortSignal): Promise<boolean[]>;
113
+ /**
114
+ * Retrieves multiple document snapshots by their IDs.
115
+ *
116
+ * @param documentIds - The list of document ids to retrieve.
117
+ * @param scope - The scope to filter by (default: "global")
118
+ * @param branch - The branch to filter by (default: "main")
119
+ * @param signal - Optional abort signal to cancel the request
120
+ * @returns Array of document snapshots in the same order as input IDs (null for non-existent docs)
121
+ */
122
+ getMany(documentIds: string[], scope?: string, branch?: string, signal?: AbortSignal): Promise<(DocumentSnapshot | null)[]>;
123
+ }
124
+ //# sourceMappingURL=interfaces.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../../../src/storage/interfaces.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ export class DuplicateOperationError extends Error {
2
+ constructor(opId) {
3
+ super(`Operation with opId ${opId} already exists`);
4
+ this.name = "DuplicateOperationError";
5
+ }
6
+ }
7
+ export class OptimisticLockError extends Error {
8
+ constructor(message) {
9
+ super(message);
10
+ this.name = "OptimisticLockError";
11
+ }
12
+ }
13
+ export class RevisionMismatchError extends Error {
14
+ constructor(expected, actual) {
15
+ super(`Revision mismatch: expected ${expected}, got ${actual}`);
16
+ this.name = "RevisionMismatchError";
17
+ }
18
+ }
19
+ //# sourceMappingURL=interfaces.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interfaces.js","sourceRoot":"","sources":["../../../src/storage/interfaces.ts"],"names":[],"mappings":"AAcA,MAAM,OAAO,uBAAwB,SAAQ,KAAK;IAChD,YAAY,IAAY;QACtB,KAAK,CAAC,uBAAuB,IAAI,iBAAiB,CAAC,CAAC;QACpD,IAAI,CAAC,IAAI,GAAG,yBAAyB,CAAC;IACxC,CAAC;CACF;AAED,MAAM,OAAO,mBAAoB,SAAQ,KAAK;IAC5C,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAC;IACpC,CAAC;CACF;AAED,MAAM,OAAO,qBAAsB,SAAQ,KAAK;IAC9C,YAAY,QAAgB,EAAE,MAAc;QAC1C,KAAK,CAAC,+BAA+B,QAAQ,SAAS,MAAM,EAAE,CAAC,CAAC;QAChE,IAAI,CAAC,IAAI,GAAG,uBAAuB,CAAC;IACtC,CAAC;CACF"}
@@ -0,0 +1,15 @@
1
+ import type { Kysely } from "kysely";
2
+ import { type AtomicTxn, type DocumentRevisions, type IOperationStore, type OperationWithContext } from "../interfaces.js";
3
+ import type { Database } from "./types.js";
4
+ export declare class KyselyOperationStore implements IOperationStore {
5
+ private db;
6
+ constructor(db: Kysely<Database>);
7
+ apply(documentId: string, documentType: string, scope: string, branch: string, revision: number, fn: (txn: AtomicTxn) => void | Promise<void>, signal?: AbortSignal): Promise<void>;
8
+ get(documentId: string, scope: string, branch: string, index: number, signal?: AbortSignal): Promise<OperationWithContext>;
9
+ getSince(documentId: string, scope: string, branch: string, index: number, signal?: AbortSignal): Promise<OperationWithContext[]>;
10
+ getSinceTimestamp(documentId: string, scope: string, branch: string, timestampUtcMs: number, signal?: AbortSignal): Promise<OperationWithContext[]>;
11
+ getSinceId(id: number, signal?: AbortSignal): Promise<OperationWithContext[]>;
12
+ getRevisions(documentId: string, branch: string, signal?: AbortSignal): Promise<DocumentRevisions>;
13
+ private rowToOperationWithContext;
14
+ }
15
+ //# sourceMappingURL=store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../../../src/storage/kysely/store.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AACrC,OAAO,EAGL,KAAK,SAAS,EACd,KAAK,iBAAiB,EACtB,KAAK,eAAe,EACpB,KAAK,oBAAoB,EAC1B,MAAM,kBAAkB,CAAC;AAE1B,OAAO,KAAK,EAAE,QAAQ,EAAgB,MAAM,YAAY,CAAC;AAEzD,qBAAa,oBAAqB,YAAW,eAAe;IAC9C,OAAO,CAAC,EAAE;gBAAF,EAAE,EAAE,MAAM,CAAC,QAAQ,CAAC;IAElC,KAAK,CACT,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,MAAM,EACpB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,EAAE,EAAE,CAAC,GAAG,EAAE,SAAS,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,EAC5C,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,IAAI,CAAC;IAiEV,GAAG,CACP,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,oBAAoB,CAAC;IAuB1B,QAAQ,CACZ,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,oBAAoB,EAAE,CAAC;IAkB5B,iBAAiB,CACrB,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,cAAc,EAAE,MAAM,EACtB,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,oBAAoB,EAAE,CAAC;IAkB5B,UAAU,CACd,EAAE,EAAE,MAAM,EACV,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,oBAAoB,EAAE,CAAC;IAe5B,YAAY,CAChB,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,EACd,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,iBAAiB,CAAC;IA4C7B,OAAO,CAAC,yBAAyB;CAoBlC"}
@@ -0,0 +1,173 @@
1
+ import {} from "document-model";
2
+ import { DuplicateOperationError, RevisionMismatchError, } from "../interfaces.js";
3
+ import { AtomicTransaction } from "../txn.js";
4
+ export class KyselyOperationStore {
5
+ db;
6
+ constructor(db) {
7
+ this.db = db;
8
+ }
9
+ async apply(documentId, documentType, scope, branch, revision, fn, signal) {
10
+ await this.db.transaction().execute(async (trx) => {
11
+ // Check for abort signal
12
+ if (signal?.aborted) {
13
+ throw new Error("Operation aborted");
14
+ }
15
+ // Get the latest operation for this stream to verify revision
16
+ const latestOp = await trx
17
+ .selectFrom("Operation")
18
+ .selectAll()
19
+ .where("documentId", "=", documentId)
20
+ .where("scope", "=", scope)
21
+ .where("branch", "=", branch)
22
+ .orderBy("index", "desc")
23
+ .limit(1)
24
+ .executeTakeFirst();
25
+ // Check revision matches
26
+ const currentRevision = latestOp ? latestOp.index : -1;
27
+ if (currentRevision !== revision - 1) {
28
+ throw new RevisionMismatchError(revision - 1, currentRevision);
29
+ }
30
+ // Create atomic transaction
31
+ const atomicTxn = new AtomicTransaction(documentId, documentType, scope, branch, revision);
32
+ await fn(atomicTxn);
33
+ // Get operations and header updates
34
+ const operations = atomicTxn.getOperations();
35
+ // Insert operations
36
+ if (operations.length > 0) {
37
+ // Set prevOpId for each operation
38
+ let prevOpId = latestOp?.opId || "";
39
+ for (const op of operations) {
40
+ op.prevOpId = prevOpId;
41
+ prevOpId = op.opId;
42
+ }
43
+ try {
44
+ await trx.insertInto("Operation").values(operations).execute();
45
+ }
46
+ catch (error) {
47
+ if (error instanceof Error) {
48
+ if (error.message.includes("unique constraint")) {
49
+ // Extract the opId from the error if possible
50
+ const opId = operations[0]?.opId || "unknown";
51
+ throw new DuplicateOperationError(opId);
52
+ }
53
+ throw error;
54
+ }
55
+ throw error;
56
+ }
57
+ }
58
+ });
59
+ }
60
+ async get(documentId, scope, branch, index, signal) {
61
+ if (signal?.aborted) {
62
+ throw new Error("Operation aborted");
63
+ }
64
+ const row = await this.db
65
+ .selectFrom("Operation")
66
+ .selectAll()
67
+ .where("documentId", "=", documentId)
68
+ .where("scope", "=", scope)
69
+ .where("branch", "=", branch)
70
+ .where("index", "=", index)
71
+ .executeTakeFirst();
72
+ if (!row) {
73
+ throw new Error(`Operation not found: ${documentId}/${scope}/${branch}/${index}`);
74
+ }
75
+ return this.rowToOperationWithContext(row);
76
+ }
77
+ async getSince(documentId, scope, branch, index, signal) {
78
+ if (signal?.aborted) {
79
+ throw new Error("Operation aborted");
80
+ }
81
+ const rows = await this.db
82
+ .selectFrom("Operation")
83
+ .selectAll()
84
+ .where("documentId", "=", documentId)
85
+ .where("scope", "=", scope)
86
+ .where("branch", "=", branch)
87
+ .where("index", ">", index)
88
+ .orderBy("index", "asc")
89
+ .execute();
90
+ return rows.map((row) => this.rowToOperationWithContext(row));
91
+ }
92
+ async getSinceTimestamp(documentId, scope, branch, timestampUtcMs, signal) {
93
+ if (signal?.aborted) {
94
+ throw new Error("Operation aborted");
95
+ }
96
+ const rows = await this.db
97
+ .selectFrom("Operation")
98
+ .selectAll()
99
+ .where("documentId", "=", documentId)
100
+ .where("scope", "=", scope)
101
+ .where("branch", "=", branch)
102
+ .where("writeTimestampUtcMs", ">", new Date(timestampUtcMs))
103
+ .orderBy("index", "asc")
104
+ .execute();
105
+ return rows.map((row) => this.rowToOperationWithContext(row));
106
+ }
107
+ async getSinceId(id, signal) {
108
+ if (signal?.aborted) {
109
+ throw new Error("Operation aborted");
110
+ }
111
+ const rows = await this.db
112
+ .selectFrom("Operation")
113
+ .selectAll()
114
+ .where("id", ">", id)
115
+ .orderBy("id", "asc")
116
+ .execute();
117
+ return rows.map((row) => this.rowToOperationWithContext(row));
118
+ }
119
+ async getRevisions(documentId, branch, signal) {
120
+ if (signal?.aborted) {
121
+ throw new Error("Operation aborted");
122
+ }
123
+ // Get the latest operation for each scope in a single query
124
+ // Uses a subquery to find operations where the index equals the max index for that scope
125
+ const scopeRevisions = await this.db
126
+ .selectFrom("Operation as o1")
127
+ .select(["o1.scope", "o1.index", "o1.timestampUtcMs"])
128
+ .where("o1.documentId", "=", documentId)
129
+ .where("o1.branch", "=", branch)
130
+ .where((eb) => eb("o1.index", "=", eb
131
+ .selectFrom("Operation as o2")
132
+ .select((eb2) => eb2.fn.max("o2.index").as("maxIndex"))
133
+ .where("o2.documentId", "=", eb.ref("o1.documentId"))
134
+ .where("o2.branch", "=", eb.ref("o1.branch"))
135
+ .where("o2.scope", "=", eb.ref("o1.scope"))))
136
+ .execute();
137
+ // Build the revision map and find the latest timestamp
138
+ const revision = {};
139
+ let latestTimestamp = new Date(0).toISOString(); // Start with epoch
140
+ for (const row of scopeRevisions) {
141
+ revision[row.scope] = row.index;
142
+ const timestamp = row.timestampUtcMs.toISOString();
143
+ if (timestamp > latestTimestamp) {
144
+ latestTimestamp = timestamp;
145
+ }
146
+ }
147
+ return {
148
+ revision,
149
+ latestTimestamp,
150
+ };
151
+ }
152
+ rowToOperationWithContext(row) {
153
+ return {
154
+ operation: {
155
+ index: row.index,
156
+ timestampUtcMs: row.timestampUtcMs.toISOString(),
157
+ hash: row.hash,
158
+ skip: row.skip,
159
+ error: row.error || undefined,
160
+ resultingState: row.resultingState || undefined,
161
+ id: row.opId,
162
+ action: JSON.parse(row.action),
163
+ },
164
+ context: {
165
+ documentId: row.documentId,
166
+ documentType: row.documentType,
167
+ scope: row.scope,
168
+ branch: row.branch,
169
+ },
170
+ };
171
+ }
172
+ }
173
+ //# sourceMappingURL=store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../../../../src/storage/kysely/store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import type { Generated, Insertable, Selectable, Updateable } from "kysely";
2
+ export interface OperationTable {
3
+ id: Generated<number>;
4
+ jobId: string;
5
+ opId: string;
6
+ prevOpId: string;
7
+ writeTimestampUtcMs: Generated<Date>;
8
+ documentId: string;
9
+ documentType: string;
10
+ scope: string;
11
+ branch: string;
12
+ timestampUtcMs: Date;
13
+ index: number;
14
+ action: string;
15
+ skip: number;
16
+ resultingState?: string | null;
17
+ error?: string | null;
18
+ hash: string;
19
+ }
20
+ export interface Database {
21
+ Operation: OperationTable;
22
+ }
23
+ export type OperationRow = Selectable<OperationTable>;
24
+ export type InsertableOperation = Insertable<OperationTable>;
25
+ export type UpdateableOperation = Updateable<OperationTable>;
26
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/storage/kysely/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAE5E,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,mBAAmB,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;IACrC,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,IAAI,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,QAAQ;IACvB,SAAS,EAAE,cAAc,CAAC;CAC3B;AAED,MAAM,MAAM,YAAY,GAAG,UAAU,CAAC,cAAc,CAAC,CAAC;AACtD,MAAM,MAAM,mBAAmB,GAAG,UAAU,CAAC,cAAc,CAAC,CAAC;AAC7D,MAAM,MAAM,mBAAmB,GAAG,UAAU,CAAC,cAAc,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/storage/kysely/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,15 @@
1
+ import type { Operation } from "document-model";
2
+ import { type AtomicTxn as IAtomicTxn } from "./interfaces.js";
3
+ import type { InsertableOperation } from "./kysely/types.js";
4
+ export declare class AtomicTransaction implements IAtomicTxn {
5
+ private documentId;
6
+ private documentType;
7
+ private scope;
8
+ private branch;
9
+ private baseRevision;
10
+ private operations;
11
+ constructor(documentId: string, documentType: string, scope: string, branch: string, baseRevision: number);
12
+ addOperations(...operations: Operation[]): void;
13
+ getOperations(): InsertableOperation[];
14
+ }
15
+ //# sourceMappingURL=txn.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"txn.d.ts","sourceRoot":"","sources":["../../../src/storage/txn.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEhD,OAAO,EAAE,KAAK,SAAS,IAAI,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC/D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAE7D,qBAAa,iBAAkB,YAAW,UAAU;IAIhD,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,YAAY;IACpB,OAAO,CAAC,KAAK;IACb,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,YAAY;IAPtB,OAAO,CAAC,UAAU,CAA6B;gBAGrC,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,MAAM,EACpB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,MAAM;IAK9B,aAAa,CAAC,GAAG,UAAU,EAAE,SAAS,EAAE,GAAG,IAAI;IAqB/C,aAAa,IAAI,mBAAmB,EAAE;CAGvC"}
@@ -0,0 +1,42 @@
1
+ import { v4 as uuidv4 } from "uuid";
2
+ import {} from "./interfaces.js";
3
+ export class AtomicTransaction {
4
+ documentId;
5
+ documentType;
6
+ scope;
7
+ branch;
8
+ baseRevision;
9
+ operations = [];
10
+ constructor(documentId, documentType, scope, branch, baseRevision) {
11
+ this.documentId = documentId;
12
+ this.documentType = documentType;
13
+ this.scope = scope;
14
+ this.branch = branch;
15
+ this.baseRevision = baseRevision;
16
+ //
17
+ }
18
+ addOperations(...operations) {
19
+ for (const op of operations) {
20
+ this.operations.push({
21
+ jobId: uuidv4(),
22
+ opId: op.id || uuidv4(),
23
+ prevOpId: "", // Will be set during apply
24
+ documentId: this.documentId,
25
+ documentType: this.documentType,
26
+ scope: this.scope,
27
+ branch: this.branch,
28
+ timestampUtcMs: new Date(op.timestampUtcMs),
29
+ index: op.index,
30
+ action: JSON.stringify(op.action),
31
+ skip: op.skip,
32
+ resultingState: op.resultingState || null,
33
+ error: op.error || null,
34
+ hash: op.hash,
35
+ });
36
+ }
37
+ }
38
+ getOperations() {
39
+ return this.operations;
40
+ }
41
+ }
42
+ //# sourceMappingURL=txn.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"txn.js","sourceRoot":"","sources":["../../../src/storage/txn.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,EAAE,IAAI,MAAM,EAAE,MAAM,MAAM,CAAC;AACpC,OAAO,EAAgC,MAAM,iBAAiB,CAAC;AAG/D,MAAM,OAAO,iBAAiB;IAIlB;IACA;IACA;IACA;IACA;IAPF,UAAU,GAA0B,EAAE,CAAC;IAE/C,YACU,UAAkB,EAClB,YAAoB,EACpB,KAAa,EACb,MAAc,EACd,YAAoB;QAJpB,eAAU,GAAV,UAAU,CAAQ;QAClB,iBAAY,GAAZ,YAAY,CAAQ;QACpB,UAAK,GAAL,KAAK,CAAQ;QACb,WAAM,GAAN,MAAM,CAAQ;QACd,iBAAY,GAAZ,YAAY,CAAQ;QAE5B,EAAE;IACJ,CAAC;IAED,aAAa,CAAC,GAAG,UAAuB;QACtC,KAAK,MAAM,EAAE,IAAI,UAAU,EAAE,CAAC;YAC5B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;gBACnB,KAAK,EAAE,MAAM,EAAE;gBACf,IAAI,EAAE,EAAE,CAAC,EAAE,IAAI,MAAM,EAAE;gBACvB,QAAQ,EAAE,EAAE,EAAE,2BAA2B;gBACzC,UAAU,EAAE,IAAI,CAAC,UAAU;gBAC3B,YAAY,EAAE,IAAI,CAAC,YAAY;gBAC/B,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,cAAc,EAAE,IAAI,IAAI,CAAC,EAAE,CAAC,cAAc,CAAC;gBAC3C,KAAK,EAAE,EAAE,CAAC,KAAK;gBACf,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,MAAM,CAAC;gBACjC,IAAI,EAAE,EAAE,CAAC,IAAI;gBACb,cAAc,EAAE,EAAE,CAAC,cAAc,IAAI,IAAI;gBACzC,KAAK,EAAE,EAAE,CAAC,KAAK,IAAI,IAAI;gBACvB,IAAI,EAAE,EAAE,CAAC,IAAI;aACd,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,aAAa;QACX,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;CACF"}
package/package.json CHANGED
@@ -1,16 +1,21 @@
1
1
  {
2
2
  "name": "@powerhousedao/reactor",
3
- "version": "4.1.0-dev.58",
3
+ "version": "4.1.0-dev.60",
4
4
  "description": "",
5
5
  "repository": {
6
6
  "url": "https://github.com/powerhouse-inc/powerhouse",
7
7
  "directory": "packages/reactor"
8
8
  },
9
9
  "type": "module",
10
- "exports": "./dist/src/index.js",
11
10
  "types": "./dist/src/index.d.ts",
11
+ "exports": {
12
+ ".": "./dist/src/index.js"
13
+ },
14
+ "imports": {
15
+ "#*": "./dist/src/*"
16
+ },
12
17
  "files": [
13
- "dist"
18
+ "./dist/src"
14
19
  ],
15
20
  "publishConfig": {
16
21
  "access": "public"
@@ -19,17 +24,25 @@
19
24
  "author": "",
20
25
  "license": "AGPL-3.0-only",
21
26
  "dependencies": {
27
+ "@electric-sql/pglite": "^0.3.10",
28
+ "kysely": "^0.28.2",
29
+ "kysely-pglite": "^0.6.1",
22
30
  "uuid": "^11.0.5",
23
- "document-drive": "4.1.0-dev.58",
24
- "document-model": "4.1.0-dev.58"
31
+ "document-drive": "4.1.0-dev.60",
32
+ "document-model": "4.1.0-dev.60"
25
33
  },
26
34
  "devDependencies": {
35
+ "typescript": "^5.7.3",
27
36
  "vitest": "^3.2.4"
28
37
  },
29
38
  "scripts": {
30
- "tsc": "tsc",
31
- "lint": "eslint",
39
+ "build": "pnpm run build:tsc",
40
+ "build:tsc": "tsc --build",
41
+ "prebuild": "pnpm run clean",
32
42
  "test": "vitest run",
33
- "bench": "vitest bench --run"
43
+ "lint": "eslint",
44
+ "bench": "vitest bench --run",
45
+ "clean": "rimraf dist",
46
+ "clean:node_modules": "rimraf node_modules"
34
47
  }
35
48
  }
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=event-bus.bench.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"event-bus.bench.d.ts","sourceRoot":"","sources":["../../bench/event-bus.bench.ts"],"names":[],"mappings":""}