@sunfall/arc-db 0.1.0-alpha.0

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 (150) hide show
  1. package/LICENSE +21 -0
  2. package/dist/change-feed-dispatcher.d.ts +21 -0
  3. package/dist/change-feed-dispatcher.d.ts.map +1 -0
  4. package/dist/change-feed-dispatcher.js +53 -0
  5. package/dist/change-feed-dispatcher.js.map +1 -0
  6. package/dist/collection-change-feed-runtime.d.ts +32 -0
  7. package/dist/collection-change-feed-runtime.d.ts.map +1 -0
  8. package/dist/collection-change-feed-runtime.js +50 -0
  9. package/dist/collection-change-feed-runtime.js.map +1 -0
  10. package/dist/collection-contract.d.ts +525 -0
  11. package/dist/collection-contract.d.ts.map +1 -0
  12. package/dist/collection-contract.js +4 -0
  13. package/dist/collection-contract.js.map +1 -0
  14. package/dist/collection-definition-snapshot.d.ts +64 -0
  15. package/dist/collection-definition-snapshot.d.ts.map +1 -0
  16. package/dist/collection-definition-snapshot.js +122 -0
  17. package/dist/collection-definition-snapshot.js.map +1 -0
  18. package/dist/collection-errors.d.ts +38 -0
  19. package/dist/collection-errors.d.ts.map +1 -0
  20. package/dist/collection-errors.js +17 -0
  21. package/dist/collection-errors.js.map +1 -0
  22. package/dist/collection-ids.d.ts +6 -0
  23. package/dist/collection-ids.d.ts.map +1 -0
  24. package/dist/collection-ids.js +6 -0
  25. package/dist/collection-ids.js.map +1 -0
  26. package/dist/collection-index-materialization.d.ts +29 -0
  27. package/dist/collection-index-materialization.d.ts.map +1 -0
  28. package/dist/collection-index-materialization.js +118 -0
  29. package/dist/collection-index-materialization.js.map +1 -0
  30. package/dist/collection-mutation-queue.d.ts +10 -0
  31. package/dist/collection-mutation-queue.d.ts.map +1 -0
  32. package/dist/collection-mutation-queue.js +46 -0
  33. package/dist/collection-mutation-queue.js.map +1 -0
  34. package/dist/collection-mutation-workflow.d.ts +18 -0
  35. package/dist/collection-mutation-workflow.d.ts.map +1 -0
  36. package/dist/collection-mutation-workflow.js +252 -0
  37. package/dist/collection-mutation-workflow.js.map +1 -0
  38. package/dist/collection-persistence.d.ts +48 -0
  39. package/dist/collection-persistence.d.ts.map +1 -0
  40. package/dist/collection-persistence.js +323 -0
  41. package/dist/collection-persistence.js.map +1 -0
  42. package/dist/collection-policy.d.ts +5 -0
  43. package/dist/collection-policy.d.ts.map +1 -0
  44. package/dist/collection-policy.js +7 -0
  45. package/dist/collection-policy.js.map +1 -0
  46. package/dist/collection-preload.d.ts +21 -0
  47. package/dist/collection-preload.d.ts.map +1 -0
  48. package/dist/collection-preload.js +4 -0
  49. package/dist/collection-preload.js.map +1 -0
  50. package/dist/collection-projection-callback-policy.d.ts +14 -0
  51. package/dist/collection-projection-callback-policy.d.ts.map +1 -0
  52. package/dist/collection-projection-callback-policy.js +25 -0
  53. package/dist/collection-projection-callback-policy.js.map +1 -0
  54. package/dist/collection-reactive-binding.d.ts +72 -0
  55. package/dist/collection-reactive-binding.d.ts.map +1 -0
  56. package/dist/collection-reactive-binding.js +95 -0
  57. package/dist/collection-reactive-binding.js.map +1 -0
  58. package/dist/collection-registry.d.ts +56 -0
  59. package/dist/collection-registry.d.ts.map +1 -0
  60. package/dist/collection-registry.js +123 -0
  61. package/dist/collection-registry.js.map +1 -0
  62. package/dist/collection-row-ingress.d.ts +16 -0
  63. package/dist/collection-row-ingress.d.ts.map +1 -0
  64. package/dist/collection-row-ingress.js +110 -0
  65. package/dist/collection-row-ingress.js.map +1 -0
  66. package/dist/collection-runtime.d.ts +20 -0
  67. package/dist/collection-runtime.d.ts.map +1 -0
  68. package/dist/collection-runtime.js +256 -0
  69. package/dist/collection-runtime.js.map +1 -0
  70. package/dist/collection-snapshot-codec.d.ts +62 -0
  71. package/dist/collection-snapshot-codec.d.ts.map +1 -0
  72. package/dist/collection-snapshot-codec.js +563 -0
  73. package/dist/collection-snapshot-codec.js.map +1 -0
  74. package/dist/collection-state.d.ts +72 -0
  75. package/dist/collection-state.d.ts.map +1 -0
  76. package/dist/collection-state.js +276 -0
  77. package/dist/collection-state.js.map +1 -0
  78. package/dist/collection-sync-load-policy.d.ts +17 -0
  79. package/dist/collection-sync-load-policy.d.ts.map +1 -0
  80. package/dist/collection-sync-load-policy.js +245 -0
  81. package/dist/collection-sync-load-policy.js.map +1 -0
  82. package/dist/collection-value-detachment.d.ts +34 -0
  83. package/dist/collection-value-detachment.d.ts.map +1 -0
  84. package/dist/collection-value-detachment.js +248 -0
  85. package/dist/collection-value-detachment.js.map +1 -0
  86. package/dist/collection-write-commit.d.ts +32 -0
  87. package/dist/collection-write-commit.d.ts.map +1 -0
  88. package/dist/collection-write-commit.js +51 -0
  89. package/dist/collection-write-commit.js.map +1 -0
  90. package/dist/flush-policy.d.ts +130 -0
  91. package/dist/flush-policy.d.ts.map +1 -0
  92. package/dist/flush-policy.js +96 -0
  93. package/dist/flush-policy.js.map +1 -0
  94. package/dist/index.d.ts +481 -0
  95. package/dist/index.d.ts.map +1 -0
  96. package/dist/index.js +251 -0
  97. package/dist/index.js.map +1 -0
  98. package/dist/live-query-collection-materialization.d.ts +47 -0
  99. package/dist/live-query-collection-materialization.d.ts.map +1 -0
  100. package/dist/live-query-collection-materialization.js +231 -0
  101. package/dist/live-query-collection-materialization.js.map +1 -0
  102. package/dist/live-query-collection.d.ts +23 -0
  103. package/dist/live-query-collection.d.ts.map +1 -0
  104. package/dist/live-query-collection.js +94 -0
  105. package/dist/live-query-collection.js.map +1 -0
  106. package/dist/live-query-runtime.d.ts +8 -0
  107. package/dist/live-query-runtime.d.ts.map +1 -0
  108. package/dist/live-query-runtime.js +228 -0
  109. package/dist/live-query-runtime.js.map +1 -0
  110. package/dist/live-query-state.d.ts +11 -0
  111. package/dist/live-query-state.d.ts.map +1 -0
  112. package/dist/live-query-state.js +130 -0
  113. package/dist/live-query-state.js.map +1 -0
  114. package/dist/query-builder.d.ts +294 -0
  115. package/dist/query-builder.d.ts.map +1 -0
  116. package/dist/query-builder.js +373 -0
  117. package/dist/query-builder.js.map +1 -0
  118. package/dist/query-context-identity.d.ts +19 -0
  119. package/dist/query-context-identity.d.ts.map +1 -0
  120. package/dist/query-context-identity.js +41 -0
  121. package/dist/query-context-identity.js.map +1 -0
  122. package/dist/query-execution-plan.d.ts +27 -0
  123. package/dist/query-execution-plan.d.ts.map +1 -0
  124. package/dist/query-execution-plan.js +69 -0
  125. package/dist/query-execution-plan.js.map +1 -0
  126. package/dist/query-plan.d.ts +200 -0
  127. package/dist/query-plan.d.ts.map +1 -0
  128. package/dist/query-plan.js +524 -0
  129. package/dist/query-plan.js.map +1 -0
  130. package/dist/query-source-adapter.d.ts +25 -0
  131. package/dist/query-source-adapter.d.ts.map +1 -0
  132. package/dist/query-source-adapter.js +14 -0
  133. package/dist/query-source-adapter.js.map +1 -0
  134. package/dist/runtime-collection-store.d.ts +38 -0
  135. package/dist/runtime-collection-store.d.ts.map +1 -0
  136. package/dist/runtime-collection-store.js +149 -0
  137. package/dist/runtime-collection-store.js.map +1 -0
  138. package/dist/server-collection.d.ts +84 -0
  139. package/dist/server-collection.d.ts.map +1 -0
  140. package/dist/server-collection.js +84 -0
  141. package/dist/server-collection.js.map +1 -0
  142. package/dist/sqlite-persistence.d.ts +239 -0
  143. package/dist/sqlite-persistence.d.ts.map +1 -0
  144. package/dist/sqlite-persistence.js +345 -0
  145. package/dist/sqlite-persistence.js.map +1 -0
  146. package/dist/sync-adapter.d.ts +233 -0
  147. package/dist/sync-adapter.d.ts.map +1 -0
  148. package/dist/sync-adapter.js +226 -0
  149. package/dist/sync-adapter.js.map +1 -0
  150. package/package.json +48 -0
