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 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 toDelete = [];
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
- toDelete.push(existingKey);
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 toDelete) delete accumulated[k];
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.warn(
3460
- `Sync upload warning [${collection}] _id=${w._id}: ${w.error}`
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.warn(
3537
- `Sync upload warning [${collection}] _id=${w._id}: ${w.error}`
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.applyDiffLocally: dropping bracket-path diff entry (${reason})`,
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 (e.g. existing has "koraki.0.diag",
88
- * new is "koraki" with full array): remove the now-redundant descendants and
89
- * set the parent path. The new full value supersedes any field-level deltas.
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
  *
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cry-synced-db-client",
3
- "version": "0.1.171",
3
+ "version": "0.1.172",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.js",