@mulingai-npm/redis 3.14.0 → 3.15.0

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.
@@ -6,6 +6,7 @@ export type MulingstreamListenerData = {
6
6
  token: string;
7
7
  name?: string;
8
8
  firstJoined: number;
9
+ lastHeartbeat: number;
9
10
  language?: string;
10
11
  isActive?: boolean;
11
12
  };
@@ -17,9 +18,10 @@ export declare class MulingstreamListenerManager {
17
18
  getAllListeners(): Promise<MulingstreamListenerData[]>;
18
19
  getListenersByRoom(roomId: string): Promise<MulingstreamListenerData[]>;
19
20
  getListener(listenerIdOrToken: string): Promise<MulingstreamListenerData | null>;
20
- removeListenerByToken(token: string): Promise<boolean>;
21
+ removeListener(tokenOrListenerId: string): Promise<MulingstreamListenerData | null>;
21
22
  updateNameLanguage(listenerIdOrToken: string, name: string, language: string): Promise<MulingstreamListenerData | null>;
22
23
  updateSocketId(listenerIdOrToken: string, socketId: string): Promise<MulingstreamListenerData | null>;
23
24
  getTargetSocketIdsByRoomLanguage(roomId: string, language: string): Promise<string[]>;
24
25
  getUniqueLanguagesByRoom(roomId: string): Promise<string[]>;
26
+ updateHeartbeat(listenerIdOrToken: string): Promise<MulingstreamListenerData | null>;
25
27
  }
@@ -14,6 +14,7 @@ class MulingstreamListenerManager {
14
14
  token: data.token,
15
15
  name: data.name || '',
16
16
  firstJoined: parseInt(data.firstJoined, 10),
17
+ lastHeartbeat: parseInt(data.lastHeartbeat, 10),
17
18
  language: data.language || '',
18
19
  isActive: data.isActive === 'true'
19
20
  };
@@ -35,6 +36,7 @@ class MulingstreamListenerManager {
35
36
  token: listenerData.token,
36
37
  name: (_b = listenerData.name) !== null && _b !== void 0 ? _b : '',
37
38
  firstJoined: listenerData.firstJoined.toString(),
39
+ lastHeartbeat: listenerData.lastHeartbeat.toString(),
38
40
  language: (_c = listenerData.language) !== null && _c !== void 0 ? _c : '',
39
41
  isActive: 'true'
40
42
  });
@@ -96,17 +98,17 @@ class MulingstreamListenerManager {
96
98
  }
97
99
  return null;
98
100
  }
99
- async removeListenerByToken(token) {
100
- // find the listener by token
101
- const listener = await this.getListener(token);
101
+ async removeListener(tokenOrListenerId) {
102
+ // find the listener by token or listenerId
103
+ const listener = await this.getListener(tokenOrListenerId);
102
104
  if (!listener) {
103
- return false;
105
+ return null;
104
106
  }
105
107
  // remove the listener ID from the room's set
106
108
  await this.redisClient.srem(`room:${listener.roomId}:listeners`, listener.listenerId);
107
109
  // remove the listener data (the hash)
108
110
  await this.redisClient.del(`listener:${listener.listenerId}`);
109
- return true;
111
+ return listener;
110
112
  }
111
113
  async updateNameLanguage(listenerIdOrToken, name, language) {
112
114
  const listener = await this.getListener(listenerIdOrToken);
@@ -160,5 +162,21 @@ class MulingstreamListenerManager {
160
162
  // 4) Map back to just the language strings in order
161
163
  return sortedEntries.map(([language]) => language);
162
164
  }
165
+ async updateHeartbeat(listenerIdOrToken) {
166
+ const listener = await this.getListener(listenerIdOrToken);
167
+ if (!listener) {
168
+ console.warn(`[Heartbeat] Cannot update heartbeat for unknown listener: ${listenerIdOrToken}`);
169
+ return null;
170
+ }
171
+ const now = Date.now();
172
+ // Update the heartbeat timestamp
173
+ await this.redisClient.hset(`listener:${listener.listenerId}`, {
174
+ lastHeartbeat: now.toString()
175
+ });
176
+ // Reset expiration on activity
177
+ await this.redisClient.expire(`listener:${listener.listenerId}`, EXPIRATION);
178
+ console.log(`[Heartbeat] Updated for listener ${listener.listenerId} at ${new Date(now).toISOString()}`);
179
+ return { ...listener, lastHeartbeat: now };
180
+ }
163
181
  }
164
182
  exports.MulingstreamListenerManager = MulingstreamListenerManager;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mulingai-npm/redis",
3
- "version": "3.14.0",
3
+ "version": "3.15.0",
4
4
  "main": "dist/index.js",
5
5
  "types": "dist/index.d.ts",
6
6
  "repository": {