@@ -0,0 +1,72 @@
1
+ import { type WritableSignal } from "@sunfall/arc-core";
2
+ import type { Deferred } from "effect";
3
+ import type { CollectionDefinition, CollectionKey, CollectionLoadState, CollectionMutation, CollectionRuntimeError, CollectionOrigin, CollectionRow, CollectionTransaction } from "./collection-contract.js";
4
+ import type { CollectionIndexCacheEntry } from "./collection-index-materialization.js";
5
+ export interface StoredRow<A extends object, K extends CollectionKey> {
6
+ readonly key: K;
7
+ value: A;
8
+ synced: boolean;
9
+ origin: CollectionOrigin;
10
+ }
11
+ export interface PendingMutationEntry<A extends object, K extends CollectionKey> {
12
+ readonly transaction: CollectionTransaction<A, K>;
13
+ readonly rollbackRows: Map<K, StoredRow<A, K> | undefined>;
14
+ readonly createdAt: number;
15
+ attempts: number;
16
+ activeAttempt: PendingMutationAttempt<A, K> | undefined;
17
+ }
18
+ export interface PendingMutationAttempt<A extends object, K extends CollectionKey> {
19
+ readonly id: number;
20
+ readonly deferred: Deferred.Deferred<CollectionTransaction<A, K>, any>;
21
+ }
22
+ export interface CollectionLoadAttempt {
23
+ readonly generation: number;
24
+ readonly force: boolean;
25
+ readonly deferred: Deferred.Deferred<void, any>;
26
+ }
27
+ export interface OptimisticRowPatch<A extends object, K extends CollectionKey> {
28
+ readonly transactionId: string;
29
+ readonly mutation: CollectionMutation<A, K>;
30
+ committed: boolean;
31
+ }
32
+ export interface OptimisticRowStack<A extends object, K extends CollectionKey> {
33
+ base: StoredRow<A, K> | undefined;
34
+ readonly patches: Array<OptimisticRowPatch<A, K>>;
35
+ }
36
+ export interface CollectionState<A extends object, K extends CollectionKey, E> {
37
+ readonly rows: Map<K, StoredRow<A, K>>;
38
+ readonly pendingMutations: Map<string, PendingMutationEntry<A, K>>;
39
+ readonly optimisticRows: Map<K, OptimisticRowStack<A, K>>;
40
+ readonly indexCache: Map<string, CollectionIndexCacheEntry<A, K>>;
41
+ readonly version: WritableSignal<number>;
42
+ readonly loadState: WritableSignal<CollectionLoadState<CollectionRuntimeError<E>>>;
43
+ nextTransactionId: number;
44
+ nextMutationAttemptId: number;
45
+ loadGeneration: number;
46
+ activeLoad: CollectionLoadAttempt | undefined;
47
+ initialized: boolean;
48
+ initialDataError: CollectionRuntimeError<E> | undefined;
49
+ persistenceRestored: boolean;
50
+ }
51
+ export declare const makeCollectionState: <A extends object, K extends CollectionKey, E>() => CollectionState<A, K, E>;
52
+ export declare const bumpCollectionState: (state: CollectionState<any, any, any>) => void;
53
+ export declare const augmentCollectionRow: <A extends object, K extends CollectionKey>(definition: CollectionDefinition<A, K, any, any>, row: StoredRow<A, K>) => CollectionRow<A, K>;
54
+ export declare const markStoredRowsSynced: <A extends object, K extends CollectionKey>(state: CollectionState<A, K, any>, keys: ReadonlyArray<K>) => void;
55
+ export declare const cloneStoredRow: <A extends object, K extends CollectionKey>(row: StoredRow<A, K>) => StoredRow<A, K>;
56
+ export declare const cloneRollbackRow: <A extends object, K extends CollectionKey>(row: StoredRow<A, K> | undefined) => StoredRow<A, K> | undefined;
57
+ export declare const cloneOptimisticRowStack: <A extends object, K extends CollectionKey>(stack: OptimisticRowStack<A, K>) => OptimisticRowStack<A, K>;
58
+ export declare const clonePendingMutationEntry: <A extends object, K extends CollectionKey>(entry: PendingMutationEntry<A, K>, options?: {
59
+ readonly preserveActiveAttempt?: boolean;
60
+ }) => PendingMutationEntry<A, K>;
61
+ export declare const restoreStoredRows: <A extends object, K extends CollectionKey>(state: CollectionState<A, K, any>, snapshots: ReadonlyMap<K, StoredRow<A, K> | undefined>) => void;
62
+ export declare const restoreOptimisticState: <A extends object, K extends CollectionKey>(state: CollectionState<A, K, any>, rows: ReadonlyMap<K, StoredRow<A, K>>, pendingMutations: ReadonlyMap<string, PendingMutationEntry<A, K>>, optimisticRows: ReadonlyMap<K, OptimisticRowStack<A, K>>) => void;
63
+ export declare const optimisticMutationKeys: <A extends object, K extends CollectionKey>(transaction: CollectionTransaction<A, K>) => ReadonlyArray<K>;
64
+ export declare const rebaseOptimisticRows: <A extends object, K extends CollectionKey>(state: CollectionState<A, K, any>, keys: ReadonlyArray<K>) => void;
65
+ export declare const applyOptimisticTransaction: <A extends object, K extends CollectionKey>(state: CollectionState<A, K, any>, transaction: CollectionTransaction<A, K>, snapshots: ReadonlyMap<K, StoredRow<A, K> | undefined>) => void;
66
+ export declare const applyCollectionBaseRow: <A extends object, K extends CollectionKey>(state: CollectionState<A, K, any>, row: StoredRow<A, K>, rebaseKeys: Set<K>) => void;
67
+ export declare const deleteCollectionBaseRow: <A extends object, K extends CollectionKey>(state: CollectionState<A, K, any>, key: K, rebaseKeys: Set<K>) => void;
68
+ export declare const rebaseCollectionBaseRows: <A extends object, K extends CollectionKey>(state: CollectionState<A, K, any>, rebaseKeys: Set<K>) => void;
69
+ export declare const commitOptimisticTransaction: <A extends object, K extends CollectionKey>(state: CollectionState<A, K, any>, transaction: CollectionTransaction<A, K>) => boolean;
70
+ export declare const rollbackOptimisticTransaction: <A extends object, K extends CollectionKey>(state: CollectionState<A, K, any>, transaction: CollectionTransaction<A, K>) => boolean;
71
+ export declare const syncOptimisticRowsFromPendingMutations: <A extends object, K extends CollectionKey>(state: CollectionState<A, K, any>) => void;
72
+ //# sourceMappingURL=collection-state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collection-state.d.ts","sourceRoot":"","sources":["../src/collection-state.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,276 @@
1
+ import { Signal } from "@sunfall/arc-core";
2
+ import { cloneCollectionMutation, cloneCollectionTransaction, cloneCollectionValue, detachCollectionRow, } from "./collection-value-detachment.js";
3
+ export const makeCollectionState = () => ({
4
+ rows: new Map(),
5
+ pendingMutations: new Map(),
6
+ optimisticRows: new Map(),
7
+ indexCache: new Map(),
8
+ version: Signal.make(0),
9
+ loadState: Signal.make({
10
+ _tag: "Initial",
11
+ waiting: false,
12
+ }),
13
+ nextTransactionId: 0,
14
+ nextMutationAttemptId: 0,
15
+ loadGeneration: 0,
16
+ activeLoad: undefined,
17
+ initialized: false,
18
+ initialDataError: undefined,
19
+ persistenceRestored: false,
20
+ });
21
+ export const bumpCollectionState = (state) => {
22
+ state.indexCache.clear();
23
+ state.version.update((value) => value + 1);
24
+ };
25
+ export const augmentCollectionRow = (definition, row) => detachCollectionRow({
26
+ collection: definition.name,
27
+ key: row.key,
28
+ value: row.value,
29
+ synced: row.synced,
30
+ origin: row.origin,
31
+ });
32
+ export const markStoredRowsSynced = (state, keys) => {
33
+ for (const key of keys) {
34
+ const row = state.rows.get(key);
35
+ if (row) {
36
+ row.synced = true;
37
+ }
38
+ }
39
+ bumpCollectionState(state);
40
+ };
41
+ export const cloneStoredRow = (row) => ({
42
+ key: row.key,
43
+ value: cloneCollectionValue(row.value),
44
+ synced: row.synced,
45
+ origin: row.origin,
46
+ });
47
+ export const cloneRollbackRow = (row) => (row ? cloneStoredRow(row) : undefined);
48
+ export const cloneOptimisticRowStack = (stack) => ({
49
+ base: cloneRollbackRow(stack.base),
50
+ patches: stack.patches.map((patch) => ({
51
+ transactionId: patch.transactionId,
52
+ mutation: cloneCollectionMutation(patch.mutation),
53
+ committed: patch.committed,
54
+ })),
55
+ });
56
+ export const clonePendingMutationEntry = (entry, options = {}) => ({
57
+ transaction: cloneCollectionTransaction(entry.transaction),
58
+ rollbackRows: new Map(Array.from(entry.rollbackRows, ([key, row]) => [key, cloneRollbackRow(row)])),
59
+ createdAt: entry.createdAt,
60
+ attempts: entry.attempts,
61
+ activeAttempt: options.preserveActiveAttempt === true ? entry.activeAttempt : undefined,
62
+ });
63
+ export const restoreStoredRows = (state, snapshots) => {
64
+ for (const [key, row] of snapshots) {
65
+ if (row) {
66
+ state.rows.set(key, cloneStoredRow(row));
67
+ }
68
+ else {
69
+ state.rows.delete(key);
70
+ }
71
+ }
72
+ bumpCollectionState(state);
73
+ };
74
+ export const restoreOptimisticState = (state, rows, pendingMutations, optimisticRows) => {
75
+ state.rows.clear();
76
+ for (const [key, row] of rows) {
77
+ state.rows.set(key, cloneStoredRow(row));
78
+ }
79
+ state.pendingMutations.clear();
80
+ for (const [id, entry] of pendingMutations) {
81
+ state.pendingMutations.set(id, clonePendingMutationEntry(entry, { preserveActiveAttempt: true }));
82
+ }
83
+ state.optimisticRows.clear();
84
+ for (const [key, stack] of optimisticRows) {
85
+ state.optimisticRows.set(key, cloneOptimisticRowStack(stack));
86
+ }
87
+ };
88
+ export const optimisticMutationKeys = (transaction) => Array.from(new Set(transaction.mutations.map((mutation) => mutation.key)));
89
+ const applyOptimisticMutationToRow = (row, mutation) => {
90
+ switch (mutation._tag) {
91
+ case "Insert":
92
+ return {
93
+ key: mutation.key,
94
+ value: cloneCollectionValue(mutation.value),
95
+ synced: false,
96
+ origin: "local",
97
+ };
98
+ case "Update": {
99
+ const previous = row?.value ?? mutation.previous;
100
+ return {
101
+ key: mutation.key,
102
+ value: cloneCollectionValue({ ...previous, ...mutation.changes }),
103
+ synced: false,
104
+ origin: "local",
105
+ };
106
+ }
107
+ case "Delete":
108
+ return undefined;
109
+ }
110
+ };
111
+ const collapseCommittedOptimisticPatches = (stack) => {
112
+ while (stack.patches[0]?.committed) {
113
+ const [patch] = stack.patches.splice(0, 1);
114
+ if (!patch) {
115
+ return;
116
+ }
117
+ stack.base = applyOptimisticMutationToRow(stack.base, patch.mutation);
118
+ if (stack.base) {
119
+ stack.base.synced = true;
120
+ }
121
+ }
122
+ };
123
+ const rebaseOptimisticRow = (state, key) => {
124
+ const stack = state.optimisticRows.get(key);
125
+ if (!stack) {
126
+ return;
127
+ }
128
+ collapseCommittedOptimisticPatches(stack);
129
+ if (stack.patches.length === 0) {
130
+ state.optimisticRows.delete(key);
131
+ if (stack.base) {
132
+ state.rows.set(key, cloneStoredRow(stack.base));
133
+ }
134
+ else {
135
+ state.rows.delete(key);
136
+ }
137
+ return;
138
+ }
139
+ let row = cloneRollbackRow(stack.base);
140
+ let hasPendingPatch = false;
141
+ for (const patch of stack.patches) {
142
+ const pending = state.pendingMutations.get(patch.transactionId);
143
+ if (pending) {
144
+ pending.rollbackRows.set(key, cloneRollbackRow(row));
145
+ }
146
+ row = applyOptimisticMutationToRow(row, patch.mutation);
147
+ hasPendingPatch = hasPendingPatch || !patch.committed;
148
+ if (row) {
149
+ row.synced = !hasPendingPatch;
150
+ row.origin = "local";
151
+ }
152
+ }
153
+ if (row) {
154
+ state.rows.set(key, row);
155
+ }
156
+ else {
157
+ state.rows.delete(key);
158
+ }
159
+ };
160
+ export const rebaseOptimisticRows = (state, keys) => {
161
+ for (const key of keys) {
162
+ rebaseOptimisticRow(state, key);
163
+ }
164
+ bumpCollectionState(state);
165
+ };
166
+ export const applyOptimisticTransaction = (state, transaction, snapshots) => {
167
+ for (const mutation of transaction.mutations) {
168
+ let stack = state.optimisticRows.get(mutation.key);
169
+ if (!stack) {
170
+ stack = {
171
+ base: cloneRollbackRow(snapshots.get(mutation.key)),
172
+ patches: [],
173
+ };
174
+ state.optimisticRows.set(mutation.key, stack);
175
+ }
176
+ stack.patches.push({
177
+ transactionId: transaction.id,
178
+ mutation,
179
+ committed: false,
180
+ });
181
+ }
182
+ rebaseOptimisticRows(state, optimisticMutationKeys(transaction));
183
+ };
184
+ export const applyCollectionBaseRow = (state, row, rebaseKeys) => {
185
+ const stack = state.optimisticRows.get(row.key);
186
+ if (stack) {
187
+ stack.base = cloneStoredRow(row);
188
+ rebaseKeys.add(row.key);
189
+ return;
190
+ }
191
+ state.rows.set(row.key, cloneStoredRow(row));
192
+ };
193
+ export const deleteCollectionBaseRow = (state, key, rebaseKeys) => {
194
+ const stack = state.optimisticRows.get(key);
195
+ if (stack) {
196
+ stack.base = undefined;
197
+ rebaseKeys.add(key);
198
+ return;
199
+ }
200
+ state.rows.delete(key);
201
+ };
202
+ export const rebaseCollectionBaseRows = (state, rebaseKeys) => {
203
+ if (rebaseKeys.size > 0) {
204
+ rebaseOptimisticRows(state, Array.from(rebaseKeys));
205
+ return;
206
+ }
207
+ bumpCollectionState(state);
208
+ };
209
+ const hasOptimisticTransaction = (state, transaction) => optimisticMutationKeys(transaction).some((key) => state.optimisticRows.get(key)?.patches.some((patch) => patch.transactionId === transaction.id));
210
+ export const commitOptimisticTransaction = (state, transaction) => {
211
+ if (!hasOptimisticTransaction(state, transaction)) {
212
+ return false;
213
+ }
214
+ const keys = optimisticMutationKeys(transaction);
215
+ for (const key of keys) {
216
+ const stack = state.optimisticRows.get(key);
217
+ if (!stack) {
218
+ continue;
219
+ }
220
+ for (const patch of stack.patches) {
221
+ if (patch.transactionId === transaction.id) {
222
+ patch.committed = true;
223
+ }
224
+ }
225
+ }
226
+ rebaseOptimisticRows(state, keys);
227
+ return true;
228
+ };
229
+ export const rollbackOptimisticTransaction = (state, transaction) => {
230
+ if (!hasOptimisticTransaction(state, transaction)) {
231
+ return false;
232
+ }
233
+ const keys = optimisticMutationKeys(transaction);
234
+ for (const key of keys) {
235
+ const stack = state.optimisticRows.get(key);
236
+ if (!stack) {
237
+ continue;
238
+ }
239
+ const remaining = stack.patches.filter((patch) => patch.transactionId !== transaction.id);
240
+ stack.patches.splice(0, stack.patches.length, ...remaining);
241
+ }
242
+ rebaseOptimisticRows(state, keys);
243
+ return true;
244
+ };
245
+ export const syncOptimisticRowsFromPendingMutations = (state) => {
246
+ const desired = new Map();
247
+ const rebaseKeys = new Set(state.optimisticRows.keys());
248
+ for (const entry of state.pendingMutations.values()) {
249
+ for (const mutation of entry.transaction.mutations) {
250
+ let stack = desired.get(mutation.key);
251
+ if (!stack) {
252
+ const existing = state.optimisticRows.get(mutation.key);
253
+ const rollback = entry.rollbackRows.has(mutation.key)
254
+ ? entry.rollbackRows.get(mutation.key)
255
+ : state.rows.get(mutation.key);
256
+ stack = {
257
+ base: existing ? cloneRollbackRow(existing.base) : cloneRollbackRow(rollback),
258
+ patches: [],
259
+ };
260
+ desired.set(mutation.key, stack);
261
+ }
262
+ stack.patches.push({
263
+ transactionId: entry.transaction.id,
264
+ mutation,
265
+ committed: false,
266
+ });
267
+ rebaseKeys.add(mutation.key);
268
+ }
269
+ }
270
+ state.optimisticRows.clear();
271
+ for (const [key, stack] of desired) {
272
+ state.optimisticRows.set(key, stack);
273
+ }
274
+ rebaseOptimisticRows(state, Array.from(rebaseKeys));
275
+ };
276
+ //# sourceMappingURL=collection-state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collection-state.js","sourceRoot":"","sources":["../src/collection-state.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import { Effect } from "effect";
2
+ import type { CollectionDefinition, CollectionKey, CollectionRuntimeError } from "./collection-contract.js";
3
+ /** Options for one Collection Sync Load Policy invocation. */
4
+ export interface CollectionSyncLoadPolicyOptions {
5
+ /** Forces a fresh `refetch`/`load` attempt even when the collection is already ready. */
6
+ readonly force: boolean;
7
+ }
8
+ /**
9
+ * Runs the Collection Sync Load Policy for `preloadEffect` and `refetchEffect`.
10
+ *
11
+ * The policy owns in-flight load ownership, joiners, stale generation checks,
12
+ * restore-before-load, retry scheduling, row replacement, lifecycle events, and
13
+ * load persistence. Collection Runtime calls this small Interface so load
14
+ * ordering stays Effect-first and runtime/request-local.
15
+ */
16
+ export declare const runCollectionSyncLoadPolicyEffect: <A extends object, K extends CollectionKey, E, R>(definition: CollectionDefinition<A, K, E, R>, options: CollectionSyncLoadPolicyOptions) => Effect.Effect<void, CollectionRuntimeError<E>, R>;
17
+ //# sourceMappingURL=collection-sync-load-policy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collection-sync-load-policy.d.ts","sourceRoot":"","sources":["../src/collection-sync-load-policy.ts"],"names":[],"mappings":"AACA,OAAO,EAA0B,MAAM,EAAQ,MAAM,QAAQ,CAAC;AAC9D,OAAO,KAAK,EAEV,oBAAoB,EACpB,aAAa,EAGb,sBAAsB,EACvB,MAAM,0BAA0B,CAAC;AA8BlC,8DAA8D;AAC9D,MAAM,WAAW,+BAA+B;IAC9C,yFAAyF;IACzF,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;CACzB;AAmTD;;;;;;;GAOG;AACH,eAAO,MAAM,iCAAiC,GAAI,CAAC,SAAS,MAAM,EAAE,CAAC,SAAS,aAAa,EAAE,CAAC,EAAE,CAAC,cACnF,oBAAoB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,WACnC,+BAA+B,KACvC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,sBAAsB,CAAC,CAAC,CAAC,EAAE,CAAC,CAgH/C,CAAC"}
@@ -0,0 +1,245 @@
1
+ import { EffectInputCallbackError } from "@sunfall/arc-core";
2
+ import { Cause, Clock, Deferred, Effect, Exit } from "effect";
3
+ import { collectionPersistenceConfig, collectionPersistencePersistOptions, persistCollectionSnapshotEffect, restoreCollectionBeforePreloadEffect, } from "./collection-persistence.js";
4
+ import { ingestCollectionOutputRowsEffect } from "./collection-row-ingress.js";
5
+ import { applyCollectionBaseRow, deleteCollectionBaseRow, makeCollectionState, rebaseCollectionBaseRows, } from "./collection-state.js";
6
+ import { collectionStoreEffect } from "./runtime-collection-store.js";
7
+ import { collectionCallbackEffect, collectionStateEffect, } from "./collection-projection-callback-policy.js";
8
+ import { restoreCollectionStateSnapshot, snapshotCollectionState, withCollectionDurableCommitPermit, } from "./collection-write-commit.js";
9
+ import { collectionSnapshotFromState } from "./collection-snapshot-codec.js";
10
+ import { withCollectionPolicyRetry } from "./collection-policy.js";
11
+ const publishStoreEvent = (store, event) => store.publish(event);
12
+ const replaceLoadedCollectionRows = (state, rows) => {
13
+ const nextRows = new Map();
14
+ for (const row of rows) {
15
+ nextRows.set(row.key, row);
16
+ }
17
+ for (const row of state.rows.values()) {
18
+ if (!row.synced && !nextRows.has(row.key) && !state.optimisticRows.has(row.key)) {
19
+ nextRows.set(row.key, row);
20
+ }
21
+ }
22
+ state.rows.clear();
23
+ const rebaseKeys = new Set();
24
+ for (const row of nextRows.values()) {
25
+ applyCollectionBaseRow(state, row, rebaseKeys);
26
+ }
27
+ for (const key of state.optimisticRows.keys()) {
28
+ if (!nextRows.has(key)) {
29
+ deleteCollectionBaseRow(state, key, rebaseKeys);
30
+ }
31
+ }
32
+ rebaseCollectionBaseRows(state, rebaseKeys);
33
+ };
34
+ const isInterruptedCause = (cause) => cause.reasons.some(Cause.isInterruptReason);
35
+ const failCollectionLoadEffect = (store, definition, state, error) => Effect.gen(function* () {
36
+ state.loadState.set({
37
+ _tag: "Failure",
38
+ waiting: false,
39
+ error: error,
40
+ });
41
+ yield* publishStoreEvent(store, {
42
+ _tag: "CollectionLoadFailure",
43
+ collection: definition.name,
44
+ error,
45
+ });
46
+ return yield* Effect.fail(error);
47
+ });
48
+ const beginCollectionLoadAttempt = (state, force) => Effect.gen(function* () {
49
+ if (!force && state.activeLoad) {
50
+ return { _tag: "Join", attempt: state.activeLoad };
51
+ }
52
+ const attempt = {
53
+ generation: ++state.loadGeneration,
54
+ force,
55
+ deferred: yield* Deferred.make(),
56
+ };
57
+ state.activeLoad = attempt;
58
+ return { _tag: "Owner", attempt };
59
+ });
60
+ const isCurrentLoadAttempt = (state, attempt) => state.loadGeneration === attempt.generation &&
61
+ state.activeLoad?.generation === attempt.generation;
62
+ const completeCollectionLoadAttempt = (state, attempt, exit) => Effect.gen(function* () {
63
+ if (state.activeLoad?.generation === attempt.generation) {
64
+ state.activeLoad = undefined;
65
+ }
66
+ yield* Deferred.done(attempt.deferred, exit).pipe(Effect.asVoid);
67
+ });
68
+ const effectFromLoadAttemptExit = (exit) => Exit.isSuccess(exit) ? Effect.void : Effect.failCause(exit.cause);
69
+ const supersededLoadAttemptWithoutActiveError = (definition, state, attempt) => new EffectInputCallbackError({
70
+ operation: `Collection.load(${definition.name}).superseded`,
71
+ cause: {
72
+ attemptGeneration: attempt.generation,
73
+ currentGeneration: state.loadGeneration,
74
+ loadState: state.loadState.get()._tag,
75
+ },
76
+ guidance: "A superseded collection load can only complete from a visible Ready or Failure state, or by joining the current active load generation.",
77
+ });
78
+ const waitForSupersedingLoadAttempt = (definition, state, attempt) => Effect.suspend(() => {
79
+ const current = state.loadState.get();
80
+ switch (current._tag) {
81
+ case "Ready":
82
+ return Effect.void;
83
+ case "Failure":
84
+ return Effect.fail(current.error);
85
+ case "Initial":
86
+ case "Pending": {
87
+ const active = state.activeLoad;
88
+ return active && active.generation !== attempt.generation
89
+ ? Deferred.await(active.deferred)
90
+ : Effect.fail(supersededLoadAttemptWithoutActiveError(definition, state, attempt));
91
+ }
92
+ }
93
+ });
94
+ const resolveLoadAttemptCompletion = (definition, state, attempt, exit) => state.loadGeneration === attempt.generation
95
+ ? effectFromLoadAttemptExit(exit)
96
+ : waitForSupersedingLoadAttempt(definition, state, attempt);
97
+ const collectionLoadOperation = (definition, force) => force
98
+ ? (definition.options.refetch ?? definition.options.load)
99
+ : (definition.options.load ?? definition.options.refetch);
100
+ const restoreBeforePreloadEffect = (definition, state, store, attempt) => Effect.suspend(() => {
101
+ const restoreVersion = state.version.get();
102
+ return restoreCollectionBeforePreloadEffect(definition, state, store, collectionStoreEffect, () => isCurrentLoadAttempt(state, attempt) && state.version.get() === restoreVersion);
103
+ });
104
+ const shouldPersistLoad = (definition) => {
105
+ const config = collectionPersistenceConfig(definition);
106
+ return config !== undefined && config.persistOnLoad !== false;
107
+ };
108
+ const stagedLoadedCollectionSnapshotEffect = (definition, state, rows, updatedAt) => Effect.try({
109
+ try: () => {
110
+ const stagedState = makeCollectionState();
111
+ restoreCollectionStateSnapshot(stagedState, snapshotCollectionState(state));
112
+ replaceLoadedCollectionRows(stagedState, rows);
113
+ return collectionSnapshotFromState(definition, stagedState, updatedAt);
114
+ },
115
+ catch: (cause) => new EffectInputCallbackError({
116
+ operation: `Collection.load(${definition.name}).snapshot`,
117
+ cause,
118
+ guidance: "Collection load snapshots must be serializable before rows are committed to live state.",
119
+ }),
120
+ });
121
+ const persistLoadSnapshotEffect = (definition, store, snapshot) => Effect.suspend(() => {
122
+ const config = collectionPersistenceConfig(definition);
123
+ if (config === undefined || config.persistOnLoad === false) {
124
+ return Effect.succeed(undefined);
125
+ }
126
+ return persistCollectionSnapshotEffect(definition, Effect.succeed(snapshot), config.storage, collectionPersistencePersistOptions(config), store).pipe(Effect.asVoid);
127
+ });
128
+ const restoreLoadStateIfCurrentEffect = (state, attempt, loadState) => Effect.sync(() => {
129
+ if (isCurrentLoadAttempt(state, attempt)) {
130
+ state.loadState.set(loadState);
131
+ }
132
+ });
133
+ const commitLoadedCollectionRowsEffect = (definition, state, store, attempt, rows, previousLoadState, updatedAt) => withCollectionDurableCommitPermit(state, Effect.uninterruptibleMask((restore) => Effect.gen(function* () {
134
+ if (!isCurrentLoadAttempt(state, attempt)) {
135
+ return;
136
+ }
137
+ const snapshot = shouldPersistLoad(definition)
138
+ ? yield* stagedLoadedCollectionSnapshotEffect(definition, state, rows, updatedAt).pipe(Effect.catch((error) => isCurrentLoadAttempt(state, attempt)
139
+ ? failCollectionLoadEffect(store, definition, state, error)
140
+ : Effect.fail(error)))
141
+ : undefined;
142
+ if (!isCurrentLoadAttempt(state, attempt)) {
143
+ return;
144
+ }
145
+ const persistExit = yield* snapshot === undefined
146
+ ? Effect.succeed(Exit.void)
147
+ : restore(persistLoadSnapshotEffect(definition, store, snapshot)).pipe(Effect.exit);
148
+ if (Exit.isFailure(persistExit)) {
149
+ if (isInterruptedCause(persistExit.cause)) {
150
+ yield* restoreLoadStateIfCurrentEffect(state, attempt, previousLoadState);
151
+ }
152
+ else if (isCurrentLoadAttempt(state, attempt)) {
153
+ yield* failCollectionLoadEffect(store, definition, state, persistExit.cause.reasons.find(Cause.isFailReason)?.error ??
154
+ Cause.squash(persistExit.cause)).pipe(Effect.exit);
155
+ }
156
+ return yield* Effect.failCause(persistExit.cause);
157
+ }
158
+ if (!isCurrentLoadAttempt(state, attempt)) {
159
+ return;
160
+ }
161
+ replaceLoadedCollectionRows(state, rows);
162
+ state.initialDataError = undefined;
163
+ state.loadState.set({ _tag: "Ready", waiting: false, updatedAt });
164
+ yield* publishStoreEvent(store, {
165
+ _tag: "CollectionLoaded",
166
+ collection: definition.name,
167
+ count: state.rows.size,
168
+ updatedAt,
169
+ });
170
+ })));
171
+ /**
172
+ * Runs the Collection Sync Load Policy for `preloadEffect` and `refetchEffect`.
173
+ *
174
+ * The policy owns in-flight load ownership, joiners, stale generation checks,
175
+ * restore-before-load, retry scheduling, row replacement, lifecycle events, and
176
+ * load persistence. Collection Runtime calls this small Interface so load
177
+ * ordering stays Effect-first and runtime/request-local.
178
+ */
179
+ export const runCollectionSyncLoadPolicyEffect = (definition, options) => Effect.gen(function* () {
180
+ const store = yield* collectionStoreEffect;
181
+ const state = yield* collectionStateEffect(definition, store);
182
+ const ownership = yield* beginCollectionLoadAttempt(state, options.force);
183
+ if (ownership._tag === "Join") {
184
+ return yield* Deferred.await(ownership.attempt.deferred);
185
+ }
186
+ const attempt = ownership.attempt;
187
+ const failCurrentLoad = (error) => isCurrentLoadAttempt(state, attempt)
188
+ ? failCollectionLoadEffect(store, definition, state, error)
189
+ : Effect.fail(error);
190
+ const runOwnerLoad = Effect.gen(function* () {
191
+ const restored = yield* restoreBeforePreloadEffect(definition, state, store, attempt).pipe(Effect.catch((error) => failCurrentLoad(error)));
192
+ if (!isCurrentLoadAttempt(state, attempt)) {
193
+ return;
194
+ }
195
+ const current = state.loadState.get();
196
+ const operation = collectionLoadOperation(definition, options.force);
197
+ const shouldLoadAfterRestore = restored &&
198
+ collectionPersistenceConfig(definition)?.loadAfterRestore === true &&
199
+ operation !== undefined;
200
+ if (!options.force && current._tag === "Ready" && !shouldLoadAfterRestore) {
201
+ return;
202
+ }
203
+ if (!operation) {
204
+ if (state.initialDataError !== undefined) {
205
+ return yield* failCurrentLoad(state.initialDataError);
206
+ }
207
+ if (current._tag === "Initial" && isCurrentLoadAttempt(state, attempt)) {
208
+ const updatedAt = yield* Clock.currentTimeMillis;
209
+ state.loadState.set({ _tag: "Ready", waiting: false, updatedAt });
210
+ }
211
+ return;
212
+ }
213
+ const load = collectionCallbackEffect(operation);
214
+ const previousLoadState = state.loadState.get();
215
+ if (isCurrentLoadAttempt(state, attempt)) {
216
+ state.loadState.set({ _tag: "Pending", waiting: true });
217
+ }
218
+ const values = yield* withCollectionPolicyRetry(definition, load).pipe(Effect.onExit((exit) => Exit.isFailure(exit) && isInterruptedCause(exit.cause)
219
+ ? restoreLoadStateIfCurrentEffect(state, attempt, previousLoadState)
220
+ : Effect.void), Effect.catch((error) => failCurrentLoad(error)));
221
+ yield* Effect.gen(function* () {
222
+ const rows = yield* ingestCollectionOutputRowsEffect(definition, values, {
223
+ operation: "load",
224
+ path: `$.collections[${definition.name}].rows`,
225
+ synced: true,
226
+ origin: "remote",
227
+ }).pipe(Effect.catch((error) => failCurrentLoad(error)));
228
+ if (!isCurrentLoadAttempt(state, attempt)) {
229
+ return;
230
+ }
231
+ const updatedAt = yield* Clock.currentTimeMillis;
232
+ yield* commitLoadedCollectionRowsEffect(definition, state, store, attempt, rows, previousLoadState, updatedAt);
233
+ }).pipe(Effect.onExit((exit) => Exit.isFailure(exit) && isInterruptedCause(exit.cause)
234
+ ? restoreLoadStateIfCurrentEffect(state, attempt, previousLoadState)
235
+ : Effect.void));
236
+ }).pipe(Effect.exit, Effect.flatMap((exit) => Effect.gen(function* () {
237
+ const completionExit = yield* Effect.exit(resolveLoadAttemptCompletion(definition, state, attempt, exit));
238
+ yield* completeCollectionLoadAttempt(state, attempt, completionExit);
239
+ return yield* effectFromLoadAttemptExit(completionExit);
240
+ })));
241
+ return yield* runOwnerLoad.pipe(Effect.onExit((exit) => Exit.isFailure(exit)
242
+ ? completeCollectionLoadAttempt(state, attempt, exit)
243
+ : Effect.void));
244
+ });
245
+ //# sourceMappingURL=collection-sync-load-policy.js.map