@riddix/hamh 2.1.0-alpha.517 → 2.1.0-alpha.518

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.
@@ -166866,6 +166866,7 @@ function ensureCommissioningConfig(server) {
166866
166866
 
166867
166867
  // src/services/bridges/bridge.ts
166868
166868
  var AUTO_FORCE_SYNC_INTERVAL_MS = 9e4;
166869
+ var DEAD_SESSION_TIMEOUT_MS = 3 * 60 * 1e3;
166869
166870
  var Bridge = class {
166870
166871
  constructor(env, logger203, dataProvider, endpointManager) {
166871
166872
  this.dataProvider = dataProvider;
@@ -166888,6 +166889,7 @@ var Bridge = class {
166888
166889
  // (e.g. Stopped → Starting → Running).
166889
166890
  onStatusChange;
166890
166891
  autoForceSyncTimer = null;
166892
+ deadSessionTimer = null;
166891
166893
  // Tracks the last synced state JSON per entity to avoid pushing unchanged states.
166892
166894
  // Key: entity_id, Value: JSON.stringify of entity.state
166893
166895
  lastSyncedStates = /* @__PURE__ */ new Map();
@@ -167064,6 +167066,21 @@ ${e?.toString()}`);
167064
167066
  this.log.warn(
167065
167067
  `All subscriptions lost \u2014 ${sessions.length} session(s) still active, waiting for controller to re-subscribe`
167066
167068
  );
167069
+ if (!this.deadSessionTimer) {
167070
+ this.deadSessionTimer = setTimeout(() => {
167071
+ this.deadSessionTimer = null;
167072
+ this.closeDeadSessions();
167073
+ }, DEAD_SESSION_TIMEOUT_MS);
167074
+ this.log.info(
167075
+ `Scheduled dead session cleanup in ${DEAD_SESSION_TIMEOUT_MS / 1e3}s`
167076
+ );
167077
+ }
167078
+ } else if (totalSubs > 0 && this.deadSessionTimer) {
167079
+ clearTimeout(this.deadSessionTimer);
167080
+ this.deadSessionTimer = null;
167081
+ this.log.info(
167082
+ "Subscriptions recovered, canceled dead session cleanup"
167083
+ );
167067
167084
  }
167068
167085
  };
167069
167086
  sessionManager.subscriptionsChanged.on(this.sessionDiagHandler);
@@ -167092,6 +167109,22 @@ ${e?.toString()}`);
167092
167109
  } catch {
167093
167110
  }
167094
167111
  }
167112
+ closeDeadSessions() {
167113
+ try {
167114
+ const sessionManager = this.server.env.get(SessionManager);
167115
+ const sessions = [...sessionManager.sessions];
167116
+ for (const s of sessions) {
167117
+ if (!s.isClosing && s.subscriptions.size === 0) {
167118
+ this.log.warn(
167119
+ `Force-closing dead session ${s.id} (peer ${s.peerNodeId}, no subscriptions for ${DEAD_SESSION_TIMEOUT_MS / 1e3}s)`
167120
+ );
167121
+ s.initiateForceClose().catch(() => {
167122
+ });
167123
+ }
167124
+ }
167125
+ } catch {
167126
+ }
167127
+ }
167095
167128
  unwireSessionDiagnostics() {
167096
167129
  try {
167097
167130
  const sessionManager = this.server.env.get(SessionManager);
@@ -167109,6 +167142,10 @@ ${e?.toString()}`);
167109
167142
  this.sessionDiagHandler = void 0;
167110
167143
  this.sessionAddedHandler = void 0;
167111
167144
  this.sessionDeletedHandler = void 0;
167145
+ if (this.deadSessionTimer) {
167146
+ clearTimeout(this.deadSessionTimer);
167147
+ this.deadSessionTimer = null;
167148
+ }
167112
167149
  }
167113
167150
  stopAutoForceSync() {
167114
167151
  if (this.autoForceSyncTimer) {
@@ -179508,6 +179545,7 @@ function hashAreaId(areaId) {
179508
179545
  // src/services/bridges/server-mode-bridge.ts
179509
179546
  init_dist();
179510
179547
  var AUTO_FORCE_SYNC_INTERVAL_MS2 = 9e4;
179548
+ var DEAD_SESSION_TIMEOUT_MS2 = 3 * 60 * 1e3;
179511
179549
  var ServerModeBridge = class {
179512
179550
  constructor(logger203, dataProvider, endpointManager, server) {
179513
179551
  this.dataProvider = dataProvider;
@@ -179524,6 +179562,7 @@ var ServerModeBridge = class {
179524
179562
  // broadcast updates via WebSocket so the frontend sees every transition.
179525
179563
  onStatusChange;
179526
179564
  autoForceSyncTimer = null;
179565
+ deadSessionTimer = null;
179527
179566
  warmStartTimer = null;
179528
179567
  // Tracks the last synced state JSON per entity to avoid pushing unchanged states.
179529
179568
  lastSyncedState;
@@ -179705,6 +179744,21 @@ ${e?.toString()}`);
179705
179744
  this.log.warn(
179706
179745
  `All subscriptions lost \u2014 ${sessions.length} session(s) still active, waiting for controller to re-subscribe`
179707
179746
  );
179747
+ if (!this.deadSessionTimer) {
179748
+ this.deadSessionTimer = setTimeout(() => {
179749
+ this.deadSessionTimer = null;
179750
+ this.closeDeadSessions();
179751
+ }, DEAD_SESSION_TIMEOUT_MS2);
179752
+ this.log.info(
179753
+ `Scheduled dead session cleanup in ${DEAD_SESSION_TIMEOUT_MS2 / 1e3}s`
179754
+ );
179755
+ }
179756
+ } else if (totalSubs > 0 && this.deadSessionTimer) {
179757
+ clearTimeout(this.deadSessionTimer);
179758
+ this.deadSessionTimer = null;
179759
+ this.log.info(
179760
+ "Subscriptions recovered, canceled dead session cleanup"
179761
+ );
179708
179762
  }
179709
179763
  };
