@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
|
-
|
|
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
|
|
100
|
-
// find the listener by token
|
|
101
|
-
const listener = await this.getListener(
|
|
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
|
|
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
|
|
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;
|