Skip to content

Commit 96714e0

Browse files
committed
refactor: use server-provided heartbeat interval in MeshV2Service
- Added heartbeatIntervalSeconds to CREATE_GROUP mutation - Updated createGroup, renewHeartbeat, and joinGroup to capture interval from server - Updated startHeartbeat to use server interval instead of environment variables - Removed MESH_HOST_HEARTBEAT_INTERVAL_SECONDS and MESH_MEMBER_HEARTBEAT_INTERVAL_SECONDS
1 parent a5ea13f commit 96714e0

File tree

4 files changed

+14
-29
lines changed

4 files changed

+14
-29
lines changed

.env.example

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -23,14 +23,6 @@ MESH_DATA_UPDATE_INTERVAL_MS=1000
2323
# Default: 1000
2424
MESH_EVENT_BATCH_INTERVAL_MS=1000
2525

26-
# Host heartbeat interval in seconds
27-
# Default: 60 (60 seconds)
28-
MESH_HOST_HEARTBEAT_INTERVAL_SECONDS=60
29-
30-
# Member heartbeat interval in seconds
31-
# Default: 120 (120 seconds)
32-
MESH_MEMBER_HEARTBEAT_INTERVAL_SECONDS=120
33-
3426
# Debug logging (comma-separated categories, e.g., scratch-vm:*)
3527
DEBUG=
3628

src/extensions/scratch3_mesh_v2/gql-operations.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ const CREATE_GROUP = gql`
3131
hostId
3232
createdAt
3333
expiresAt
34+
heartbeatIntervalSeconds
3435
}
3536
}
3637
`;

src/extensions/scratch3_mesh_v2/mesh-service.js

Lines changed: 12 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ class MeshV2Service {
6767
// Last data send promise to track completion of the most recent data transmission
6868
this.lastDataSendPromise = Promise.resolve();
6969

70+
this.hostHeartbeatInterval = 60; // Default 1 min
7071
this.memberHeartbeatInterval = 120; // Default 2 min
7172

7273
// Data from other nodes: { nodeId: { key: { value: string, timestamp: number } } }
@@ -226,6 +227,9 @@ class MeshV2Service {
226227
this.domain = group.domain; // Update domain from server
227228
this.expiresAt = group.expiresAt;
228229
this.isHost = true;
230+
if (group.heartbeatIntervalSeconds) {
231+
this.hostHeartbeatInterval = group.heartbeatIntervalSeconds;
232+
}
229233

230234
this.costTracking.connectionStartTime = Date.now();
231235
this.startSubscriptions();
@@ -684,22 +688,7 @@ class MeshV2Service {
684688
if (!this.groupId) return;
685689

686690
log.info(`Mesh V2: Starting heartbeat timer (Role: ${this.isHost ? 'Host' : 'Member'})`);
687-
// Use 60s for host, memberHeartbeatInterval for member (default 120s)
688-
const hostInterval = parseEnvInt(
689-
process.env.MESH_HOST_HEARTBEAT_INTERVAL_SECONDS,
690-
60, // default: 60 seconds
691-
1, // min: 1 second
692-
300 // max: 5 minutes
693-
) * 1000;
694-
695-
const memberDefaultInterval = parseEnvInt(
696-
process.env.MESH_MEMBER_HEARTBEAT_INTERVAL_SECONDS,
697-
120, // default: 120 seconds
698-
1, // min: 1 second
699-
600 // max: 10 minutes
700-
) * 1000;
701-
702-
const interval = this.isHost ? hostInterval : (this.memberHeartbeatInterval * 1000 || memberDefaultInterval);
691+
const interval = (this.isHost ? this.hostHeartbeatInterval : this.memberHeartbeatInterval) * 1000;
703692

704693
this.heartbeatTimer = setInterval(() => {
705694
if (this.isHost) {
@@ -734,6 +723,13 @@ class MeshV2Service {
734723
});
735724
this.expiresAt = result.data.renewHeartbeat.expiresAt;
736725
log.info(`Mesh V2: Heartbeat renewed. Expires at: ${this.expiresAt}`);
726+
if (result.data.renewHeartbeat.heartbeatIntervalSeconds) {
727+
const newInterval = result.data.renewHeartbeat.heartbeatIntervalSeconds;
728+
if (newInterval !== this.hostHeartbeatInterval) {
729+
this.hostHeartbeatInterval = newInterval;
730+
this.startHeartbeat(); // Restart with new interval
731+
}
732+
}
737733
this.startConnectionTimer();
738734
return result.data.renewHeartbeat;
739735
} catch (error) {

webpack.config.js

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -78,11 +78,7 @@ const webBuilder = new ScratchWebpackConfigBuilder(common)
7878
'process.env.MESH_API_KEY': JSON.stringify(process.env.MESH_API_KEY),
7979
'process.env.MESH_AWS_REGION': JSON.stringify(process.env.MESH_AWS_REGION),
8080
'process.env.MESH_DATA_UPDATE_INTERVAL_MS': JSON.stringify(process.env.MESH_DATA_UPDATE_INTERVAL_MS),
81-
'process.env.MESH_EVENT_BATCH_INTERVAL_MS': JSON.stringify(process.env.MESH_EVENT_BATCH_INTERVAL_MS),
82-
'process.env.MESH_HOST_HEARTBEAT_INTERVAL_SECONDS':
83-
JSON.stringify(process.env.MESH_HOST_HEARTBEAT_INTERVAL_SECONDS),
84-
'process.env.MESH_MEMBER_HEARTBEAT_INTERVAL_SECONDS':
85-
JSON.stringify(process.env.MESH_MEMBER_HEARTBEAT_INTERVAL_SECONDS)
81+
'process.env.MESH_EVENT_BATCH_INTERVAL_MS': JSON.stringify(process.env.MESH_EVENT_BATCH_INTERVAL_MS)
8682
}));
8783

8884
const playgroundBuilder = webBuilder.clone()

0 commit comments

Comments
 (0)