179710
179764
  sessionManager.subscriptionsChanged.on(this.sessionDiagHandler);
@@ -179733,6 +179787,22 @@ ${e?.toString()}`);
179733
179787
  } catch {
179734
179788
  }
179735
179789
  }
179790
+ closeDeadSessions() {
179791
+ try {
179792
+ const sessionManager = this.server.env.get(SessionManager);
179793
+ const sessions = [...sessionManager.sessions];
179794
+ for (const s of sessions) {
179795
+ if (!s.isClosing && s.subscriptions.size === 0) {
179796
+ this.log.warn(
179797
+ `Force-closing dead session ${s.id} (peer ${s.peerNodeId}, no subscriptions for ${DEAD_SESSION_TIMEOUT_MS2 / 1e3}s)`
179798
+ );
179799
+ s.initiateForceClose().catch(() => {
179800
+ });
179801
+ }
179802
+ }
179803
+ } catch {
179804
+ }
179805
+ }
179736
179806
  unwireSessionDiagnostics() {
179737
179807
  try {
179738
179808
  const sessionManager = this.server.env.get(SessionManager);
@@ -179750,6 +179820,10 @@ ${e?.toString()}`);
179750
179820
  this.sessionDiagHandler = void 0;
179751
179821
  this.sessionAddedHandler = void 0;
179752
179822
  this.sessionDeletedHandler = void 0;
179823
+ if (this.deadSessionTimer) {
179824
+ clearTimeout(this.deadSessionTimer);
179825
+ this.deadSessionTimer = null;
179826
+ }
179753
179827
  }
179754
179828
  stopAutoForceSync() {
179755
179829
  if (this.autoForceSyncTimer) {