fix(replication): publish pending counts and reflection failures

This commit is contained in:
Artem Ovchinnikov committed 2026-10-21 21:25:16 +03:00
1 parent c7d59c78d9
commit bca2f2dcc6
4 files changed
+45 -1

No files matched your search

@@ -58,6 +58,7 @@ type ReplicateResultProcessorServices = Pick<
* database would be invalid.
*/
interface ReplicateResultProcessorContext {
readonly onVaultReflectionFailure?: () => void;
readonly currentSettings: () => ReplicateResultProcessorSettings;
readonly getKeyValueDB: () => LiveSyncBaseCore["kvDB"];
readonly getLocalDatabase: () => LiveSyncBaseCore["localDatabase"];
@@ -87,6 +88,7 @@ export class ReplicateResultProcessor {
Logger(e, LOG_LEVEL_VERBOSE);
}
private reportVaultReflectionFailure(entry: MetaEntry, cause?: unknown) {
this.context.onVaultReflectionFailure?.();
this.log(
`Live replication could not reflect ${this.getPath(entry)} from the local database to the Vault; this path remains eligible for a later Vault scan.`,
LOG_LEVEL_VERBOSE
@@ -383,6 +385,7 @@ export class ReplicateResultProcessor {
}
// Enqueue the change
this._queuedChanges.push(doc);
this.reportStatus();
this.updateProcessingActivity();
this.triggerTakeSnapshot();
this.triggerProcessQueue();
@@ -491,6 +494,9 @@ export class ReplicateResultProcessor {
} finally {
// Remove from processing queue
this._processingChanges = this._processingChanges.filter((e) => e !== change);
// Queue visibility must not wait for persisting a recovery snapshot. Consumers
// use this count to decide whether the reflected Vault is ready for interaction.
this.reportStatus();
try {
if (this._queuedChanges.length === 0 && this._processingChanges.length === 0) {
try {
@@ -548,6 +554,7 @@ export class ReplicateResultProcessor {
: await this.localDatabase.getDBEntryFromMeta({ ...dbDoc }, false, true);
if (!doc) {
// Failed to gather content
this.context.onVaultReflectionFailure?.();
this.log(`Failed to gather content of ${docNote}`, LOG_LEVEL_NOTICE);
return;
}