cry-synced-db-client 0.1.171 → 0.1.172
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/index.js +142 -116
- package/dist/src/utils/computeDiff.d.ts +9 -3
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -600,6 +600,17 @@ function canExpandArrayToBrackets(value) {
|
|
|
600
600
|
}
|
|
601
601
|
return true;
|
|
602
602
|
}
|
|
603
|
+
function pickLayerTarget(newPath, newValue) {
|
|
604
|
+
if (!isTerminalBracketKey(newPath)) return null;
|
|
605
|
+
if (newValue === void 0) return null;
|
|
606
|
+
if (Array.isArray(newValue) && newValue.length === 1 && newValue[0] && typeof newValue[0] === "object") {
|
|
607
|
+
return newValue[0];
|
|
608
|
+
}
|
|
609
|
+
if (newValue && typeof newValue === "object" && !Array.isArray(newValue)) {
|
|
610
|
+
return newValue;
|
|
611
|
+
}
|
|
612
|
+
return null;
|
|
613
|
+
}
|
|
603
614
|
function mergeDirtyPath(accumulated, newPath, newValue) {
|
|
604
615
|
for (const existingKey of Object.keys(accumulated)) {
|
|
605
616
|
if (existingKey === newPath) continue;
|
|
@@ -628,14 +639,27 @@ function mergeDirtyPath(accumulated, newPath, newValue) {
|
|
|
628
639
|
break;
|
|
629
640
|
}
|
|
630
641
|
}
|
|
631
|
-
const
|
|
642
|
+
const descendants = [];
|
|
632
643
|
for (const existingKey of Object.keys(accumulated)) {
|
|
633
644
|
if (existingKey === newPath) continue;
|
|
634
645
|
if (isDescendantOrEqual(existingKey, newPath)) {
|
|
635
|
-
|
|
646
|
+
descendants.push(existingKey);
|
|
647
|
+
}
|
|
648
|
+
}
|
|
649
|
+
const layerInto = pickLayerTarget(newPath, newValue);
|
|
650
|
+
if (layerInto && descendants.length > 0) {
|
|
651
|
+
for (const desc of descendants) {
|
|
652
|
+
const sepChar = desc[newPath.length];
|
|
653
|
+
const relativePath = sepChar === "[" ? desc.substring(newPath.length) : desc.substring(newPath.length + 1);
|
|
654
|
+
const descValue = accumulated[desc];
|
|
655
|
+
if (descValue === void 0) {
|
|
656
|
+
deleteByPath(layerInto, relativePath);
|
|
657
|
+
} else {
|
|
658
|
+
setByPath(layerInto, relativePath, descValue);
|
|
659
|
+
}
|
|
636
660
|
}
|
|
637
661
|
}
|
|
638
|
-
for (const k of
|
|
662
|
+
for (const k of descendants) delete accumulated[k];
|
|
639
663
|
accumulated[newPath] = newValue;
|
|
640
664
|
}
|
|
641
665
|
function mergeDirtyChanges(accumulated, newChanges) {
|
|
@@ -722,14 +746,14 @@ var InMemManager = class {
|
|
|
722
746
|
try {
|
|
723
747
|
metadatas = config.onObjectsUpdated(items);
|
|
724
748
|
} catch (err) {
|
|
725
|
-
console.error("onObjectsUpdated callback failed:", err);
|
|
749
|
+
console.error("[InMem] onObjectsUpdated callback failed:", err);
|
|
726
750
|
return;
|
|
727
751
|
}
|
|
728
752
|
} else if (config.onObjectUpdated) {
|
|
729
753
|
try {
|
|
730
754
|
metadatas = items.map((item) => config.onObjectUpdated(item));
|
|
731
755
|
} catch (err) {
|
|
732
|
-
console.error("onObjectUpdated callback failed:", err);
|
|
756
|
+
console.error("[InMem] onObjectUpdated callback failed:", err);
|
|
733
757
|
return;
|
|
734
758
|
}
|
|
735
759
|
} else {
|
|
@@ -762,14 +786,14 @@ var InMemManager = class {
|
|
|
762
786
|
try {
|
|
763
787
|
metadatas = config.onObjectsUpdated(items);
|
|
764
788
|
} catch (err) {
|
|
765
|
-
console.error("onObjectsUpdated callback failed:", err);
|
|
789
|
+
console.error("[InMem] onObjectsUpdated callback failed:", err);
|
|
766
790
|
return;
|
|
767
791
|
}
|
|
768
792
|
} else if (config.onObjectUpdated) {
|
|
769
793
|
try {
|
|
770
794
|
metadatas = items.map((item) => config.onObjectUpdated(item));
|
|
771
795
|
} catch (err) {
|
|
772
|
-
console.error("onObjectUpdated callback failed:", err);
|
|
796
|
+
console.error("[InMem] onObjectUpdated callback failed:", err);
|
|
773
797
|
return;
|
|
774
798
|
}
|
|
775
799
|
} else {
|
|
@@ -1035,7 +1059,7 @@ var LeaderElectionManager = class {
|
|
|
1035
1059
|
try {
|
|
1036
1060
|
this.leaderReelectionChannel.postMessage({ type: "reelect-leader" });
|
|
1037
1061
|
} catch (err) {
|
|
1038
|
-
console.error("Failed to broadcast leader reelection:", err);
|
|
1062
|
+
console.error("[LeaderElection] Failed to broadcast leader reelection:", err);
|
|
1039
1063
|
}
|
|
1040
1064
|
}
|
|
1041
1065
|
}
|
|
@@ -1046,7 +1070,7 @@ var LeaderElectionManager = class {
|
|
|
1046
1070
|
try {
|
|
1047
1071
|
this.callbacks.onBecameLeader();
|
|
1048
1072
|
} catch (err) {
|
|
1049
|
-
console.error("onBecameLeader callback failed:", err);
|
|
1073
|
+
console.error("[LeaderElection] onBecameLeader callback failed:", err);
|
|
1050
1074
|
}
|
|
1051
1075
|
}
|
|
1052
1076
|
}
|
|
@@ -1057,7 +1081,7 @@ var LeaderElectionManager = class {
|
|
|
1057
1081
|
try {
|
|
1058
1082
|
this.callbacks.onLostLeadership();
|
|
1059
1083
|
} catch (err) {
|
|
1060
|
-
console.error("onLostLeadership callback failed:", err);
|
|
1084
|
+
console.error("[LeaderElection] onLostLeadership callback failed:", err);
|
|
1061
1085
|
}
|
|
1062
1086
|
}
|
|
1063
1087
|
}
|
|
@@ -1066,7 +1090,7 @@ var LeaderElectionManager = class {
|
|
|
1066
1090
|
try {
|
|
1067
1091
|
this.callbacks.onInfrastructureError(type, message, error);
|
|
1068
1092
|
} catch (err) {
|
|
1069
|
-
console.error("onInfrastructureError callback failed:", err);
|
|
1093
|
+
console.error("[LeaderElection] onInfrastructureError callback failed:", err);
|
|
1070
1094
|
}
|
|
1071
1095
|
}
|
|
1072
1096
|
}
|
|
@@ -1191,7 +1215,7 @@ var CrossTabSyncManager = class {
|
|
|
1191
1215
|
try {
|
|
1192
1216
|
this.metaUpdateChannel.postMessage(payload);
|
|
1193
1217
|
} catch (err) {
|
|
1194
|
-
console.error("Failed to broadcast meta update:", err);
|
|
1218
|
+
console.error("[CrossTabSync] Failed to broadcast meta update:", err);
|
|
1195
1219
|
}
|
|
1196
1220
|
}
|
|
1197
1221
|
this.pendingBroadcasts.clear();
|
|
@@ -1237,7 +1261,7 @@ var CrossTabSyncManager = class {
|
|
|
1237
1261
|
try {
|
|
1238
1262
|
await this.deps.reloadCollectionFromDexie(collection);
|
|
1239
1263
|
} catch (err) {
|
|
1240
|
-
console.error(`Error reloading collection ${collection} from Dexie:`, err);
|
|
1264
|
+
console.error(`[CrossTabSync] Error reloading collection ${collection} from Dexie:`, err);
|
|
1241
1265
|
}
|
|
1242
1266
|
}
|
|
1243
1267
|
}
|
|
@@ -1285,11 +1309,11 @@ var CrossTabSyncManager = class {
|
|
|
1285
1309
|
};
|
|
1286
1310
|
this.callbacks.onCrossTabSync(info);
|
|
1287
1311
|
} catch (err) {
|
|
1288
|
-
console.error("onCrossTabSync callback failed:", err);
|
|
1312
|
+
console.error("[CrossTabSync] onCrossTabSync callback failed:", err);
|
|
1289
1313
|
}
|
|
1290
1314
|
}
|
|
1291
1315
|
} catch (err) {
|
|
1292
|
-
console.error(`Error handling cross-tab delta update for ${collection}:`, err);
|
|
1316
|
+
console.error(`[CrossTabSync] Error handling cross-tab delta update for ${collection}:`, err);
|
|
1293
1317
|
}
|
|
1294
1318
|
}
|
|
1295
1319
|
}
|
|
@@ -1305,7 +1329,7 @@ var CrossTabSyncManager = class {
|
|
|
1305
1329
|
try {
|
|
1306
1330
|
this.metaUpdateChannel.postMessage(payload);
|
|
1307
1331
|
} catch (err) {
|
|
1308
|
-
console.error("Failed to broadcast reload:", err);
|
|
1332
|
+
console.error("[CrossTabSync] Failed to broadcast reload:", err);
|
|
1309
1333
|
}
|
|
1310
1334
|
}
|
|
1311
1335
|
callOnInfrastructureError(type, message, error) {
|
|
@@ -1313,7 +1337,7 @@ var CrossTabSyncManager = class {
|
|
|
1313
1337
|
try {
|
|
1314
1338
|
this.callbacks.onInfrastructureError(type, message, error);
|
|
1315
1339
|
} catch (err) {
|
|
1316
|
-
console.error("onInfrastructureError callback failed:", err);
|
|
1340
|
+
console.error("[CrossTabSync] onInfrastructureError callback failed:", err);
|
|
1317
1341
|
}
|
|
1318
1342
|
}
|
|
1319
1343
|
}
|
|
@@ -1379,7 +1403,7 @@ var ConnectionManager = class {
|
|
|
1379
1403
|
} else {
|
|
1380
1404
|
this.deps.tryBecomeLeader();
|
|
1381
1405
|
this.tryGoOnline().catch((err) => {
|
|
1382
|
-
console.error("Failed to go online after forceOffline release:", err);
|
|
1406
|
+
console.error("[Connection] Failed to go online after forceOffline release:", err);
|
|
1383
1407
|
});
|
|
1384
1408
|
}
|
|
1385
1409
|
}
|
|
@@ -1403,13 +1427,13 @@ var ConnectionManager = class {
|
|
|
1403
1427
|
"ping"
|
|
1404
1428
|
);
|
|
1405
1429
|
} catch (err) {
|
|
1406
|
-
console.warn("tryGoOnline: ping failed:", err);
|
|
1430
|
+
console.warn("[Connection] tryGoOnline: ping failed:", err);
|
|
1407
1431
|
this.online = false;
|
|
1408
1432
|
return;
|
|
1409
1433
|
}
|
|
1410
1434
|
if (!pingResult) {
|
|
1411
1435
|
const url = (_a = this.restInterface.endpoint) != null ? _a : "unknown";
|
|
1412
|
-
console.warn(`Ping to ${url} failed - staying offline`);
|
|
1436
|
+
console.warn(`[Connection] Ping to ${url} failed - staying offline`);
|
|
1413
1437
|
return;
|
|
1414
1438
|
}
|
|
1415
1439
|
this.online = true;
|
|
@@ -1421,7 +1445,7 @@ var ConnectionManager = class {
|
|
|
1421
1445
|
try {
|
|
1422
1446
|
await this.deps.sync("INITIAL SYNC");
|
|
1423
1447
|
} catch (err) {
|
|
1424
|
-
console.warn("INITIAL SYNC after tryGoOnline failed (stays online):", err);
|
|
1448
|
+
console.warn("[Connection] INITIAL SYNC after tryGoOnline failed (stays online):", err);
|
|
1425
1449
|
}
|
|
1426
1450
|
} finally {
|
|
1427
1451
|
this.tryGoOnlineInFlight = false;
|
|
@@ -1437,7 +1461,7 @@ var ConnectionManager = class {
|
|
|
1437
1461
|
this.autoSyncTimer = setInterval(() => {
|
|
1438
1462
|
if (this.forcedOffline || !this.online) return;
|
|
1439
1463
|
this.deps.sync(`interval ${intervalMs}ms`).catch((err) => {
|
|
1440
|
-
console.error("Auto-sync failed:", err);
|
|
1464
|
+
console.error("[Connection] Auto-sync failed:", err);
|
|
1441
1465
|
});
|
|
1442
1466
|
}, intervalMs);
|
|
1443
1467
|
}
|
|
@@ -1446,7 +1470,7 @@ var ConnectionManager = class {
|
|
|
1446
1470
|
this.reconnectTimer = setInterval(() => {
|
|
1447
1471
|
if (this.forcedOffline || this.online || this.tryGoOnlineInFlight) return;
|
|
1448
1472
|
this.tryGoOnline().catch((err) => {
|
|
1449
|
-
console.error("Reconnect tryGoOnline failed:", err);
|
|
1473
|
+
console.error("[Connection] Reconnect tryGoOnline failed:", err);
|
|
1450
1474
|
});
|
|
1451
1475
|
}, retryMs);
|
|
1452
1476
|
}
|
|
@@ -1530,7 +1554,7 @@ var ConnectionManager = class {
|
|
|
1530
1554
|
try {
|
|
1531
1555
|
this.callbacks.onInfrastructureError(type, message, error);
|
|
1532
1556
|
} catch (err) {
|
|
1533
|
-
console.error("onInfrastructureError callback failed:", err);
|
|
1557
|
+
console.error("[Connection] onInfrastructureError callback failed:", err);
|
|
1534
1558
|
}
|
|
1535
1559
|
}
|
|
1536
1560
|
}
|
|
@@ -1543,7 +1567,7 @@ var ConnectionManager = class {
|
|
|
1543
1567
|
try {
|
|
1544
1568
|
this.callbacks.onSyncFailed(reason);
|
|
1545
1569
|
} catch (err) {
|
|
1546
|
-
console.error("onSyncFailed callback failed:", err);
|
|
1570
|
+
console.error("[Connection] onSyncFailed callback failed:", err);
|
|
1547
1571
|
}
|
|
1548
1572
|
}
|
|
1549
1573
|
}
|
|
@@ -1555,7 +1579,7 @@ var ConnectionManager = class {
|
|
|
1555
1579
|
try {
|
|
1556
1580
|
this.callbacks.onWsConnect();
|
|
1557
1581
|
} catch (err) {
|
|
1558
|
-
console.error("onWsConnect callback failed:", err);
|
|
1582
|
+
console.error("[Connection] onWsConnect callback failed:", err);
|
|
1559
1583
|
}
|
|
1560
1584
|
}
|
|
1561
1585
|
}
|
|
@@ -1567,7 +1591,7 @@ var ConnectionManager = class {
|
|
|
1567
1591
|
try {
|
|
1568
1592
|
this.callbacks.onWsDisconnect(reason);
|
|
1569
1593
|
} catch (err) {
|
|
1570
|
-
console.error("onWsDisconnect callback failed:", err);
|
|
1594
|
+
console.error("[Connection] onWsDisconnect callback failed:", err);
|
|
1571
1595
|
}
|
|
1572
1596
|
}
|
|
1573
1597
|
this.reportInfrastructureError(
|
|
@@ -1583,7 +1607,7 @@ var ConnectionManager = class {
|
|
|
1583
1607
|
try {
|
|
1584
1608
|
this.callbacks.onWsReconnect(attempt);
|
|
1585
1609
|
} catch (err) {
|
|
1586
|
-
console.error("onWsReconnect callback failed:", err);
|
|
1610
|
+
console.error("[Connection] onWsReconnect callback failed:", err);
|
|
1587
1611
|
}
|
|
1588
1612
|
}
|
|
1589
1613
|
}
|
|
@@ -2450,7 +2474,7 @@ function savePendingWrite(tenant, collection, id, delta) {
|
|
|
2450
2474
|
}
|
|
2451
2475
|
localStorage.setItem(key, dist_default.stringify(pending));
|
|
2452
2476
|
} catch (e) {
|
|
2453
|
-
console.warn("Failed to save pending write to localStorage");
|
|
2477
|
+
console.warn("[CrashRecovery] Failed to save pending write to localStorage");
|
|
2454
2478
|
}
|
|
2455
2479
|
}
|
|
2456
2480
|
function clearPendingWrite(tenant, collection, id) {
|
|
@@ -2632,7 +2656,7 @@ var PendingChangesManager = class {
|
|
|
2632
2656
|
clearPendingWrite(this.tenant, write.collection, write.id);
|
|
2633
2657
|
}
|
|
2634
2658
|
} catch (err) {
|
|
2635
|
-
console.error(`Failed to recover pending writes for ${collection}:`, err);
|
|
2659
|
+
console.error(`[PendingChanges] Failed to recover pending writes for ${collection}:`, err);
|
|
2636
2660
|
}
|
|
2637
2661
|
}
|
|
2638
2662
|
}
|
|
@@ -2682,7 +2706,7 @@ var PendingChangesManager = class {
|
|
|
2682
2706
|
calledFrom: pending.calledFrom
|
|
2683
2707
|
});
|
|
2684
2708
|
} catch (err) {
|
|
2685
|
-
console.error("onDexieWriteRequest callback failed:", err);
|
|
2709
|
+
console.error("[PendingChanges] onDexieWriteRequest callback failed:", err);
|
|
2686
2710
|
}
|
|
2687
2711
|
}
|
|
2688
2712
|
if (existing) {
|
|
@@ -2697,7 +2721,7 @@ var PendingChangesManager = class {
|
|
|
2697
2721
|
// ensure _id is after spread
|
|
2698
2722
|
});
|
|
2699
2723
|
if (typeof insertData._id === "object") {
|
|
2700
|
-
console.error(`Dexie: _id is object type in ${pending.collection}:`, typeof insertData._id, insertData._id);
|
|
2724
|
+
console.error(`[PendingChanges] Dexie: _id is object type in ${pending.collection}:`, typeof insertData._id, insertData._id);
|
|
2701
2725
|
}
|
|
2702
2726
|
await this.deps.dexieDb.insert(pending.collection, insertData);
|
|
2703
2727
|
}
|
|
@@ -2711,7 +2735,7 @@ var PendingChangesManager = class {
|
|
|
2711
2735
|
calledFrom: pending.calledFrom
|
|
2712
2736
|
});
|
|
2713
2737
|
} catch (err) {
|
|
2714
|
-
console.error("onDexieWriteResult callback failed:", err);
|
|
2738
|
+
console.error("[PendingChanges] onDexieWriteResult callback failed:", err);
|
|
2715
2739
|
}
|
|
2716
2740
|
}
|
|
2717
2741
|
clearPendingWrite(this.tenant, pending.collection, pending.id);
|
|
@@ -2725,12 +2749,12 @@ var PendingChangesManager = class {
|
|
|
2725
2749
|
calledFrom: pending.calledFrom
|
|
2726
2750
|
});
|
|
2727
2751
|
} catch (err) {
|
|
2728
|
-
console.error("onLocalstorageWriteResult callback failed:", err);
|
|
2752
|
+
console.error("[PendingChanges] onLocalstorageWriteResult callback failed:", err);
|
|
2729
2753
|
}
|
|
2730
2754
|
}
|
|
2731
2755
|
this.scheduleRestUpload();
|
|
2732
2756
|
} catch (err) {
|
|
2733
|
-
console.error("Failed to write to Dexie:", err);
|
|
2757
|
+
console.error("[PendingChanges] Failed to write to Dexie:", err);
|
|
2734
2758
|
if (this.callbacks.onDexieWriteResult) {
|
|
2735
2759
|
try {
|
|
2736
2760
|
this.callbacks.onDexieWriteResult({
|
|
@@ -2742,13 +2766,13 @@ var PendingChangesManager = class {
|
|
|
2742
2766
|
calledFrom: pending.calledFrom
|
|
2743
2767
|
});
|
|
2744
2768
|
} catch (callbackErr) {
|
|
2745
|
-
console.error("onDexieWriteResult callback failed:", callbackErr);
|
|
2769
|
+
console.error("[PendingChanges] onDexieWriteResult callback failed:", callbackErr);
|
|
2746
2770
|
}
|
|
2747
2771
|
}
|
|
2748
2772
|
const newRetryCount = pending.retryCount + 1;
|
|
2749
2773
|
if (newRetryCount >= MAX_RETRY_COUNT) {
|
|
2750
2774
|
console.error(
|
|
2751
|
-
`Max retry count (${MAX_RETRY_COUNT}) reached for pending change ${key}. Data remains in localStorage for crash recovery.`
|
|
2775
|
+
`[PendingChanges] Max retry count (${MAX_RETRY_COUNT}) reached for pending change ${key}. Data remains in localStorage for crash recovery.`
|
|
2752
2776
|
);
|
|
2753
2777
|
return;
|
|
2754
2778
|
}
|
|
@@ -2784,7 +2808,7 @@ var PendingChangesManager = class {
|
|
|
2784
2808
|
try {
|
|
2785
2809
|
await this.deps.uploadDirtyItems();
|
|
2786
2810
|
} catch (err) {
|
|
2787
|
-
console.error("REST upload failed:", err);
|
|
2811
|
+
console.error("[PendingChanges] REST upload failed:", err);
|
|
2788
2812
|
} finally {
|
|
2789
2813
|
this.isUploadingToRest = false;
|
|
2790
2814
|
resolveUpload();
|
|
@@ -2861,10 +2885,6 @@ function mergeObjectArrays(local, external, parentServerWins = false) {
|
|
|
2861
2885
|
}
|
|
2862
2886
|
if (objectItemsMissingId.length > 0) {
|
|
2863
2887
|
for (const item of objectItemsMissingId) {
|
|
2864
|
-
console.error(
|
|
2865
|
-
"[mergeObjectArrays] array element without _id \u2014 falling back to whole-array replace by higher _rev:",
|
|
2866
|
-
item
|
|
2867
|
-
);
|
|
2868
2888
|
}
|
|
2869
2889
|
return parentServerWins ? external.slice() : local.slice();
|
|
2870
2890
|
}
|
|
@@ -2992,6 +3012,7 @@ function stripServerManagedFromChanges(changes) {
|
|
|
2992
3012
|
}
|
|
2993
3013
|
|
|
2994
3014
|
// src/db/sync/SyncEngine.ts
|
|
3015
|
+
var SUPRESS_DB_WARNINGS = false;
|
|
2995
3016
|
var _SyncEngine = class _SyncEngine {
|
|
2996
3017
|
constructor(config) {
|
|
2997
3018
|
this.tenant = config.tenant;
|
|
@@ -3139,7 +3160,7 @@ var _SyncEngine = class _SyncEngine {
|
|
|
3139
3160
|
}
|
|
3140
3161
|
} catch (err) {
|
|
3141
3162
|
console.error(
|
|
3142
|
-
"uploadDirtyItems failed (download succeeded, staying online):",
|
|
3163
|
+
"[SyncEngine] uploadDirtyItems failed (download succeeded, staying online):",
|
|
3143
3164
|
err
|
|
3144
3165
|
);
|
|
3145
3166
|
}
|
|
@@ -3165,7 +3186,7 @@ var _SyncEngine = class _SyncEngine {
|
|
|
3165
3186
|
});
|
|
3166
3187
|
} catch (err) {
|
|
3167
3188
|
const reason = err instanceof Error ? err.message : String(err);
|
|
3168
|
-
console.error("Sync failed:", err);
|
|
3189
|
+
console.error("[SyncEngine] Sync failed:", err);
|
|
3169
3190
|
this.deps.onSyncFailed(`Sync failed: ${reason}`);
|
|
3170
3191
|
this.callOnSyncEnd({
|
|
3171
3192
|
durationMs: Date.now() - startTime,
|
|
@@ -3223,7 +3244,7 @@ var _SyncEngine = class _SyncEngine {
|
|
|
3223
3244
|
}
|
|
3224
3245
|
if (updates.length === 0) {
|
|
3225
3246
|
console.warn(
|
|
3226
|
-
`uploadDirtyItems: ${collectionName} has ${dirtyChanges.length} dirty entries but 0 resolvable items`,
|
|
3247
|
+
`[SyncEngine] uploadDirtyItems: ${collectionName} has ${dirtyChanges.length} dirty entries but 0 resolvable items`,
|
|
3227
3248
|
skipped
|
|
3228
3249
|
);
|
|
3229
3250
|
if (this.callbacks.onUploadSkip) {
|
|
@@ -3238,7 +3259,7 @@ var _SyncEngine = class _SyncEngine {
|
|
|
3238
3259
|
timestamp: /* @__PURE__ */ new Date()
|
|
3239
3260
|
});
|
|
3240
3261
|
} catch (err) {
|
|
3241
|
-
console.error("onUploadSkip callback failed:", err);
|
|
3262
|
+
console.error("[SyncEngine] onUploadSkip callback failed:", err);
|
|
3242
3263
|
}
|
|
3243
3264
|
}
|
|
3244
3265
|
continue;
|
|
@@ -3255,7 +3276,7 @@ var _SyncEngine = class _SyncEngine {
|
|
|
3255
3276
|
timestamp: /* @__PURE__ */ new Date()
|
|
3256
3277
|
});
|
|
3257
3278
|
} catch (err) {
|
|
3258
|
-
console.error("onUploadSkip callback failed:", err);
|
|
3279
|
+
console.error("[SyncEngine] onUploadSkip callback failed:", err);
|
|
3259
3280
|
}
|
|
3260
3281
|
}
|
|
3261
3282
|
collectionBatches.push([{
|
|
@@ -3352,7 +3373,7 @@ var _SyncEngine = class _SyncEngine {
|
|
|
3352
3373
|
}
|
|
3353
3374
|
if (ambiguous.length > 0) {
|
|
3354
3375
|
console.error(
|
|
3355
|
-
`Sync upload [${collection}]: ${ambiguous.length} id(s) appeared in BOTH inserted/updated/deleted AND errors[] \u2014 keeping dirty for safety. _ids: ${ambiguous.join(", ")}`
|
|
3376
|
+
`[SyncEngine] Sync upload [${collection}]: ${ambiguous.length} id(s) appeared in BOTH inserted/updated/deleted AND errors[] \u2014 keeping dirty for safety. _ids: ${ambiguous.join(", ")}`
|
|
3356
3377
|
);
|
|
3357
3378
|
}
|
|
3358
3379
|
if (allSuccessIds.length > 0) {
|
|
@@ -3450,14 +3471,14 @@ var _SyncEngine = class _SyncEngine {
|
|
|
3450
3471
|
if (errors2 && errors2.length > 0) {
|
|
3451
3472
|
for (const e of errors2) {
|
|
3452
3473
|
console.error(
|
|
3453
|
-
`Sync upload error [${collection}] _id=${e._id}: ${e.error} \u2014 dirty entry will persist until retry`
|
|
3474
|
+
`[SyncEngine] Sync upload error [${collection}] _id=${e._id}: ${e.error} \u2014 dirty entry will persist until retry`
|
|
3454
3475
|
);
|
|
3455
3476
|
}
|
|
3456
3477
|
}
|
|
3457
|
-
if (warnings && warnings.length > 0) {
|
|
3478
|
+
if (warnings && warnings.length > 0 && !SUPRESS_DB_WARNINGS) {
|
|
3458
3479
|
for (const w of warnings) {
|
|
3459
|
-
console.
|
|
3460
|
-
`
|
|
3480
|
+
console.error(
|
|
3481
|
+
`[SyncEngine] DB-WARNING [${collection}] _id=${w._id}: ${w.error}`
|
|
3461
3482
|
);
|
|
3462
3483
|
}
|
|
3463
3484
|
}
|
|
@@ -3471,7 +3492,7 @@ var _SyncEngine = class _SyncEngine {
|
|
|
3471
3492
|
const unacked = [...sentIds].filter((id) => !ackIds.has(id));
|
|
3472
3493
|
if (unacked.length > 0) {
|
|
3473
3494
|
console.warn(
|
|
3474
|
-
`uploadDirtyItems: ${collection}: ${unacked.length} items sent but not acknowledged:`,
|
|
3495
|
+
`[SyncEngine] uploadDirtyItems: ${collection}: ${unacked.length} items sent but not acknowledged:`,
|
|
3475
3496
|
unacked
|
|
3476
3497
|
);
|
|
3477
3498
|
}
|
|
@@ -3527,14 +3548,14 @@ var _SyncEngine = class _SyncEngine {
|
|
|
3527
3548
|
for (const e of errors2) {
|
|
3528
3549
|
erroredIds.add(String(e._id));
|
|
3529
3550
|
console.error(
|
|
3530
|
-
`Sync upload error [${collection}] _id=${e._id}: ${e.error} \u2014 dirty entry will persist until retry`
|
|
3551
|
+
`[SyncEngine] Sync upload error [${collection}] _id=${e._id}: ${e.error} \u2014 dirty entry will persist until retry`
|
|
3531
3552
|
);
|
|
3532
3553
|
}
|
|
3533
3554
|
}
|
|
3534
|
-
if (warnings && warnings.length > 0) {
|
|
3555
|
+
if (warnings && warnings.length > 0 && !SUPRESS_DB_WARNINGS) {
|
|
3535
3556
|
for (const w of warnings) {
|
|
3536
|
-
console.
|
|
3537
|
-
`
|
|
3557
|
+
console.error(
|
|
3558
|
+
`[SyncEngine] DB-WARNING [${collection}] _id=${w._id}: ${w.error}`
|
|
3538
3559
|
);
|
|
3539
3560
|
}
|
|
3540
3561
|
}
|
|
@@ -3566,7 +3587,7 @@ var _SyncEngine = class _SyncEngine {
|
|
|
3566
3587
|
}
|
|
3567
3588
|
if (ambiguous.length > 0) {
|
|
3568
3589
|
console.error(
|
|
3569
|
-
`Sync upload [${collection}]: ${ambiguous.length} id(s) appeared in BOTH inserted/updated/deleted AND errors[] \u2014 keeping dirty for safety. _ids: ${ambiguous.join(", ")}`
|
|
3590
|
+
`[SyncEngine] Sync upload [${collection}]: ${ambiguous.length} id(s) appeared in BOTH inserted/updated/deleted AND errors[] \u2014 keeping dirty for safety. _ids: ${ambiguous.join(", ")}`
|
|
3570
3591
|
);
|
|
3571
3592
|
}
|
|
3572
3593
|
if (allSuccessIds.length > 0) {
|
|
@@ -3705,7 +3726,7 @@ var _SyncEngine = class _SyncEngine {
|
|
|
3705
3726
|
timestamp: /* @__PURE__ */ new Date()
|
|
3706
3727
|
});
|
|
3707
3728
|
} catch (err) {
|
|
3708
|
-
console.error("onConflictResolved callback failed:", err);
|
|
3729
|
+
console.error("[SyncEngine] onConflictResolved callback failed:", err);
|
|
3709
3730
|
}
|
|
3710
3731
|
}
|
|
3711
3732
|
return resolved;
|
|
@@ -3719,7 +3740,7 @@ var _SyncEngine = class _SyncEngine {
|
|
|
3719
3740
|
try {
|
|
3720
3741
|
fn(info);
|
|
3721
3742
|
} catch (err) {
|
|
3722
|
-
console.error("Callback failed:", err);
|
|
3743
|
+
console.error("[SyncEngine] Callback failed:", err);
|
|
3723
3744
|
}
|
|
3724
3745
|
}
|
|
3725
3746
|
}
|
|
@@ -3728,7 +3749,7 @@ var _SyncEngine = class _SyncEngine {
|
|
|
3728
3749
|
try {
|
|
3729
3750
|
this.callbacks.onSyncStart(info);
|
|
3730
3751
|
} catch (err) {
|
|
3731
|
-
console.error("onSyncStart callback failed:", err);
|
|
3752
|
+
console.error("[SyncEngine] onSyncStart callback failed:", err);
|
|
3732
3753
|
}
|
|
3733
3754
|
}
|
|
3734
3755
|
}
|
|
@@ -3737,7 +3758,7 @@ var _SyncEngine = class _SyncEngine {
|
|
|
3737
3758
|
try {
|
|
3738
3759
|
this.callbacks.onSyncEnd(info);
|
|
3739
3760
|
} catch (err) {
|
|
3740
|
-
console.error("onSyncEnd callback failed:", err);
|
|
3761
|
+
console.error("[SyncEngine] onSyncEnd callback failed:", err);
|
|
3741
3762
|
}
|
|
3742
3763
|
}
|
|
3743
3764
|
}
|
|
@@ -3750,7 +3771,7 @@ var _SyncEngine = class _SyncEngine {
|
|
|
3750
3771
|
calledFrom
|
|
3751
3772
|
});
|
|
3752
3773
|
} catch (err) {
|
|
3753
|
-
console.error("onFindNewerManyCall callback failed:", err);
|
|
3774
|
+
console.error("[SyncEngine] onFindNewerManyCall callback failed:", err);
|
|
3754
3775
|
}
|
|
3755
3776
|
}
|
|
3756
3777
|
}
|
|
@@ -3766,7 +3787,7 @@ var _SyncEngine = class _SyncEngine {
|
|
|
3766
3787
|
calledFrom
|
|
3767
3788
|
});
|
|
3768
3789
|
} catch (err) {
|
|
3769
|
-
console.error("onFindNewerManyResult callback failed:", err);
|
|
3790
|
+
console.error("[SyncEngine] onFindNewerManyResult callback failed:", err);
|
|
3770
3791
|
}
|
|
3771
3792
|
}
|
|
3772
3793
|
}
|
|
@@ -3779,7 +3800,7 @@ var _SyncEngine = class _SyncEngine {
|
|
|
3779
3800
|
calledFrom
|
|
3780
3801
|
});
|
|
3781
3802
|
} catch (err) {
|
|
3782
|
-
console.error("onServerWriteRequest callback failed:", err);
|
|
3803
|
+
console.error("[SyncEngine] onServerWriteRequest callback failed:", err);
|
|
3783
3804
|
}
|
|
3784
3805
|
}
|
|
3785
3806
|
}
|
|
@@ -3794,7 +3815,7 @@ var _SyncEngine = class _SyncEngine {
|
|
|
3794
3815
|
calledFrom
|
|
3795
3816
|
});
|
|
3796
3817
|
} catch (err) {
|
|
3797
|
-
console.error("onServerWriteResult callback failed:", err);
|
|
3818
|
+
console.error("[SyncEngine] onServerWriteResult callback failed:", err);
|
|
3798
3819
|
}
|
|
3799
3820
|
}
|
|
3800
3821
|
}
|
|
@@ -3815,7 +3836,7 @@ var _SyncEngine = class _SyncEngine {
|
|
|
3815
3836
|
timestamp
|
|
3816
3837
|
});
|
|
3817
3838
|
} catch (err) {
|
|
3818
|
-
console.error("onServerSyncWrite callback failed:", err);
|
|
3839
|
+
console.error("[SyncEngine] onServerSyncWrite callback failed:", err);
|
|
3819
3840
|
}
|
|
3820
3841
|
}
|
|
3821
3842
|
};
|
|
@@ -4080,7 +4101,7 @@ var ServerUpdateHandler = class {
|
|
|
4080
4101
|
timestamp: /* @__PURE__ */ new Date()
|
|
4081
4102
|
});
|
|
4082
4103
|
} catch (err) {
|
|
4083
|
-
console.error("onWsNotification callback failed:", err);
|
|
4104
|
+
console.error("[ServerUpdateHandler] onWsNotification callback failed:", err);
|
|
4084
4105
|
}
|
|
4085
4106
|
}
|
|
4086
4107
|
}
|
|
@@ -4162,11 +4183,11 @@ var WakeSyncManager = class {
|
|
|
4162
4183
|
timestamp: /* @__PURE__ */ new Date()
|
|
4163
4184
|
});
|
|
4164
4185
|
} catch (err) {
|
|
4165
|
-
console.error("onWakeSync callback failed:", err);
|
|
4186
|
+
console.error("[WakeSync] onWakeSync callback failed:", err);
|
|
4166
4187
|
}
|
|
4167
4188
|
}
|
|
4168
4189
|
this.deps.sync(`wake-sync:${trigger}`).catch((err) => {
|
|
4169
|
-
console.error(`Wake sync (${trigger}) failed:`, err);
|
|
4190
|
+
console.error(`[WakeSync] Wake sync (${trigger}) failed:`, err);
|
|
4170
4191
|
});
|
|
4171
4192
|
}, this.debounceMs);
|
|
4172
4193
|
}
|
|
@@ -4235,7 +4256,7 @@ var NetworkStatusManager = class {
|
|
|
4235
4256
|
try {
|
|
4236
4257
|
this.callbacks.onBrowserNetworkChange(info);
|
|
4237
4258
|
} catch (err) {
|
|
4238
|
-
console.error("onBrowserNetworkChange callback failed:", err);
|
|
4259
|
+
console.error("[NetworkStatus] onBrowserNetworkChange callback failed:", err);
|
|
4239
4260
|
}
|
|
4240
4261
|
}
|
|
4241
4262
|
if (finalOnlineState) {
|
|
@@ -4243,7 +4264,7 @@ var NetworkStatusManager = class {
|
|
|
4243
4264
|
try {
|
|
4244
4265
|
this.callbacks.onBrowserOnline();
|
|
4245
4266
|
} catch (err) {
|
|
4246
|
-
console.error("onBrowserOnline callback failed:", err);
|
|
4267
|
+
console.error("[NetworkStatus] onBrowserOnline callback failed:", err);
|
|
4247
4268
|
}
|
|
4248
4269
|
}
|
|
4249
4270
|
} else {
|
|
@@ -4251,12 +4272,12 @@ var NetworkStatusManager = class {
|
|
|
4251
4272
|
try {
|
|
4252
4273
|
this.callbacks.onBrowserOffline();
|
|
4253
4274
|
} catch (err) {
|
|
4254
|
-
console.error("onBrowserOffline callback failed:", err);
|
|
4275
|
+
console.error("[NetworkStatus] onBrowserOffline callback failed:", err);
|
|
4255
4276
|
}
|
|
4256
4277
|
}
|
|
4257
4278
|
}
|
|
4258
4279
|
this.deps.setOnline(finalOnlineState).catch((err) => {
|
|
4259
|
-
console.error("Failed to set online status:", err);
|
|
4280
|
+
console.error("[NetworkStatus] Failed to set online status:", err);
|
|
4260
4281
|
});
|
|
4261
4282
|
}, this.debounceMs);
|
|
4262
4283
|
}
|
|
@@ -4321,14 +4342,14 @@ var _SyncedDb = class _SyncedDb {
|
|
|
4321
4342
|
onBecameLeader: () => {
|
|
4322
4343
|
if (this.initialized && !this.connectionManager.isOnline() && !this.connectionManager.isForcedOffline()) {
|
|
4323
4344
|
this.connectionManager.tryGoOnline().catch((err) => {
|
|
4324
|
-
console.error("tryGoOnline on becameLeader failed:", err);
|
|
4345
|
+
console.error("[SyncedDb] tryGoOnline on becameLeader failed:", err);
|
|
4325
4346
|
});
|
|
4326
4347
|
}
|
|
4327
4348
|
if (config.onBecameLeader) {
|
|
4328
4349
|
try {
|
|
4329
4350
|
config.onBecameLeader();
|
|
4330
4351
|
} catch (err) {
|
|
4331
|
-
console.error("onBecameLeader callback failed:", err);
|
|
4352
|
+
console.error("[SyncedDb] onBecameLeader callback failed:", err);
|
|
4332
4353
|
}
|
|
4333
4354
|
}
|
|
4334
4355
|
},
|
|
@@ -4631,7 +4652,7 @@ var _SyncedDb = class _SyncedDb {
|
|
|
4631
4652
|
try {
|
|
4632
4653
|
this.onDatabaseCreated();
|
|
4633
4654
|
} catch (err) {
|
|
4634
|
-
console.error("onDatabaseCreated callback failed:", err);
|
|
4655
|
+
console.error("[SyncedDb] onDatabaseCreated callback failed:", err);
|
|
4635
4656
|
}
|
|
4636
4657
|
}
|
|
4637
4658
|
await this.pendingChanges.recoverPendingWrites();
|
|
@@ -4664,10 +4685,10 @@ var _SyncedDb = class _SyncedDb {
|
|
|
4664
4685
|
try {
|
|
4665
4686
|
await this.serverUpdateNotifier.connect();
|
|
4666
4687
|
const ep = (_c = this.serverUpdateNotifier.endpoint) != null ? _c : "unknown";
|
|
4667
|
-
console.log(`SyncedDb: ebus-proxy connected to ${ep}`);
|
|
4688
|
+
console.log(`[SyncedDb] SyncedDb: ebus-proxy connected to ${ep}`);
|
|
4668
4689
|
} catch (err) {
|
|
4669
4690
|
const ep = (_d = this.serverUpdateNotifier.endpoint) != null ? _d : "unknown";
|
|
4670
|
-
console.warn(`SyncedDb: ebus-proxy connection to ${ep} failed`);
|
|
4691
|
+
console.warn(`[SyncedDb] SyncedDb: ebus-proxy connection to ${ep} failed`);
|
|
4671
4692
|
this.connectionManager.reportInfrastructureError(
|
|
4672
4693
|
"WEBSOCKET_CONNECTION_FAILED",
|
|
4673
4694
|
`WebSocket connection to ${ep} failed during initialization`,
|
|
@@ -4679,7 +4700,7 @@ var _SyncedDb = class _SyncedDb {
|
|
|
4679
4700
|
this.beforeUnloadHandler = () => {
|
|
4680
4701
|
if (this.initialized && this.pendingChanges.hasPendingChanges()) {
|
|
4681
4702
|
console.warn(
|
|
4682
|
-
`SyncedDb: pending changes not flushed. Call close() before page unload.`
|
|
4703
|
+
`[SyncedDb] SyncedDb: pending changes not flushed. Call close() before page unload.`
|
|
4683
4704
|
);
|
|
4684
4705
|
}
|
|
4685
4706
|
};
|
|
@@ -4689,7 +4710,7 @@ var _SyncedDb = class _SyncedDb {
|
|
|
4689
4710
|
this.visibilityFlushHandler = () => {
|
|
4690
4711
|
if (document.visibilityState !== "hidden") return;
|
|
4691
4712
|
this.flushToServer("visibility-hidden").catch((err) => {
|
|
4692
|
-
console.warn("flushToServer on visibility-hidden failed:", err == null ? void 0 : err.message);
|
|
4713
|
+
console.warn("[SyncedDb] flushToServer on visibility-hidden failed:", err == null ? void 0 : err.message);
|
|
4693
4714
|
});
|
|
4694
4715
|
};
|
|
4695
4716
|
document.addEventListener("visibilitychange", this.visibilityFlushHandler);
|
|
@@ -4830,6 +4851,11 @@ var _SyncedDb = class _SyncedDb {
|
|
|
4830
4851
|
async findById(collection, id, opts) {
|
|
4831
4852
|
var _a;
|
|
4832
4853
|
this.assertCollection(collection);
|
|
4854
|
+
if (!id) {
|
|
4855
|
+
const err = new Error(`[SyncedDb] findById ${collection} no id ${id}`);
|
|
4856
|
+
console.error(err);
|
|
4857
|
+
return null;
|
|
4858
|
+
}
|
|
4833
4859
|
id = this.normalizeId(id, "findById", collection);
|
|
4834
4860
|
opts = this.resolveOpts(opts);
|
|
4835
4861
|
if ((_a = this.collections.get(collection)) == null ? void 0 : _a.writeOnly) {
|
|
@@ -5062,7 +5088,7 @@ var _SyncedDb = class _SyncedDb {
|
|
|
5062
5088
|
await this.syncEngine.processCollectionServerData(collection, serverData, { source: "refresh" });
|
|
5063
5089
|
}
|
|
5064
5090
|
}).catch((err) => {
|
|
5065
|
-
console.error(`referToServer failed for ${collection}:`, err);
|
|
5091
|
+
console.error(`[SyncedDb] referToServer failed for ${collection}:`, err);
|
|
5066
5092
|
});
|
|
5067
5093
|
}
|
|
5068
5094
|
/**
|
|
@@ -5083,7 +5109,7 @@ var _SyncedDb = class _SyncedDb {
|
|
|
5083
5109
|
if (!serverItems || serverItems.length === 0) return;
|
|
5084
5110
|
await this.syncEngine.processCollectionServerData(collection, serverItems, { source: "incremental" });
|
|
5085
5111
|
}).catch((err) => {
|
|
5086
|
-
console.error(`refreshInBackground failed for ${collection}:`, err);
|
|
5112
|
+
console.error(`[SyncedDb] refreshInBackground failed for ${collection}:`, err);
|
|
5087
5113
|
});
|
|
5088
5114
|
}
|
|
5089
5115
|
async ensureItemsAreLoaded(collection, ids, withDeleted) {
|
|
@@ -5129,7 +5155,7 @@ var _SyncedDb = class _SyncedDb {
|
|
|
5129
5155
|
id = this.normalizeId(id, "save", collection);
|
|
5130
5156
|
if ("_id" in update && !update._id) {
|
|
5131
5157
|
console.error(
|
|
5132
|
-
`SyncedDb.save("${collection}", "${String(id)}"): update._id is present but falsy (${JSON.stringify(update._id)}). Stripped from update to prevent overwriting valid id. This is a bug \u2014 the caller should not pass falsy _id in update. Data keys: [${Object.keys(update).join(", ")}]`
|
|
5158
|
+
`[SyncedDb] SyncedDb.save("${collection}", "${String(id)}"): update._id is present but falsy (${JSON.stringify(update._id)}). Stripped from update to prevent overwriting valid id. This is a bug \u2014 the caller should not pass falsy _id in update. Data keys: [${Object.keys(update).join(", ")}]`
|
|
5133
5159
|
);
|
|
5134
5160
|
delete update._id;
|
|
5135
5161
|
}
|
|
@@ -5143,7 +5169,7 @@ var _SyncedDb = class _SyncedDb {
|
|
|
5143
5169
|
}
|
|
5144
5170
|
})();
|
|
5145
5171
|
console.error(
|
|
5146
|
-
`SyncedDb.save("${collection}", "${String(id)}"): update._id (${JSON.stringify(update._id)}) does NOT match id (${JSON.stringify(String(id))}). Stripped from update to prevent stuck-dirty bug. The caller likely passed a stale this._id while building update from a freshly-generated record. Data keys: [${updateKeys.join(", ")}]`
|
|
5172
|
+
`[SyncedDb] SyncedDb.save("${collection}", "${String(id)}"): update._id (${JSON.stringify(update._id)}) does NOT match id (${JSON.stringify(String(id))}). Stripped from update to prevent stuck-dirty bug. The caller likely passed a stale this._id while building update from a freshly-generated record. Data keys: [${updateKeys.join(", ")}]`
|
|
5147
5173
|
);
|
|
5148
5174
|
this.safeCallback(this.onSaveIdMismatch, {
|
|
5149
5175
|
collection,
|
|
@@ -5159,7 +5185,7 @@ var _SyncedDb = class _SyncedDb {
|
|
|
5159
5185
|
const existing = await this.dexieDb.getById(collection, id);
|
|
5160
5186
|
if (!existing && !((_a = this.collections.get(collection)) == null ? void 0 : _a.writeOnly)) {
|
|
5161
5187
|
console.warn(
|
|
5162
|
-
`SyncedDb.save: Object ${String(id)} not found in ${collection}, creating new`
|
|
5188
|
+
`[SyncedDb] SyncedDb.save: Object ${String(id)} not found in ${collection}, creating new`
|
|
5163
5189
|
);
|
|
5164
5190
|
}
|
|
5165
5191
|
const fullChanges = __spreadProps(__spreadValues({}, update), { _lastUpdaterId: this.updaterId });
|
|
@@ -5209,7 +5235,7 @@ var _SyncedDb = class _SyncedDb {
|
|
|
5209
5235
|
const existing = await this.dexieDb.getById(collection, id);
|
|
5210
5236
|
if (existing && !existing._deleted && !existing._archived) {
|
|
5211
5237
|
console.warn(
|
|
5212
|
-
`SyncedDb.insert: Object ${String(id)} already exists in ${collection}, overwriting`
|
|
5238
|
+
`[SyncedDb] SyncedDb.insert: Object ${String(id)} already exists in ${collection}, overwriting`
|
|
5213
5239
|
);
|
|
5214
5240
|
}
|
|
5215
5241
|
const insertChanges = __spreadProps(__spreadValues({}, data), { _lastUpdaterId: this.updaterId });
|
|
@@ -5348,7 +5374,7 @@ var _SyncedDb = class _SyncedDb {
|
|
|
5348
5374
|
this.inMemManager.writeBatch(collection, [{ _id: item.id }], "delete", { source: "incremental" });
|
|
5349
5375
|
results.push(true);
|
|
5350
5376
|
} catch (err) {
|
|
5351
|
-
console.error(`Failed to hard delete ${String(item.id)}:`, err);
|
|
5377
|
+
console.error(`[SyncedDb] Failed to hard delete ${String(item.id)}:`, err);
|
|
5352
5378
|
results.push(false);
|
|
5353
5379
|
}
|
|
5354
5380
|
}
|
|
@@ -5383,7 +5409,7 @@ var _SyncedDb = class _SyncedDb {
|
|
|
5383
5409
|
evictionPlan = await this._collectScopeExitPlan("auto");
|
|
5384
5410
|
} catch (err) {
|
|
5385
5411
|
console.error(
|
|
5386
|
-
"[evict] phase 1 failed (skipping bundled eviction):",
|
|
5412
|
+
"[SyncedDb] [evict] phase 1 failed (skipping bundled eviction):",
|
|
5387
5413
|
err
|
|
5388
5414
|
);
|
|
5389
5415
|
}
|
|
@@ -5400,11 +5426,11 @@ var _SyncedDb = class _SyncedDb {
|
|
|
5400
5426
|
const now = /* @__PURE__ */ new Date();
|
|
5401
5427
|
if (!this._lastFullSyncDate) {
|
|
5402
5428
|
this._setLastInitialSync(now).catch((err) => {
|
|
5403
|
-
console.error("Failed to persist lastInitialSync:", err);
|
|
5429
|
+
console.error("[SyncedDb] Failed to persist lastInitialSync:", err);
|
|
5404
5430
|
});
|
|
5405
5431
|
}
|
|
5406
5432
|
this._setLastFullSync(now).catch((err) => {
|
|
5407
|
-
console.error("Failed to persist lastFullSync:", err);
|
|
5433
|
+
console.error("[SyncedDb] Failed to persist lastFullSync:", err);
|
|
5408
5434
|
});
|
|
5409
5435
|
}
|
|
5410
5436
|
} catch (err) {
|
|
@@ -5423,7 +5449,7 @@ var _SyncedDb = class _SyncedDb {
|
|
|
5423
5449
|
);
|
|
5424
5450
|
await this._persistEvictionTimestamp();
|
|
5425
5451
|
} catch (err) {
|
|
5426
|
-
console.error("[evict] phase 3 failed:", err);
|
|
5452
|
+
console.error("[SyncedDb] [evict] phase 3 failed:", err);
|
|
5427
5453
|
}
|
|
5428
5454
|
}
|
|
5429
5455
|
}
|
|
@@ -5730,7 +5756,7 @@ var _SyncedDb = class _SyncedDb {
|
|
|
5730
5756
|
serverEvictedCount = serverExits.length;
|
|
5731
5757
|
} catch (err) {
|
|
5732
5758
|
console.error(
|
|
5733
|
-
`[evict] server-assisted pass failed for ${collection} (proceeding with local-only):`,
|
|
5759
|
+
`[SyncedDb] [evict] server-assisted pass failed for ${collection} (proceeding with local-only):`,
|
|
5734
5760
|
err
|
|
5735
5761
|
);
|
|
5736
5762
|
}
|
|
@@ -5847,7 +5873,7 @@ var _SyncedDb = class _SyncedDb {
|
|
|
5847
5873
|
} catch (err) {
|
|
5848
5874
|
serverFailed = true;
|
|
5849
5875
|
console.error(
|
|
5850
|
-
"[evict] server-assisted batch failed (proceeding with local-only):",
|
|
5876
|
+
"[SyncedDb] [evict] server-assisted batch failed (proceeding with local-only):",
|
|
5851
5877
|
err
|
|
5852
5878
|
);
|
|
5853
5879
|
}
|
|
@@ -6159,7 +6185,7 @@ var _SyncedDb = class _SyncedDb {
|
|
|
6159
6185
|
try {
|
|
6160
6186
|
fn(info);
|
|
6161
6187
|
} catch (err) {
|
|
6162
|
-
console.error("Callback failed:", err);
|
|
6188
|
+
console.error("[SyncedDb] Callback failed:", err);
|
|
6163
6189
|
}
|
|
6164
6190
|
}
|
|
6165
6191
|
}
|
|
@@ -6250,12 +6276,12 @@ var _SyncedDb = class _SyncedDb {
|
|
|
6250
6276
|
normalizeId(id, method, collection) {
|
|
6251
6277
|
if (!id && id !== void 0) {
|
|
6252
6278
|
console.error(
|
|
6253
|
-
`SyncedDb.${method != null ? method : "?"}("${collection != null ? collection : "?"}"): id parameter is falsy (${JSON.stringify(id)}). This is a bug \u2014 the caller must provide a valid _id.`
|
|
6279
|
+
`[SyncedDb] SyncedDb.${method != null ? method : "?"}("${collection != null ? collection : "?"}"): id parameter is falsy (${JSON.stringify(id)}). This is a bug \u2014 the caller must provide a valid _id.`
|
|
6254
6280
|
);
|
|
6255
6281
|
}
|
|
6256
6282
|
if (typeof id === "string" && _SyncedDb.STRINGIFIED_FALSY.has(id)) {
|
|
6257
6283
|
console.error(
|
|
6258
|
-
`SyncedDb.${method != null ? method : "?"}("${collection != null ? collection : "?"}"): id is a stringified falsy value ("${id}"). This is a bug \u2014 a falsy value was coerced to string before being passed as _id.`
|
|
6284
|
+
`[SyncedDb] SyncedDb.${method != null ? method : "?"}("${collection != null ? collection : "?"}"): id is a stringified falsy value ("${id}"). This is a bug \u2014 a falsy value was coerced to string before being passed as _id.`
|
|
6259
6285
|
);
|
|
6260
6286
|
}
|
|
6261
6287
|
return typeof id === "object" && id !== null ? String(id) : id;
|
|
@@ -6267,12 +6293,12 @@ var _SyncedDb = class _SyncedDb {
|
|
|
6267
6293
|
warnFalsyQueryId(data, method, collection) {
|
|
6268
6294
|
if ("_id" in data && !data._id) {
|
|
6269
6295
|
console.error(
|
|
6270
|
-
`SyncedDb.${method}("${collection}"): _id is present in query/data but falsy (${JSON.stringify(data._id)}). This is a bug \u2014 _id must be valid when specified. Data keys: [${Object.keys(data).join(", ")}]`
|
|
6296
|
+
`[SyncedDb] SyncedDb.${method}("${collection}"): _id is present in query/data but falsy (${JSON.stringify(data._id)}). This is a bug \u2014 _id must be valid when specified. Data keys: [${Object.keys(data).join(", ")}]`
|
|
6271
6297
|
);
|
|
6272
6298
|
}
|
|
6273
6299
|
if ("_id" in data && typeof data._id === "string" && _SyncedDb.STRINGIFIED_FALSY.has(data._id)) {
|
|
6274
6300
|
console.error(
|
|
6275
|
-
`SyncedDb.${method}("${collection}"): _id is a stringified falsy value ("${data._id}"). This is a bug \u2014 a falsy value was coerced to string before being passed as _id. Data keys: [${Object.keys(data).join(", ")}]`
|
|
6301
|
+
`[SyncedDb] SyncedDb.${method}("${collection}"): _id is a stringified falsy value ("${data._id}"). This is a bug \u2014 a falsy value was coerced to string before being passed as _id. Data keys: [${Object.keys(data).join(", ")}]`
|
|
6276
6302
|
);
|
|
6277
6303
|
}
|
|
6278
6304
|
}
|
|
@@ -6285,7 +6311,7 @@ var _SyncedDb = class _SyncedDb {
|
|
|
6285
6311
|
ensureId(data, method, collection) {
|
|
6286
6312
|
if (typeof data._id === "string" && _SyncedDb.STRINGIFIED_FALSY.has(data._id)) {
|
|
6287
6313
|
console.error(
|
|
6288
|
-
`SyncedDb.${method}("${collection}"): _id is a stringified falsy value ("${data._id}"). This is a bug \u2014 a falsy value was coerced to string before being passed as _id. Data keys: [${Object.keys(data).join(", ")}]`
|
|
6314
|
+
`[SyncedDb] SyncedDb.${method}("${collection}"): _id is a stringified falsy value ("${data._id}"). This is a bug \u2014 a falsy value was coerced to string before being passed as _id. Data keys: [${Object.keys(data).join(", ")}]`
|
|
6289
6315
|
);
|
|
6290
6316
|
data._id = null;
|
|
6291
6317
|
}
|
|
@@ -6293,7 +6319,7 @@ var _SyncedDb = class _SyncedDb {
|
|
|
6293
6319
|
const newId = new ObjectId2().toHexString();
|
|
6294
6320
|
if ("_id" in data) {
|
|
6295
6321
|
console.error(
|
|
6296
|
-
`SyncedDb.${method}("${collection}"): _id is present but falsy (${JSON.stringify(data._id)}). Replaced with "${newId}". This is a bug \u2014 the caller should provide a valid _id. Data keys: [${Object.keys(data).join(", ")}]`
|
|
6322
|
+
`[SyncedDb] SyncedDb.${method}("${collection}"): _id is present but falsy (${JSON.stringify(data._id)}). Replaced with "${newId}". This is a bug \u2014 the caller should provide a valid _id. Data keys: [${Object.keys(data).join(", ")}]`
|
|
6297
6323
|
);
|
|
6298
6324
|
}
|
|
6299
6325
|
data._id = newId;
|
|
@@ -6383,7 +6409,7 @@ var _SyncedDb = class _SyncedDb {
|
|
|
6383
6409
|
const drop = (reason) => {
|
|
6384
6410
|
if (dropSilently) return;
|
|
6385
6411
|
console.error(
|
|
6386
|
-
`SyncedDb
|
|
6412
|
+
`[SyncedDb] applyDiffLocally: dropping bracket-path diff entry (${reason})`,
|
|
6387
6413
|
{ collection, _id: String(id), path, value }
|
|
6388
6414
|
);
|
|
6389
6415
|
};
|
|
@@ -6599,7 +6625,7 @@ var DexieDb = class extends Dexie {
|
|
|
6599
6625
|
this.ensureStringId(item);
|
|
6600
6626
|
if (typeof item._id !== "string" || item._id.length === 0) {
|
|
6601
6627
|
console.error(
|
|
6602
|
-
`DexieDb.saveMany: skipping item with invalid _id in "${collection}"`,
|
|
6628
|
+
`[DexieDb] DexieDb.saveMany: skipping item with invalid _id in "${collection}"`,
|
|
6603
6629
|
{ _id: item._id, _idType: typeof item._id, item }
|
|
6604
6630
|
);
|
|
6605
6631
|
continue;
|
|
@@ -6612,7 +6638,7 @@ var DexieDb = class extends Dexie {
|
|
|
6612
6638
|
} catch (err) {
|
|
6613
6639
|
const ids = valid.map((it) => String(it._id));
|
|
6614
6640
|
console.error(
|
|
6615
|
-
`DexieDb.saveMany: bulkPut failed for "${collection}" (${valid.length} items):`,
|
|
6641
|
+
`[DexieDb] DexieDb.saveMany: bulkPut failed for "${collection}" (${valid.length} items):`,
|
|
6616
6642
|
err,
|
|
6617
6643
|
"_ids:",
|
|
6618
6644
|
ids
|
|
@@ -9567,7 +9593,7 @@ var Ebus2ProxyServerUpdateNotifier = class {
|
|
|
9567
9593
|
this.reconnectAttempt = 0;
|
|
9568
9594
|
this.currentReconnectDelay = this.reconnectDelayMs;
|
|
9569
9595
|
console.log(
|
|
9570
|
-
`Ebus2Proxy connected to ${this.wsUrl} (db: ${this.dbName})`
|
|
9596
|
+
`[Ebus2ProxyNotifier] Ebus2Proxy connected to ${this.wsUrl} (db: ${this.dbName})`
|
|
9571
9597
|
);
|
|
9572
9598
|
this.sendSubscribe(`db/${this.dbName}`);
|
|
9573
9599
|
if (this.subscribeServices) {
|
|
@@ -9578,7 +9604,7 @@ var Ebus2ProxyServerUpdateNotifier = class {
|
|
|
9578
9604
|
try {
|
|
9579
9605
|
callback();
|
|
9580
9606
|
} catch (err) {
|
|
9581
|
-
console.error("onWsConnect callback failed:", err);
|
|
9607
|
+
console.error("[Ebus2ProxyNotifier] onWsConnect callback failed:", err);
|
|
9582
9608
|
}
|
|
9583
9609
|
}
|
|
9584
9610
|
}
|
|
@@ -9593,7 +9619,7 @@ var Ebus2ProxyServerUpdateNotifier = class {
|
|
|
9593
9619
|
try {
|
|
9594
9620
|
callback(reason);
|
|
9595
9621
|
} catch (err) {
|
|
9596
|
-
console.error("onWsDisconnect callback failed:", err);
|
|
9622
|
+
console.error("[Ebus2ProxyNotifier] onWsDisconnect callback failed:", err);
|
|
9597
9623
|
}
|
|
9598
9624
|
}
|
|
9599
9625
|
}
|
|
@@ -9602,7 +9628,7 @@ var Ebus2ProxyServerUpdateNotifier = class {
|
|
|
9602
9628
|
}
|
|
9603
9629
|
}
|
|
9604
9630
|
handleError(event) {
|
|
9605
|
-
console.error("WebSocket error:", event);
|
|
9631
|
+
console.error("[Ebus2ProxyNotifier] WebSocket error:", event);
|
|
9606
9632
|
}
|
|
9607
9633
|
handleMessage(event) {
|
|
9608
9634
|
try {
|
|
@@ -9624,11 +9650,11 @@ var Ebus2ProxyServerUpdateNotifier = class {
|
|
|
9624
9650
|
this.handlePong();
|
|
9625
9651
|
break;
|
|
9626
9652
|
case "error":
|
|
9627
|
-
console.error("WebSocket server error:", message.error);
|
|
9653
|
+
console.error("[Ebus2ProxyNotifier] WebSocket server error:", message.error);
|
|
9628
9654
|
break;
|
|
9629
9655
|
}
|
|
9630
9656
|
} catch (err) {
|
|
9631
|
-
console.error("Failed to parse WebSocket message:", err);
|
|
9657
|
+
console.error("[Ebus2ProxyNotifier] Failed to parse WebSocket message:", err);
|
|
9632
9658
|
}
|
|
9633
9659
|
}
|
|
9634
9660
|
handleChannelMessage(message) {
|
|
@@ -9636,7 +9662,7 @@ var Ebus2ProxyServerUpdateNotifier = class {
|
|
|
9636
9662
|
try {
|
|
9637
9663
|
this.onServicesChange(message.data);
|
|
9638
9664
|
} catch (err) {
|
|
9639
|
-
console.error("onServicesChange callback failed:", err);
|
|
9665
|
+
console.error("[Ebus2ProxyNotifier] onServicesChange callback failed:", err);
|
|
9640
9666
|
}
|
|
9641
9667
|
return;
|
|
9642
9668
|
}
|
|
@@ -9653,14 +9679,14 @@ var Ebus2ProxyServerUpdateNotifier = class {
|
|
|
9653
9679
|
try {
|
|
9654
9680
|
this.onWsNotification(payload);
|
|
9655
9681
|
} catch (err) {
|
|
9656
|
-
console.error("onWsNotification callback failed:", err);
|
|
9682
|
+
console.error("[Ebus2ProxyNotifier] onWsNotification callback failed:", err);
|
|
9657
9683
|
}
|
|
9658
9684
|
}
|
|
9659
9685
|
for (const callback of this.callbacks) {
|
|
9660
9686
|
try {
|
|
9661
9687
|
callback(payload);
|
|
9662
9688
|
} catch (err) {
|
|
9663
|
-
console.error("ServerUpdateCallback failed:", err);
|
|
9689
|
+
console.error("[Ebus2ProxyNotifier] ServerUpdateCallback failed:", err);
|
|
9664
9690
|
}
|
|
9665
9691
|
}
|
|
9666
9692
|
}
|
|
@@ -9679,14 +9705,14 @@ var Ebus2ProxyServerUpdateNotifier = class {
|
|
|
9679
9705
|
try {
|
|
9680
9706
|
callback(this.reconnectAttempt);
|
|
9681
9707
|
} catch (err) {
|
|
9682
|
-
console.error("onWsReconnect callback failed:", err);
|
|
9708
|
+
console.error("[Ebus2ProxyNotifier] onWsReconnect callback failed:", err);
|
|
9683
9709
|
}
|
|
9684
9710
|
}
|
|
9685
9711
|
this.reconnectTimer = setTimeout(() => {
|
|
9686
9712
|
this.reconnectTimer = void 0;
|
|
9687
9713
|
if (this.shouldReconnect && !this.forcedOffline) {
|
|
9688
9714
|
this.createWebSocket().catch((err) => {
|
|
9689
|
-
console.error("Reconnection failed:", err);
|
|
9715
|
+
console.error("[Ebus2ProxyNotifier] Reconnection failed:", err);
|
|
9690
9716
|
this.currentReconnectDelay = Math.min(
|
|
9691
9717
|
this.currentReconnectDelay * 2,
|
|
9692
9718
|
this.maxReconnectDelayMs
|
|
@@ -9709,7 +9735,7 @@ var Ebus2ProxyServerUpdateNotifier = class {
|
|
|
9709
9735
|
const pingMsg = { type: "ping", id: `ping-${Date.now()}` };
|
|
9710
9736
|
this.ws.send(packr2.pack(preprocessForPack2(pingMsg)));
|
|
9711
9737
|
this.pongTimer = setTimeout(() => {
|
|
9712
|
-
console.warn("Pong timeout - closing WebSocket");
|
|
9738
|
+
console.warn("[Ebus2ProxyNotifier] Pong timeout - closing WebSocket");
|
|
9713
9739
|
if (this.ws) {
|
|
9714
9740
|
this.ws.close(4e3, "Pong timeout");
|
|
9715
9741
|
}
|
|
@@ -84,9 +84,15 @@ export declare function deleteByPath(target: any, path: string): boolean;
|
|
|
84
84
|
* wrapped element[0], not into the array itself. The pending insert
|
|
85
85
|
* absorbs the sub-field edit.
|
|
86
86
|
*
|
|
87
|
-
* 2. New path is an ANCESTOR of existing keys
|
|
88
|
-
*
|
|
89
|
-
*
|
|
87
|
+
* 2. New path is an ANCESTOR of existing keys.
|
|
88
|
+
* - Plain ancestor (e.g. existing "koraki.0.diag", new "koraki" with full
|
|
89
|
+
* array): drop the descendants; the new full value supersedes any
|
|
90
|
+
* field-level deltas.
|
|
91
|
+
* - TERMINAL-bracket ancestor whose `newValue` is element-shaped
|
|
92
|
+
* (`arr[a].sub[b]` with `[<el>]` or plain object): LAYER pending
|
|
93
|
+
* descendant sub-field edits INTO `newValue` before dropping them,
|
|
94
|
+
* so the element-level write absorbs the prior sub-field-level
|
|
95
|
+
* writes instead of silently overwriting them.
|
|
90
96
|
*
|
|
91
97
|
* 3. New path is ORTHOGONAL to existing keys: simple set (Object.assign-equivalent).
|
|
92
98
|
*
|