@korajs/store 1.0.0-beta.2 → 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.
Files changed (67) hide show
  1. package/dist/adapters/better-sqlite3.cjs.map +1 -1
  2. package/dist/adapters/better-sqlite3.d.cts +1 -1
  3. package/dist/adapters/better-sqlite3.d.ts +1 -1
  4. package/dist/adapters/better-sqlite3.js +1 -1
  5. package/dist/adapters/indexeddb.cjs +161 -35
  6. package/dist/adapters/indexeddb.cjs.map +1 -1
  7. package/dist/adapters/indexeddb.d.cts +2 -2
  8. package/dist/adapters/indexeddb.d.ts +2 -2
  9. package/dist/adapters/indexeddb.js +3 -3
  10. package/dist/adapters/sqlite-wasm-shared-host.cjs +333 -56
  11. package/dist/adapters/sqlite-wasm-shared-host.cjs.map +1 -1
  12. package/dist/adapters/sqlite-wasm-shared-host.d.cts +81 -1
  13. package/dist/adapters/sqlite-wasm-shared-host.d.ts +81 -1
  14. package/dist/adapters/sqlite-wasm-shared-host.js +51 -56
  15. package/dist/adapters/sqlite-wasm-shared-host.js.map +1 -1
  16. package/dist/adapters/sqlite-wasm-worker.cjs +206 -208
  17. package/dist/adapters/sqlite-wasm-worker.cjs.map +1 -1
  18. package/dist/adapters/sqlite-wasm-worker.js +8 -257
  19. package/dist/adapters/sqlite-wasm-worker.js.map +1 -1
  20. package/dist/adapters/sqlite-wasm.cjs +161 -35
  21. package/dist/adapters/sqlite-wasm.cjs.map +1 -1
  22. package/dist/adapters/sqlite-wasm.d.cts +14 -3
  23. package/dist/adapters/sqlite-wasm.d.ts +14 -3
  24. package/dist/adapters/sqlite-wasm.js +3 -3
  25. package/dist/{backup-IQE4QC7Q.js → backup-5S7K2Z35.js} +3 -3
  26. package/dist/chunk-3Y2IERBF.js +255 -0
  27. package/dist/chunk-3Y2IERBF.js.map +1 -0
  28. package/dist/{chunk-IOEFNHHP.js → chunk-COJSQBXW.js} +2 -2
  29. package/dist/{chunk-RCTG3IJG.js → chunk-CYO3YKFL.js} +2 -2
  30. package/dist/{chunk-6NKLDBTY.js → chunk-GSJ7EEUC.js} +2 -1
  31. package/dist/chunk-GSJ7EEUC.js.map +1 -0
  32. package/dist/{chunk-OCOGQRHW.js → chunk-HS6DBMST.js} +2 -2
  33. package/dist/{chunk-QUJGXSZ6.js → chunk-Q57CHIIN.js} +154 -37
  34. package/dist/chunk-Q57CHIIN.js.map +1 -0
  35. package/dist/{chunk-2VRPF25R.js → chunk-RL43UYQZ.js} +3 -3
  36. package/dist/{chunk-QL2XVZRN.js → chunk-TUR7RGEP.js} +12 -1
  37. package/dist/{chunk-QL2XVZRN.js.map → chunk-TUR7RGEP.js.map} +1 -1
  38. package/dist/{export-audit-MT2LTMIN.js → export-audit-ODGQTQIK.js} +3 -3
  39. package/dist/index.cjs +132 -3
  40. package/dist/index.cjs.map +1 -1
  41. package/dist/index.d.cts +37 -5
  42. package/dist/index.d.ts +37 -5
  43. package/dist/index.js +131 -12
  44. package/dist/index.js.map +1 -1
  45. package/dist/internal.cjs +1 -0
  46. package/dist/internal.cjs.map +1 -1
  47. package/dist/internal.d.cts +3 -3
  48. package/dist/internal.d.ts +3 -3
  49. package/dist/internal.js +3 -3
  50. package/dist/{sqlite-wasm-channel-DUDPclTE.d.cts → sqlite-wasm-channel-Bx57s8Cq.d.cts} +1 -1
  51. package/dist/{sqlite-wasm-channel-DUDPclTE.d.ts → sqlite-wasm-channel-Bx57s8Cq.d.ts} +1 -1
  52. package/dist/sqlite-wasm-channel-NGSBJR44.js +12 -0
  53. package/dist/{types-5h4Hqcwc.d.ts → types-C1kigrWz.d.ts} +1 -1
  54. package/dist/{types-k6AZgiH4.d.ts → types-D1MzKVmk.d.cts} +10 -0
  55. package/dist/{types-k6AZgiH4.d.cts → types-D1MzKVmk.d.ts} +10 -0
  56. package/dist/{types-DfPiPwKr.d.cts → types-DAo9oduO.d.cts} +1 -1
  57. package/package.json +2 -2
  58. package/dist/chunk-6NKLDBTY.js.map +0 -1
  59. package/dist/chunk-QUJGXSZ6.js.map +0 -1
  60. package/dist/sqlite-wasm-channel-H43KEZLM.js +0 -12
  61. /package/dist/{backup-IQE4QC7Q.js.map → backup-5S7K2Z35.js.map} +0 -0
  62. /package/dist/{chunk-IOEFNHHP.js.map → chunk-COJSQBXW.js.map} +0 -0
  63. /package/dist/{chunk-RCTG3IJG.js.map → chunk-CYO3YKFL.js.map} +0 -0
  64. /package/dist/{chunk-OCOGQRHW.js.map → chunk-HS6DBMST.js.map} +0 -0
  65. /package/dist/{chunk-2VRPF25R.js.map → chunk-RL43UYQZ.js.map} +0 -0
  66. /package/dist/{export-audit-MT2LTMIN.js.map → export-audit-ODGQTQIK.js.map} +0 -0
  67. /package/dist/{sqlite-wasm-channel-H43KEZLM.js.map → sqlite-wasm-channel-NGSBJR44.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-k6AZgiH4.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-k6AZgiH4.cjs';
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-DfPiPwKr.cjs';
6
- export { C as Collection } from './types-DfPiPwKr.cjs';
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';
@@ -71,6 +71,15 @@ declare class WorkerInitError extends KoraError {
71
71
  declare class WorkerTimeoutError extends KoraError {
72
72
  constructor(operation: string, timeoutMs: number);
73
73
  }
74
+ /**
75
+ * Thrown when a follower tab cannot reach a live leader tab over the multi-tab
76
+ * broadcast channel (the leader tab was closed, crashed, or is unresponsive).
77
+ * Distinct from {@link WorkerTimeoutError}: this fails fast on a confirmed-absent
78
+ * leader instead of waiting out the full RPC timeout.
79
+ */
80
+ declare class NoLeaderError extends KoraError {
81
+ constructor(operation: string);
82
+ }
74
83
  /**
75
84
  * Thrown when IndexedDB persistence operations fail (serialize/deserialize).
76
85
  */
@@ -849,6 +858,23 @@ declare class Store implements OperationLog {
849
858
  * Persist or clear the delta cursor for paginated initial sync resume.
850
859
  */
851
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>;
852
878
  /**
853
879
  * Local operations not yet reflected on the server version vector.
854
880
  */
@@ -883,6 +909,12 @@ declare class Store implements OperationLog {
883
909
  * Latest operation for a record from any node (for 3-way merge when local op log is empty).
884
910
  */
885
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[]>;
886
918
  /** Expose the subscription manager for direct access (e.g., by QueryBuilder) */
887
919
  getSubscriptionManager(): SubscriptionManager;
888
920
  /**
@@ -1748,4 +1780,4 @@ declare function createChunkPortPair(): {
1748
1780
  b: ChunkMessagePort;
1749
1781
  };
1750
1782
 
1751
- export { AdapterError, ApplyRemoteOptions, type AuditExportManifest, type AuditExportOptions, type AuditExportPayload, type AuditExportProgress, type AuditTraceQuery, type BackupManifest, type BackupOptions, type BackupProgress, type BlobGcOptions, type BlobGcResult, type BlobManifest, type BlobManifestMetadata, COMPACTION_BASELINE_META_KEY, type ChunkMessage, type ChunkMessagePort, type ChunkProvider, type ChunkRequestMessage, type ChunkResponseMessage, type ClockRebaseResult, type CollectionAccessor, CollectionRecord, type CompactionResult, type CompactionStrategy, ContentAddressedBlobStore, type CreateRichTextControllerOptions, DEFAULT_CHUNK_SIZE, InvalidStateTransitionError, LAST_ACKED_SERVER_VECTOR_META_KEY, LocalMutationHandler, MaterializedRowSnapshot, MemoryBlobStore, type OpfsBlobDirectory, OpfsBlobStore, OptimisticLockError, OrderByDirection, type PersistedAuditTrace, PersistenceError, QueryBuilder, QueryDescriptor, QueryError, QueryStore, QueryStoreCache, type ReceiveBlobResult, type ReceiveBlobStores, RecordNotFoundError, type RemoteChunkProvider, type ReplaySnapshot, type RestoreOptions, type RestoreResult, type RichTextAwarenessUser, type RichTextController, type RichTextControllerSnapshot, type RichTextCursorInfo, type RichTextSyncEngine, RowVersionState, SequenceManager, type ServerBlobCallbacks, StorageAdapter, Store, StoreConfig, StoreNotOpenError, SubscriptionBloomFilter, SubscriptionCallback, SubscriptionManager, type SubscriptionManagerOptions, type SubscriptionStats, type TransactionCollectionAccessor, TransactionContext, type TransactionContextConfig, WhereClause, WorkerInitError, WorkerTimeoutError, asRichTextSyncEngine, assertQueryReady, chunkBlob, collectBlobGarbage, collectOperationsAheadOfServer, compactOperationLog, computeAckCompactionWatermark, createChunkPortPair, createMemoryServerBlobStore, createOpfsBlobDirectory, createOpfsBlobStore, createRemoteChunkProvider, createRichTextController, decodeAuditExport, decodeRichtext, deserializeVersionVectorFromMeta, encodeRichtext, exportBackup, extractBlobRefs, fetchBlobManifest, getSharedQueryStoreCache, mergeVersionVectors, parseBlobManifest, persistedAuditTraceFromEvent, pluralize, prepareBlobForSend, putBlobForTransfer, readAuditExportManifest, readBackupManifest, reassembleBlob, receiveBlob, resolveBlobManifest, restoreBackup, richtextStatesEqual, richtextToPlainText, serializeBlobManifest, serializeVersionVectorToMeta, serveBlobChunks, singularize, toServerBlobCallbacks, validateStateTransition, validateUpdateStateMachine, verifyAuditExportChecksum, verifyBackupChecksum };
1783
+ export { AdapterError, ApplyRemoteOptions, type AuditExportManifest, type AuditExportOptions, type AuditExportPayload, type AuditExportProgress, type AuditTraceQuery, type BackupManifest, type BackupOptions, type BackupProgress, type BlobGcOptions, type BlobGcResult, type BlobManifest, type BlobManifestMetadata, COMPACTION_BASELINE_META_KEY, type ChunkMessage, type ChunkMessagePort, type ChunkProvider, type ChunkRequestMessage, type ChunkResponseMessage, type ClockRebaseResult, type CollectionAccessor, CollectionRecord, type CompactionResult, type CompactionStrategy, ContentAddressedBlobStore, type CreateRichTextControllerOptions, DEFAULT_CHUNK_SIZE, InvalidStateTransitionError, LAST_ACKED_SERVER_VECTOR_META_KEY, LocalMutationHandler, MaterializedRowSnapshot, MemoryBlobStore, NoLeaderError, type OpfsBlobDirectory, OpfsBlobStore, OptimisticLockError, OrderByDirection, type PersistedAuditTrace, PersistenceError, QueryBuilder, QueryDescriptor, QueryError, QueryStore, QueryStoreCache, type ReceiveBlobResult, type ReceiveBlobStores, RecordNotFoundError, type RemoteChunkProvider, type ReplaySnapshot, type RestoreOptions, type RestoreResult, type RichTextAwarenessUser, type RichTextController, type RichTextControllerSnapshot, type RichTextCursorInfo, type RichTextSyncEngine, RowVersionState, SequenceManager, type ServerBlobCallbacks, StorageAdapter, Store, StoreConfig, StoreNotOpenError, SubscriptionBloomFilter, SubscriptionCallback, SubscriptionManager, type SubscriptionManagerOptions, type SubscriptionStats, type TransactionCollectionAccessor, TransactionContext, type TransactionContextConfig, WhereClause, WorkerInitError, WorkerTimeoutError, asRichTextSyncEngine, assertQueryReady, chunkBlob, collectBlobGarbage, collectOperationsAheadOfServer, compactOperationLog, computeAckCompactionWatermark, createChunkPortPair, createMemoryServerBlobStore, createOpfsBlobDirectory, createOpfsBlobStore, createRemoteChunkProvider, createRichTextController, decodeAuditExport, decodeRichtext, deserializeVersionVectorFromMeta, encodeRichtext, exportBackup, extractBlobRefs, fetchBlobManifest, getSharedQueryStoreCache, mergeVersionVectors, parseBlobManifest, persistedAuditTraceFromEvent, pluralize, prepareBlobForSend, putBlobForTransfer, readAuditExportManifest, readBackupManifest, reassembleBlob, receiveBlob, resolveBlobManifest, restoreBackup, richtextStatesEqual, richtextToPlainText, serializeBlobManifest, serializeVersionVectorToMeta, serveBlobChunks, singularize, toServerBlobCallbacks, validateStateTransition, validateUpdateStateMachine, verifyAuditExportChecksum, verifyBackupChecksum };
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-k6AZgiH4.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-k6AZgiH4.js';
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-5h4Hqcwc.js';
6
- export { C as Collection } from './types-5h4Hqcwc.js';
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';
@@ -71,6 +71,15 @@ declare class WorkerInitError extends KoraError {
71
71
  declare class WorkerTimeoutError extends KoraError {
72
72
  constructor(operation: string, timeoutMs: number);
73
73
  }
74
+ /**
75
+ * Thrown when a follower tab cannot reach a live leader tab over the multi-tab
76
+ * broadcast channel (the leader tab was closed, crashed, or is unresponsive).
77
+ * Distinct from {@link WorkerTimeoutError}: this fails fast on a confirmed-absent
78
+ * leader instead of waiting out the full RPC timeout.
79
+ */
80
+ declare class NoLeaderError extends KoraError {
81
+ constructor(operation: string);
82
+ }
74
83
  /**
75
84
  * Thrown when IndexedDB persistence operations fail (serialize/deserialize).
76
85
  */
@@ -849,6 +858,23 @@ declare class Store implements OperationLog {
849
858
  * Persist or clear the delta cursor for paginated initial sync resume.
850
859
  */
851
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>;
852
878
  /**
853
879
  * Local operations not yet reflected on the server version vector.
854
880
  */
@@ -883,6 +909,12 @@ declare class Store implements OperationLog {
883
909
  * Latest operation for a record from any node (for 3-way merge when local op log is empty).
884
910
  */
885
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[]>;
886
918
  /** Expose the subscription manager for direct access (e.g., by QueryBuilder) */
887
919
  getSubscriptionManager(): SubscriptionManager;
888
920
  /**
@@ -1748,4 +1780,4 @@ declare function createChunkPortPair(): {
1748
1780
  b: ChunkMessagePort;
1749
1781
  };
1750
1782
 
1751
- export { AdapterError, ApplyRemoteOptions, type AuditExportManifest, type AuditExportOptions, type AuditExportPayload, type AuditExportProgress, type AuditTraceQuery, type BackupManifest, type BackupOptions, type BackupProgress, type BlobGcOptions, type BlobGcResult, type BlobManifest, type BlobManifestMetadata, COMPACTION_BASELINE_META_KEY, type ChunkMessage, type ChunkMessagePort, type ChunkProvider, type ChunkRequestMessage, type ChunkResponseMessage, type ClockRebaseResult, type CollectionAccessor, CollectionRecord, type CompactionResult, type CompactionStrategy, ContentAddressedBlobStore, type CreateRichTextControllerOptions, DEFAULT_CHUNK_SIZE, InvalidStateTransitionError, LAST_ACKED_SERVER_VECTOR_META_KEY, LocalMutationHandler, MaterializedRowSnapshot, MemoryBlobStore, type OpfsBlobDirectory, OpfsBlobStore, OptimisticLockError, OrderByDirection, type PersistedAuditTrace, PersistenceError, QueryBuilder, QueryDescriptor, QueryError, QueryStore, QueryStoreCache, type ReceiveBlobResult, type ReceiveBlobStores, RecordNotFoundError, type RemoteChunkProvider, type ReplaySnapshot, type RestoreOptions, type RestoreResult, type RichTextAwarenessUser, type RichTextController, type RichTextControllerSnapshot, type RichTextCursorInfo, type RichTextSyncEngine, RowVersionState, SequenceManager, type ServerBlobCallbacks, StorageAdapter, Store, StoreConfig, StoreNotOpenError, SubscriptionBloomFilter, SubscriptionCallback, SubscriptionManager, type SubscriptionManagerOptions, type SubscriptionStats, type TransactionCollectionAccessor, TransactionContext, type TransactionContextConfig, WhereClause, WorkerInitError, WorkerTimeoutError, asRichTextSyncEngine, assertQueryReady, chunkBlob, collectBlobGarbage, collectOperationsAheadOfServer, compactOperationLog, computeAckCompactionWatermark, createChunkPortPair, createMemoryServerBlobStore, createOpfsBlobDirectory, createOpfsBlobStore, createRemoteChunkProvider, createRichTextController, decodeAuditExport, decodeRichtext, deserializeVersionVectorFromMeta, encodeRichtext, exportBackup, extractBlobRefs, fetchBlobManifest, getSharedQueryStoreCache, mergeVersionVectors, parseBlobManifest, persistedAuditTraceFromEvent, pluralize, prepareBlobForSend, putBlobForTransfer, readAuditExportManifest, readBackupManifest, reassembleBlob, receiveBlob, resolveBlobManifest, restoreBackup, richtextStatesEqual, richtextToPlainText, serializeBlobManifest, serializeVersionVectorToMeta, serveBlobChunks, singularize, toServerBlobCallbacks, validateStateTransition, validateUpdateStateMachine, verifyAuditExportChecksum, verifyBackupChecksum };
1783
+ export { AdapterError, ApplyRemoteOptions, type AuditExportManifest, type AuditExportOptions, type AuditExportPayload, type AuditExportProgress, type AuditTraceQuery, type BackupManifest, type BackupOptions, type BackupProgress, type BlobGcOptions, type BlobGcResult, type BlobManifest, type BlobManifestMetadata, COMPACTION_BASELINE_META_KEY, type ChunkMessage, type ChunkMessagePort, type ChunkProvider, type ChunkRequestMessage, type ChunkResponseMessage, type ClockRebaseResult, type CollectionAccessor, CollectionRecord, type CompactionResult, type CompactionStrategy, ContentAddressedBlobStore, type CreateRichTextControllerOptions, DEFAULT_CHUNK_SIZE, InvalidStateTransitionError, LAST_ACKED_SERVER_VECTOR_META_KEY, LocalMutationHandler, MaterializedRowSnapshot, MemoryBlobStore, NoLeaderError, type OpfsBlobDirectory, OpfsBlobStore, OptimisticLockError, OrderByDirection, type PersistedAuditTrace, PersistenceError, QueryBuilder, QueryDescriptor, QueryError, QueryStore, QueryStoreCache, type ReceiveBlobResult, type ReceiveBlobStores, RecordNotFoundError, type RemoteChunkProvider, type ReplaySnapshot, type RestoreOptions, type RestoreResult, type RichTextAwarenessUser, type RichTextController, type RichTextControllerSnapshot, type RichTextCursorInfo, type RichTextSyncEngine, RowVersionState, SequenceManager, type ServerBlobCallbacks, StorageAdapter, Store, StoreConfig, StoreNotOpenError, SubscriptionBloomFilter, SubscriptionCallback, SubscriptionManager, type SubscriptionManagerOptions, type SubscriptionStats, type TransactionCollectionAccessor, TransactionContext, type TransactionContextConfig, WhereClause, WorkerInitError, WorkerTimeoutError, asRichTextSyncEngine, assertQueryReady, chunkBlob, collectBlobGarbage, collectOperationsAheadOfServer, compactOperationLog, computeAckCompactionWatermark, createChunkPortPair, createMemoryServerBlobStore, createOpfsBlobDirectory, createOpfsBlobStore, createRemoteChunkProvider, createRichTextController, decodeAuditExport, decodeRichtext, deserializeVersionVectorFromMeta, encodeRichtext, exportBackup, extractBlobRefs, fetchBlobManifest, getSharedQueryStoreCache, mergeVersionVectors, parseBlobManifest, persistedAuditTraceFromEvent, pluralize, prepareBlobForSend, putBlobForTransfer, readAuditExportManifest, readBackupManifest, reassembleBlob, receiveBlob, resolveBlobManifest, restoreBackup, richtextStatesEqual, richtextToPlainText, serializeBlobManifest, serializeVersionVectorToMeta, serveBlobChunks, singularize, toServerBlobCallbacks, validateStateTransition, validateUpdateStateMachine, verifyAuditExportChecksum, verifyBackupChecksum };
package/dist/index.js CHANGED
@@ -3,12 +3,12 @@ import {
3
3
  readBackupManifest,
4
4
  restoreBackup,
5
5
  verifyBackupChecksum
6
- } from "./chunk-OCOGQRHW.js";
6
+ } from "./chunk-HS6DBMST.js";
7
7
  import {
8
8
  decodeAuditExport,
9
9
  readAuditExportManifest,
10
10
  verifyAuditExportChecksum
11
- } from "./chunk-RCTG3IJG.js";
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-2VRPF25R.js";
42
+ } from "./chunk-RL43UYQZ.js";
43
43
  import {
44
44
  decodeRichtext,
45
45
  decodeRichtextFieldsFromOpData,
@@ -51,9 +51,10 @@ import {
51
51
  richtextToPlainText,
52
52
  serializeOperation,
53
53
  serializeRecord
54
- } from "./chunk-6NKLDBTY.js";
54
+ } from "./chunk-GSJ7EEUC.js";
55
55
  import {
56
56
  AdapterError,
57
+ NoLeaderError,
57
58
  OptimisticLockError,
58
59
  PersistenceError,
59
60
  QueryError,
@@ -61,7 +62,7 @@ import {
61
62
  StoreNotOpenError,
62
63
  WorkerInitError,
63
64
  WorkerTimeoutError
64
- } from "./chunk-QL2XVZRN.js";
65
+ } from "./chunk-TUR7RGEP.js";
65
66
 
66
67
  // src/compaction/types.ts
67
68
  var COMPACTION_BASELINE_META_KEY = "compaction_baseline_at";
@@ -130,6 +131,7 @@ function buildDeleteSql(table, withAge) {
130
131
  import { createVersionVector as createVersionVector2 } from "@korajs/core";
131
132
  var LAST_ACKED_SERVER_VECTOR_META_KEY = "last_acked_server_vector";
132
133
  var DELTA_CURSOR_META_KEY = "delta_cursor";
134
+ var DELIVERY_WATERMARK_META_KEY = "delivery_watermark";
133
135
  function serializeVersionVectorToMeta(vector) {
134
136
  const record = {};
135
137
  for (const [nodeId, seq] of vector) {
@@ -202,6 +204,45 @@ async function saveDeltaCursor(adapter, cursor) {
202
204
  cursor
203
205
  ]);
204
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
+ }
205
246
 
206
247
  // src/store/store.ts
207
248
  import {
@@ -210,7 +251,8 @@ import {
210
251
  createVersionVector as createVersionVector3,
211
252
  generateUUIDv7 as generateUUIDv73,
212
253
  migrationStepsToSQL,
213
- quoteIdent as quoteIdent7
254
+ quoteIdent as quoteIdent7,
255
+ replayOperationsForRecord
214
256
  } from "@korajs/core";
215
257
 
216
258
  // src/collection/collection.ts
@@ -2195,7 +2237,8 @@ var Store = class {
2195
2237
  throw new OptimisticLockError(collection, op.recordId);
2196
2238
  }
2197
2239
  };
2198
- if (op.type === "insert" && materializeSource) {
2240
+ if (options?.logOnly) {
2241
+ } else if (op.type === "insert" && materializeSource) {
2199
2242
  const serializedData = serializeRecord(materializeSource, definition.fields);
2200
2243
  const existing2 = await tx.query(
2201
2244
  `SELECT _updated_at, _version, _field_versions, _deleted FROM ${collection} WHERE id = ?`,
@@ -2217,7 +2260,7 @@ var Store = class {
2217
2260
  };
2218
2261
  const insertQuery = buildInsertQuery(collection, record);
2219
2262
  await tx.execute(insertQuery.sql, insertQuery.params);
2220
- await this.foldOrphanedOperations(tx, collection, definition, op.recordId);
2263
+ await this.foldOrphanedOperations(tx, collection, definition, op.recordId, op);
2221
2264
  } else if (row._deleted === 1) {
2222
2265
  if (isIncomingNewerThanRow(materializeTimestamp, row)) {
2223
2266
  const fieldChanges = {
@@ -2369,7 +2412,7 @@ var Store = class {
2369
2412
  * necessarily an orphan (rows are soft-deleted, never removed, so a row
2370
2413
  * that is absent now was never materialized).
2371
2414
  */
2372
- async foldOrphanedOperations(tx, collection, definition, recordId) {
2415
+ async foldOrphanedOperations(tx, collection, definition, recordId, insertOp) {
2373
2416
  const orphanRows = await tx.query(
2374
2417
  `SELECT * FROM ${quoteIdent7(`_kora_ops_${collection}`)} WHERE record_id = ? AND type IN ('update', 'delete')`,
2375
2418
  [recordId]
@@ -2418,6 +2461,37 @@ var Store = class {
2418
2461
  await tx.execute(query.sql, query.params);
2419
2462
  }
2420
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
+ }
2421
2495
  }
2422
2496
  /**
2423
2497
  * Get operations from a node within a sequence number range.
@@ -2504,7 +2578,7 @@ var Store = class {
2504
2578
  */
2505
2579
  async exportAudit(options) {
2506
2580
  this.ensureOpen();
2507
- const { exportAudit: doExport } = await import("./export-audit-MT2LTMIN.js");
2581
+ const { exportAudit: doExport } = await import("./export-audit-ODGQTQIK.js");
2508
2582
  return doExport(this.adapter, this.schema, this.nodeId, this.schema.version, options);
2509
2583
  }
2510
2584
  /**
@@ -2631,6 +2705,35 @@ var Store = class {
2631
2705
  this.ensureOpen();
2632
2706
  await saveDeltaCursor(this.adapter, cursor);
2633
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
+ }
2634
2737
  /**
2635
2738
  * Local operations not yet reflected on the server version vector.
2636
2739
  */
@@ -2721,6 +2824,21 @@ var Store = class {
2721
2824
  }
2722
2825
  return latest;
2723
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
+ }
2724
2842
  /** Expose the subscription manager for direct access (e.g., by QueryBuilder) */
2725
2843
  getSubscriptionManager() {
2726
2844
  return this.subscriptionManager;
@@ -2799,7 +2917,7 @@ var Store = class {
2799
2917
  */
2800
2918
  async exportBackup(options) {
2801
2919
  this.ensureOpen();
2802
- const { exportBackup: doExport } = await import("./backup-IQE4QC7Q.js");
2920
+ const { exportBackup: doExport } = await import("./backup-5S7K2Z35.js");
2803
2921
  return doExport(this.adapter, this.schema, this.nodeId, this.schema.version, options);
2804
2922
  }
2805
2923
  /**
@@ -2811,7 +2929,7 @@ var Store = class {
2811
2929
  */
2812
2930
  async importBackup(data, options) {
2813
2931
  this.ensureOpen();
2814
- const { restoreBackup: doRestore } = await import("./backup-IQE4QC7Q.js");
2932
+ const { restoreBackup: doRestore } = await import("./backup-5S7K2Z35.js");
2815
2933
  return doRestore(this.adapter, this.schema, data, options);
2816
2934
  }
2817
2935
  /**
@@ -3952,6 +4070,7 @@ export {
3952
4070
  InvalidStateTransitionError,
3953
4071
  LAST_ACKED_SERVER_VECTOR_META_KEY,
3954
4072
  MemoryBlobStore,
4073
+ NoLeaderError,
3955
4074
  OpfsBlobStore,
3956
4075
  OptimisticLockError,
3957
4076
  PersistenceError,