@korajs/store 1.0.0-beta.4 → 1.0.0-beta.5
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/adapters/better-sqlite3.d.cts +1 -1
- package/dist/adapters/better-sqlite3.d.ts +1 -1
- package/dist/adapters/indexeddb.cjs +4 -1
- package/dist/adapters/indexeddb.cjs.map +1 -1
- package/dist/adapters/indexeddb.d.cts +2 -2
- package/dist/adapters/indexeddb.d.ts +2 -2
- package/dist/adapters/indexeddb.js +1 -1
- package/dist/adapters/sqlite-wasm-shared-host.cjs +292 -42
- package/dist/adapters/sqlite-wasm-shared-host.cjs.map +1 -1
- package/dist/adapters/sqlite-wasm-shared-host.d.cts +43 -25
- package/dist/adapters/sqlite-wasm-shared-host.d.ts +43 -25
- package/dist/adapters/sqlite-wasm-shared-host.js +33 -42
- package/dist/adapters/sqlite-wasm-shared-host.js.map +1 -1
- package/dist/adapters/sqlite-wasm-worker.cjs +206 -208
- package/dist/adapters/sqlite-wasm-worker.cjs.map +1 -1
- package/dist/adapters/sqlite-wasm-worker.js +8 -257
- package/dist/adapters/sqlite-wasm-worker.js.map +1 -1
- package/dist/adapters/sqlite-wasm.cjs +4 -1
- package/dist/adapters/sqlite-wasm.cjs.map +1 -1
- package/dist/adapters/sqlite-wasm.d.cts +3 -3
- package/dist/adapters/sqlite-wasm.d.ts +3 -3
- package/dist/adapters/sqlite-wasm.js +1 -1
- package/dist/{backup-IQE4QC7Q.js → backup-5S7K2Z35.js} +3 -3
- package/dist/chunk-3Y2IERBF.js +255 -0
- package/dist/chunk-3Y2IERBF.js.map +1 -0
- package/dist/{chunk-RCTG3IJG.js → chunk-CYO3YKFL.js} +2 -2
- package/dist/{chunk-6NKLDBTY.js → chunk-GSJ7EEUC.js} +2 -1
- package/dist/chunk-GSJ7EEUC.js.map +1 -0
- package/dist/{chunk-OCOGQRHW.js → chunk-HS6DBMST.js} +2 -2
- package/dist/{chunk-2ZRQGFEF.js → chunk-Q57CHIIN.js} +5 -2
- package/dist/chunk-Q57CHIIN.js.map +1 -0
- package/dist/{chunk-UXRWVXBP.js → chunk-RL43UYQZ.js} +2 -2
- package/dist/{export-audit-MT2LTMIN.js → export-audit-ODGQTQIK.js} +3 -3
- package/dist/index.cjs +120 -3
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +27 -4
- package/dist/index.d.ts +27 -4
- package/dist/index.js +128 -11
- package/dist/index.js.map +1 -1
- package/dist/internal.cjs +1 -0
- package/dist/internal.cjs.map +1 -1
- package/dist/internal.d.cts +3 -3
- package/dist/internal.d.ts +3 -3
- package/dist/internal.js +2 -2
- package/dist/{sqlite-wasm-channel-CNHRf-m2.d.cts → sqlite-wasm-channel-Bx57s8Cq.d.cts} +1 -1
- package/dist/{sqlite-wasm-channel-CNHRf-m2.d.ts → sqlite-wasm-channel-Bx57s8Cq.d.ts} +1 -1
- package/dist/{types-5h4Hqcwc.d.ts → types-C1kigrWz.d.ts} +1 -1
- package/dist/{types-k6AZgiH4.d.ts → types-D1MzKVmk.d.cts} +10 -0
- package/dist/{types-k6AZgiH4.d.cts → types-D1MzKVmk.d.ts} +10 -0
- package/dist/{types-DfPiPwKr.d.cts → types-DAo9oduO.d.cts} +1 -1
- package/package.json +2 -2
- package/dist/chunk-2ZRQGFEF.js.map +0 -1
- package/dist/chunk-6NKLDBTY.js.map +0 -1
- /package/dist/{backup-IQE4QC7Q.js.map → backup-5S7K2Z35.js.map} +0 -0
- /package/dist/{chunk-RCTG3IJG.js.map → chunk-CYO3YKFL.js.map} +0 -0
- /package/dist/{chunk-OCOGQRHW.js.map → chunk-HS6DBMST.js.map} +0 -0
- /package/dist/{chunk-UXRWVXBP.js.map → chunk-RL43UYQZ.js.map} +0 -0
- /package/dist/{export-audit-MT2LTMIN.js.map → export-audit-ODGQTQIK.js.map} +0 -0
package/dist/index.d.cts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { C as CollectionRecord, S as StorageAdapter, Q as QueryDescriptor, c as SubscriptionCallback, W as WhereClause, d as OrderByDirection, L as LocalMutationHandler, e as StoreConfig, A as ApplyRemoteOptions, f as MaterializedRowSnapshot, g as RowVersionState } from './types-
|
|
2
|
-
export { M as MigrationPlan, h as OrderByClause, i as StoreIsolation, T as Transaction, j as TransactionBufferedEntry, k as TransactionCommitBatch, l as TransactionCommitResult, m as WhereOperators } from './types-
|
|
1
|
+
import { C as CollectionRecord, S as StorageAdapter, Q as QueryDescriptor, c as SubscriptionCallback, W as WhereClause, d as OrderByDirection, L as LocalMutationHandler, e as StoreConfig, A as ApplyRemoteOptions, f as MaterializedRowSnapshot, g as RowVersionState } from './types-D1MzKVmk.cjs';
|
|
2
|
+
export { M as MigrationPlan, h as OrderByClause, i as StoreIsolation, T as Transaction, j as TransactionBufferedEntry, k as TransactionCommitBatch, l as TransactionCommitResult, m as WhereOperators } from './types-D1MzKVmk.cjs';
|
|
3
3
|
import { Operation, KoraError, VersionVector, SchemaDefinition, HLCTimestamp, MergeTrace, CollectionDefinition, SequenceConfig, HybridLogicalClock, CausalTracker, OperationLog, ApplyResult, StateMachineDefinition, KoraBytesValue, KoraEvent, BlobRefMetadata, BlobRef } from '@korajs/core';
|
|
4
4
|
export { ApplyResult } from '@korajs/core';
|
|
5
|
-
import { R as RelationEnforcer, L as LocalMutationContext } from './types-
|
|
6
|
-
export { C as Collection } from './types-
|
|
5
|
+
import { R as RelationEnforcer, L as LocalMutationContext } from './types-DAo9oduO.cjs';
|
|
6
|
+
export { C as Collection } from './types-DAo9oduO.cjs';
|
|
7
7
|
import * as yjs from 'yjs';
|
|
8
8
|
import { C as ContentAddressedBlobStore, M as MemoryBlobStore } from './content-addressed-blob-store-Dcj3SB9r.cjs';
|
|
9
9
|
export { B as BlobIntegrityError } from './content-addressed-blob-store-Dcj3SB9r.cjs';
|
|
@@ -858,6 +858,23 @@ declare class Store implements OperationLog {
|
|
|
858
858
|
* Persist or clear the delta cursor for paginated initial sync resume.
|
|
859
859
|
*/
|
|
860
860
|
saveDeltaCursor(cursor: string | null): Promise<void>;
|
|
861
|
+
/**
|
|
862
|
+
* Load the persisted delivery watermark for a view signature (0 when none recorded).
|
|
863
|
+
* Defaults to the unfiltered view so existing single-watermark reads keep working.
|
|
864
|
+
*/
|
|
865
|
+
loadDeliveryWatermark(signature?: string): Promise<number>;
|
|
866
|
+
/**
|
|
867
|
+
* Persist the delivery watermark for a view signature so it survives a client restart.
|
|
868
|
+
*/
|
|
869
|
+
saveDeliveryWatermark(signature: string, watermark: number): Promise<void>;
|
|
870
|
+
/**
|
|
871
|
+
* Load every persisted view watermark, keyed by signature.
|
|
872
|
+
*/
|
|
873
|
+
loadAllDeliveryWatermarks(): Promise<Record<string, number>>;
|
|
874
|
+
/**
|
|
875
|
+
* Delete a persisted view watermark (safe: the view back-fills from 0 when next visited).
|
|
876
|
+
*/
|
|
877
|
+
deleteDeliveryWatermark(signature: string): Promise<void>;
|
|
861
878
|
/**
|
|
862
879
|
* Local operations not yet reflected on the server version vector.
|
|
863
880
|
*/
|
|
@@ -892,6 +909,12 @@ declare class Store implements OperationLog {
|
|
|
892
909
|
* Latest operation for a record from any node (for 3-way merge when local op log is empty).
|
|
893
910
|
*/
|
|
894
911
|
getLatestOperationForRecord(collection: string, recordId: string): Promise<Operation | null>;
|
|
912
|
+
/**
|
|
913
|
+
* All operations for a record, sorted in HLC total order (wallTime, logical,
|
|
914
|
+
* nodeId). Used by the apply pipeline to materialize atomic-op fields by folding
|
|
915
|
+
* the record's log, matching the server's materialization exactly.
|
|
916
|
+
*/
|
|
917
|
+
getOperationsForRecord(collection: string, recordId: string): Promise<Operation[]>;
|
|
895
918
|
/** Expose the subscription manager for direct access (e.g., by QueryBuilder) */
|
|
896
919
|
getSubscriptionManager(): SubscriptionManager;
|
|
897
920
|
/**
|
package/dist/index.d.ts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { C as CollectionRecord, S as StorageAdapter, Q as QueryDescriptor, c as SubscriptionCallback, W as WhereClause, d as OrderByDirection, L as LocalMutationHandler, e as StoreConfig, A as ApplyRemoteOptions, f as MaterializedRowSnapshot, g as RowVersionState } from './types-
|
|
2
|
-
export { M as MigrationPlan, h as OrderByClause, i as StoreIsolation, T as Transaction, j as TransactionBufferedEntry, k as TransactionCommitBatch, l as TransactionCommitResult, m as WhereOperators } from './types-
|
|
1
|
+
import { C as CollectionRecord, S as StorageAdapter, Q as QueryDescriptor, c as SubscriptionCallback, W as WhereClause, d as OrderByDirection, L as LocalMutationHandler, e as StoreConfig, A as ApplyRemoteOptions, f as MaterializedRowSnapshot, g as RowVersionState } from './types-D1MzKVmk.js';
|
|
2
|
+
export { M as MigrationPlan, h as OrderByClause, i as StoreIsolation, T as Transaction, j as TransactionBufferedEntry, k as TransactionCommitBatch, l as TransactionCommitResult, m as WhereOperators } from './types-D1MzKVmk.js';
|
|
3
3
|
import { Operation, KoraError, VersionVector, SchemaDefinition, HLCTimestamp, MergeTrace, CollectionDefinition, SequenceConfig, HybridLogicalClock, CausalTracker, OperationLog, ApplyResult, StateMachineDefinition, KoraBytesValue, KoraEvent, BlobRefMetadata, BlobRef } from '@korajs/core';
|
|
4
4
|
export { ApplyResult } from '@korajs/core';
|
|
5
|
-
import { R as RelationEnforcer, L as LocalMutationContext } from './types-
|
|
6
|
-
export { C as Collection } from './types-
|
|
5
|
+
import { R as RelationEnforcer, L as LocalMutationContext } from './types-C1kigrWz.js';
|
|
6
|
+
export { C as Collection } from './types-C1kigrWz.js';
|
|
7
7
|
import * as yjs from 'yjs';
|
|
8
8
|
import { C as ContentAddressedBlobStore, M as MemoryBlobStore } from './content-addressed-blob-store-Dcj3SB9r.js';
|
|
9
9
|
export { B as BlobIntegrityError } from './content-addressed-blob-store-Dcj3SB9r.js';
|
|
@@ -858,6 +858,23 @@ declare class Store implements OperationLog {
|
|
|
858
858
|
* Persist or clear the delta cursor for paginated initial sync resume.
|
|
859
859
|
*/
|
|
860
860
|
saveDeltaCursor(cursor: string | null): Promise<void>;
|
|
861
|
+
/**
|
|
862
|
+
* Load the persisted delivery watermark for a view signature (0 when none recorded).
|
|
863
|
+
* Defaults to the unfiltered view so existing single-watermark reads keep working.
|
|
864
|
+
*/
|
|
865
|
+
loadDeliveryWatermark(signature?: string): Promise<number>;
|
|
866
|
+
/**
|
|
867
|
+
* Persist the delivery watermark for a view signature so it survives a client restart.
|
|
868
|
+
*/
|
|
869
|
+
saveDeliveryWatermark(signature: string, watermark: number): Promise<void>;
|
|
870
|
+
/**
|
|
871
|
+
* Load every persisted view watermark, keyed by signature.
|
|
872
|
+
*/
|
|
873
|
+
loadAllDeliveryWatermarks(): Promise<Record<string, number>>;
|
|
874
|
+
/**
|
|
875
|
+
* Delete a persisted view watermark (safe: the view back-fills from 0 when next visited).
|
|
876
|
+
*/
|
|
877
|
+
deleteDeliveryWatermark(signature: string): Promise<void>;
|
|
861
878
|
/**
|
|
862
879
|
* Local operations not yet reflected on the server version vector.
|
|
863
880
|
*/
|
|
@@ -892,6 +909,12 @@ declare class Store implements OperationLog {
|
|
|
892
909
|
* Latest operation for a record from any node (for 3-way merge when local op log is empty).
|
|
893
910
|
*/
|
|
894
911
|
getLatestOperationForRecord(collection: string, recordId: string): Promise<Operation | null>;
|
|
912
|
+
/**
|
|
913
|
+
* All operations for a record, sorted in HLC total order (wallTime, logical,
|
|
914
|
+
* nodeId). Used by the apply pipeline to materialize atomic-op fields by folding
|
|
915
|
+
* the record's log, matching the server's materialization exactly.
|
|
916
|
+
*/
|
|
917
|
+
getOperationsForRecord(collection: string, recordId: string): Promise<Operation[]>;
|
|
895
918
|
/** Expose the subscription manager for direct access (e.g., by QueryBuilder) */
|
|
896
919
|
getSubscriptionManager(): SubscriptionManager;
|
|
897
920
|
/**
|
package/dist/index.js
CHANGED
|
@@ -3,12 +3,12 @@ import {
|
|
|
3
3
|
readBackupManifest,
|
|
4
4
|
restoreBackup,
|
|
5
5
|
verifyBackupChecksum
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-HS6DBMST.js";
|
|
7
7
|
import {
|
|
8
8
|
decodeAuditExport,
|
|
9
9
|
readAuditExportManifest,
|
|
10
10
|
verifyAuditExportChecksum
|
|
11
|
-
} from "./chunk-
|
|
11
|
+
} from "./chunk-CYO3YKFL.js";
|
|
12
12
|
import {
|
|
13
13
|
persistedAuditTraceFromEvent
|
|
14
14
|
} from "./chunk-MYSJN3DF.js";
|
|
@@ -39,7 +39,7 @@ import {
|
|
|
39
39
|
serializeRowVersion,
|
|
40
40
|
validateStateTransition,
|
|
41
41
|
validateUpdateStateMachine
|
|
42
|
-
} from "./chunk-
|
|
42
|
+
} from "./chunk-RL43UYQZ.js";
|
|
43
43
|
import {
|
|
44
44
|
decodeRichtext,
|
|
45
45
|
decodeRichtextFieldsFromOpData,
|
|
@@ -51,7 +51,7 @@ import {
|
|
|
51
51
|
richtextToPlainText,
|
|
52
52
|
serializeOperation,
|
|
53
53
|
serializeRecord
|
|
54
|
-
} from "./chunk-
|
|
54
|
+
} from "./chunk-GSJ7EEUC.js";
|
|
55
55
|
import {
|
|
56
56
|
AdapterError,
|
|
57
57
|
NoLeaderError,
|
|
@@ -131,6 +131,7 @@ function buildDeleteSql(table, withAge) {
|
|
|
131
131
|
import { createVersionVector as createVersionVector2 } from "@korajs/core";
|
|
132
132
|
var LAST_ACKED_SERVER_VECTOR_META_KEY = "last_acked_server_vector";
|
|
133
133
|
var DELTA_CURSOR_META_KEY = "delta_cursor";
|
|
134
|
+
var DELIVERY_WATERMARK_META_KEY = "delivery_watermark";
|
|
134
135
|
function serializeVersionVectorToMeta(vector) {
|
|
135
136
|
const record = {};
|
|
136
137
|
for (const [nodeId, seq] of vector) {
|
|
@@ -203,6 +204,45 @@ async function saveDeltaCursor(adapter, cursor) {
|
|
|
203
204
|
cursor
|
|
204
205
|
]);
|
|
205
206
|
}
|
|
207
|
+
function deliveryWatermarkKey(signature) {
|
|
208
|
+
return signature === "" ? DELIVERY_WATERMARK_META_KEY : `${DELIVERY_WATERMARK_META_KEY}:${signature}`;
|
|
209
|
+
}
|
|
210
|
+
async function loadDeliveryWatermark(adapter, signature) {
|
|
211
|
+
const rows = await adapter.query("SELECT value FROM _kora_meta WHERE key = ?", [
|
|
212
|
+
deliveryWatermarkKey(signature)
|
|
213
|
+
]);
|
|
214
|
+
const value = rows[0]?.value;
|
|
215
|
+
if (value === void 0 || value === null) {
|
|
216
|
+
return 0;
|
|
217
|
+
}
|
|
218
|
+
const parsed = Number(value);
|
|
219
|
+
return Number.isFinite(parsed) && parsed >= 0 ? parsed : 0;
|
|
220
|
+
}
|
|
221
|
+
async function saveDeliveryWatermark(adapter, signature, watermark) {
|
|
222
|
+
await adapter.execute("INSERT OR REPLACE INTO _kora_meta (key, value) VALUES (?, ?)", [
|
|
223
|
+
deliveryWatermarkKey(signature),
|
|
224
|
+
String(watermark)
|
|
225
|
+
]);
|
|
226
|
+
}
|
|
227
|
+
async function deleteDeliveryWatermark(adapter, signature) {
|
|
228
|
+
await adapter.execute("DELETE FROM _kora_meta WHERE key = ?", [deliveryWatermarkKey(signature)]);
|
|
229
|
+
}
|
|
230
|
+
async function loadAllDeliveryWatermarks(adapter) {
|
|
231
|
+
const rows = await adapter.query(
|
|
232
|
+
"SELECT key, value FROM _kora_meta WHERE key = ? OR key LIKE ?",
|
|
233
|
+
[DELIVERY_WATERMARK_META_KEY, `${DELIVERY_WATERMARK_META_KEY}:%`]
|
|
234
|
+
);
|
|
235
|
+
const result = {};
|
|
236
|
+
const prefix = `${DELIVERY_WATERMARK_META_KEY}:`;
|
|
237
|
+
for (const row of rows) {
|
|
238
|
+
const signature = row.key === DELIVERY_WATERMARK_META_KEY ? "" : row.key.slice(prefix.length);
|
|
239
|
+
const parsed = Number(row.value);
|
|
240
|
+
if (Number.isFinite(parsed) && parsed >= 0) {
|
|
241
|
+
result[signature] = parsed;
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
return result;
|
|
245
|
+
}
|
|
206
246
|
|
|
207
247
|
// src/store/store.ts
|
|
208
248
|
import {
|
|
@@ -211,7 +251,8 @@ import {
|
|
|
211
251
|
createVersionVector as createVersionVector3,
|
|
212
252
|
generateUUIDv7 as generateUUIDv73,
|
|
213
253
|
migrationStepsToSQL,
|
|
214
|
-
quoteIdent as quoteIdent7
|
|
254
|
+
quoteIdent as quoteIdent7,
|
|
255
|
+
replayOperationsForRecord
|
|
215
256
|
} from "@korajs/core";
|
|
216
257
|
|
|
217
258
|
// src/collection/collection.ts
|
|
@@ -2196,7 +2237,8 @@ var Store = class {
|
|
|
2196
2237
|
throw new OptimisticLockError(collection, op.recordId);
|
|
2197
2238
|
}
|
|
2198
2239
|
};
|
|
2199
|
-
if (
|
|
2240
|
+
if (options?.logOnly) {
|
|
2241
|
+
} else if (op.type === "insert" && materializeSource) {
|
|
2200
2242
|
const serializedData = serializeRecord(materializeSource, definition.fields);
|
|
2201
2243
|
const existing2 = await tx.query(
|
|
2202
2244
|
`SELECT _updated_at, _version, _field_versions, _deleted FROM ${collection} WHERE id = ?`,
|
|
@@ -2218,7 +2260,7 @@ var Store = class {
|
|
|
2218
2260
|
};
|
|
2219
2261
|
const insertQuery = buildInsertQuery(collection, record);
|
|
2220
2262
|
await tx.execute(insertQuery.sql, insertQuery.params);
|
|
2221
|
-
await this.foldOrphanedOperations(tx, collection, definition, op.recordId);
|
|
2263
|
+
await this.foldOrphanedOperations(tx, collection, definition, op.recordId, op);
|
|
2222
2264
|
} else if (row._deleted === 1) {
|
|
2223
2265
|
if (isIncomingNewerThanRow(materializeTimestamp, row)) {
|
|
2224
2266
|
const fieldChanges = {
|
|
@@ -2370,7 +2412,7 @@ var Store = class {
|
|
|
2370
2412
|
* necessarily an orphan (rows are soft-deleted, never removed, so a row
|
|
2371
2413
|
* that is absent now was never materialized).
|
|
2372
2414
|
*/
|
|
2373
|
-
async foldOrphanedOperations(tx, collection, definition, recordId) {
|
|
2415
|
+
async foldOrphanedOperations(tx, collection, definition, recordId, insertOp) {
|
|
2374
2416
|
const orphanRows = await tx.query(
|
|
2375
2417
|
`SELECT * FROM ${quoteIdent7(`_kora_ops_${collection}`)} WHERE record_id = ? AND type IN ('update', 'delete')`,
|
|
2376
2418
|
[recordId]
|
|
@@ -2419,6 +2461,37 @@ var Store = class {
|
|
|
2419
2461
|
await tx.execute(query.sql, query.params);
|
|
2420
2462
|
}
|
|
2421
2463
|
}
|
|
2464
|
+
const atomicFields = /* @__PURE__ */ new Set();
|
|
2465
|
+
for (const orphan of orphans) {
|
|
2466
|
+
if (orphan.type === "update" && orphan.atomicOps) {
|
|
2467
|
+
for (const field of Object.keys(orphan.atomicOps)) {
|
|
2468
|
+
atomicFields.add(field);
|
|
2469
|
+
}
|
|
2470
|
+
}
|
|
2471
|
+
}
|
|
2472
|
+
if (atomicFields.size > 0) {
|
|
2473
|
+
const ordered = [insertOp, ...orphans].sort(
|
|
2474
|
+
(a, b) => HybridLogicalClock3.compare(a.timestamp, b.timestamp)
|
|
2475
|
+
);
|
|
2476
|
+
const folded = replayOperationsForRecord(ordered);
|
|
2477
|
+
if (folded) {
|
|
2478
|
+
const composed = {};
|
|
2479
|
+
for (const field of atomicFields) {
|
|
2480
|
+
if (field in folded) {
|
|
2481
|
+
composed[field] = folded[field];
|
|
2482
|
+
}
|
|
2483
|
+
}
|
|
2484
|
+
const serialized = serializeRecord(composed, definition.fields);
|
|
2485
|
+
const cols = Object.keys(serialized);
|
|
2486
|
+
if (cols.length > 0) {
|
|
2487
|
+
const setClause = cols.map((c) => `${quoteIdent7(c)} = ?`).join(", ");
|
|
2488
|
+
await tx.execute(`UPDATE ${quoteIdent7(collection)} SET ${setClause} WHERE id = ?`, [
|
|
2489
|
+
...cols.map((c) => serialized[c]),
|
|
2490
|
+
recordId
|
|
2491
|
+
]);
|
|
2492
|
+
}
|
|
2493
|
+
}
|
|
2494
|
+
}
|
|
2422
2495
|
}
|
|
2423
2496
|
/**
|
|
2424
2497
|
* Get operations from a node within a sequence number range.
|
|
@@ -2505,7 +2578,7 @@ var Store = class {
|
|
|
2505
2578
|
*/
|
|
2506
2579
|
async exportAudit(options) {
|
|
2507
2580
|
this.ensureOpen();
|
|
2508
|
-
const { exportAudit: doExport } = await import("./export-audit-
|
|
2581
|
+
const { exportAudit: doExport } = await import("./export-audit-ODGQTQIK.js");
|
|
2509
2582
|
return doExport(this.adapter, this.schema, this.nodeId, this.schema.version, options);
|
|
2510
2583
|
}
|
|
2511
2584
|
/**
|
|
@@ -2632,6 +2705,35 @@ var Store = class {
|
|
|
2632
2705
|
this.ensureOpen();
|
|
2633
2706
|
await saveDeltaCursor(this.adapter, cursor);
|
|
2634
2707
|
}
|
|
2708
|
+
/**
|
|
2709
|
+
* Load the persisted delivery watermark for a view signature (0 when none recorded).
|
|
2710
|
+
* Defaults to the unfiltered view so existing single-watermark reads keep working.
|
|
2711
|
+
*/
|
|
2712
|
+
async loadDeliveryWatermark(signature = "") {
|
|
2713
|
+
this.ensureOpen();
|
|
2714
|
+
return loadDeliveryWatermark(this.adapter, signature);
|
|
2715
|
+
}
|
|
2716
|
+
/**
|
|
2717
|
+
* Persist the delivery watermark for a view signature so it survives a client restart.
|
|
2718
|
+
*/
|
|
2719
|
+
async saveDeliveryWatermark(signature, watermark) {
|
|
2720
|
+
this.ensureOpen();
|
|
2721
|
+
await saveDeliveryWatermark(this.adapter, signature, watermark);
|
|
2722
|
+
}
|
|
2723
|
+
/**
|
|
2724
|
+
* Load every persisted view watermark, keyed by signature.
|
|
2725
|
+
*/
|
|
2726
|
+
async loadAllDeliveryWatermarks() {
|
|
2727
|
+
this.ensureOpen();
|
|
2728
|
+
return loadAllDeliveryWatermarks(this.adapter);
|
|
2729
|
+
}
|
|
2730
|
+
/**
|
|
2731
|
+
* Delete a persisted view watermark (safe: the view back-fills from 0 when next visited).
|
|
2732
|
+
*/
|
|
2733
|
+
async deleteDeliveryWatermark(signature) {
|
|
2734
|
+
this.ensureOpen();
|
|
2735
|
+
await deleteDeliveryWatermark(this.adapter, signature);
|
|
2736
|
+
}
|
|
2635
2737
|
/**
|
|
2636
2738
|
* Local operations not yet reflected on the server version vector.
|
|
2637
2739
|
*/
|
|
@@ -2722,6 +2824,21 @@ var Store = class {
|
|
|
2722
2824
|
}
|
|
2723
2825
|
return latest;
|
|
2724
2826
|
}
|
|
2827
|
+
/**
|
|
2828
|
+
* All operations for a record, sorted in HLC total order (wallTime, logical,
|
|
2829
|
+
* nodeId). Used by the apply pipeline to materialize atomic-op fields by folding
|
|
2830
|
+
* the record's log, matching the server's materialization exactly.
|
|
2831
|
+
*/
|
|
2832
|
+
async getOperationsForRecord(collection, recordId) {
|
|
2833
|
+
this.ensureOpen();
|
|
2834
|
+
const rows = await this.adapter.query(
|
|
2835
|
+
`SELECT * FROM ${quoteIdent7(`_kora_ops_${collection}`)} WHERE record_id = ?`,
|
|
2836
|
+
[recordId]
|
|
2837
|
+
);
|
|
2838
|
+
const ops = rows.map((row) => deserializeOperationWithCollection(row, collection));
|
|
2839
|
+
ops.sort((a, b) => HybridLogicalClock3.compare(a.timestamp, b.timestamp));
|
|
2840
|
+
return ops;
|
|
2841
|
+
}
|
|
2725
2842
|
/** Expose the subscription manager for direct access (e.g., by QueryBuilder) */
|
|
2726
2843
|
getSubscriptionManager() {
|
|
2727
2844
|
return this.subscriptionManager;
|
|
@@ -2800,7 +2917,7 @@ var Store = class {
|
|
|
2800
2917
|
*/
|
|
2801
2918
|
async exportBackup(options) {
|
|
2802
2919
|
this.ensureOpen();
|
|
2803
|
-
const { exportBackup: doExport } = await import("./backup-
|
|
2920
|
+
const { exportBackup: doExport } = await import("./backup-5S7K2Z35.js");
|
|
2804
2921
|
return doExport(this.adapter, this.schema, this.nodeId, this.schema.version, options);
|
|
2805
2922
|
}
|
|
2806
2923
|
/**
|
|
@@ -2812,7 +2929,7 @@ var Store = class {
|
|
|
2812
2929
|
*/
|
|
2813
2930
|
async importBackup(data, options) {
|
|
2814
2931
|
this.ensureOpen();
|
|
2815
|
-
const { restoreBackup: doRestore } = await import("./backup-
|
|
2932
|
+
const { restoreBackup: doRestore } = await import("./backup-5S7K2Z35.js");
|
|
2816
2933
|
return doRestore(this.adapter, this.schema, data, options);
|
|
2817
2934
|
}
|
|
2818
2935
|
/**
|