Skip to content

Commit c180d53

Browse files
committed
refactor: simplify logic & separate tests
1 parent e2f9049 commit c180d53

File tree

14 files changed

+388
-372
lines changed

14 files changed

+388
-372
lines changed

apps/meteor/server/methods/userPresence.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ declare module '@rocket.chat/ddp-client' {
99
'UserPresence:setDefaultStatus'(status: UserStatus): boolean | undefined;
1010
'UserPresence:online'(): boolean | undefined;
1111
'UserPresence:away'(): boolean | undefined;
12-
'UserPresence:renew'(): void | undefined;
12+
'UserPresence:ping'(): boolean | undefined;
1313
}
1414
}
1515

@@ -26,20 +26,20 @@ Meteor.methods<ServerMethods>({
2626
if (!userId || !connection) {
2727
return;
2828
}
29-
return Presence.setConnectionStatus(userId, UserStatus.ONLINE, connection.id);
29+
return Presence.setConnectionStatus(userId, connection.id, UserStatus.ONLINE);
3030
},
3131
'UserPresence:away'() {
3232
const { userId, connection } = this;
3333
if (!userId || !connection) {
3434
return;
3535
}
36-
return Presence.setConnectionStatus(userId, UserStatus.AWAY, connection.id);
36+
return Presence.setConnectionStatus(userId, connection.id, UserStatus.AWAY);
3737
},
38-
'UserPresence:renew'() {
38+
'UserPresence:ping'() {
3939
const { connection, userId } = this;
4040
if (!userId || !connection) {
4141
return;
4242
}
43-
return Presence.renewConnection(userId, connection.id);
43+
return Presence.setConnectionStatus(userId, connection.id);
4444
},
4545
});

ee/apps/ddp-streamer/src/DDPStreamer.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -221,7 +221,7 @@ export class DDPStreamer extends ServiceClass {
221221
if (!userId) {
222222
return;
223223
}
224-
Presence.renewConnection(userId, connection.id);
224+
Presence.setConnectionStatus(userId, connection.id);
225225
});
226226
}
227227

ee/apps/ddp-streamer/src/configureServer.ts

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -121,14 +121,21 @@ server.methods({
121121
if (!userId) {
122122
return;
123123
}
124-
return Presence.setConnectionStatus(userId, UserStatus.ONLINE, session);
124+
return Presence.setConnectionStatus(userId, session, UserStatus.ONLINE);
125125
},
126126
'UserPresence:away'() {
127127
const { userId, session } = this;
128128
if (!userId) {
129129
return;
130130
}
131-
return Presence.setConnectionStatus(userId, UserStatus.AWAY, session);
131+
return Presence.setConnectionStatus(userId, session, UserStatus.AWAY);
132+
},
133+
'UserPresence:ping'() {
134+
const { userId, session } = this;
135+
if (!userId) {
136+
return;
137+
}
138+
return Presence.setConnectionStatus(userId, session);
132139
},
133140
'setUserStatus'(status, statusText) {
134141
const { userId } = this;

ee/packages/presence/src/Presence.ts

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import type { IUser } from '@rocket.chat/core-typings';
44
import { UserStatus } from '@rocket.chat/core-typings';
55
import { Settings, Users, UsersSessions } from '@rocket.chat/models';
66

7-
import { processPresenceAndStatus } from './lib/processConnectionStatus';
7+
import { processPresenceAndStatus } from './processPresenceAndStatus';
88

99
const MAX_CONNECTIONS = 200;
1010

@@ -128,7 +128,6 @@ export class Presence extends ServiceClass implements IPresence {
128128
id: session,
129129
instanceId: nodeId,
130130
status: UserStatus.ONLINE,
131-
expiresAt: new Date(Date.now() + 5 * 60 * 1000),
132131
});
133132

134133
await this.updateUserPresence(uid);
@@ -181,10 +180,6 @@ export class Presence extends ServiceClass implements IPresence {
181180
return affectedUsers.map(({ _id }) => _id);
182181
}
183182

184-
async renewConnection(uid: string, connectionId: string): Promise<void> {
185-
await UsersSessions.renewConnectionStatusById(uid, connectionId, new Date(Date.now() + 5 * 60 * 1000));
186-
}
187-
188183
async setStatus(uid: string, statusDefault: UserStatus, statusText?: string): Promise<boolean> {
189184
const userSessions = (await UsersSessions.findOneById(uid)) || { connections: [] };
190185

@@ -208,7 +203,7 @@ export class Presence extends ServiceClass implements IPresence {
208203
return !!result.modifiedCount;
209204
}
210205

211-
async setConnectionStatus(uid: string, status: UserStatus, session: string): Promise<boolean> {
206+
async setConnectionStatus(uid: string, session: string, status?: UserStatus): Promise<boolean> {
212207
const result = await UsersSessions.updateConnectionStatusById(uid, session, status);
213208

214209
await this.updateUserPresence(uid);
Lines changed: 0 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import type { IUserSessionConnection } from '@rocket.chat/core-typings';
21
import { UserStatus } from '@rocket.chat/core-typings';
32

43
/**
@@ -13,39 +12,3 @@ export const processConnectionStatus = (current: UserStatus, status: UserStatus)
1312
}
1413
return current;
1514
};
16-
17-
/**
18-
* Defines user's status based on presence and connection status
19-
*/
20-
export const processStatus = (statusConnection: UserStatus, statusDefault: UserStatus): UserStatus => {
21-
if (statusConnection === UserStatus.OFFLINE) {
22-
return statusConnection;
23-
}
24-
25-
if (statusDefault === UserStatus.ONLINE) {
26-
return statusConnection;
27-
}
28-
29-
return statusDefault;
30-
};
31-
32-
/**
33-
* Defines user's status and connection status based on user's connections and default status
34-
*/
35-
export const processPresenceAndStatus = (
36-
userSessions: IUserSessionConnection[] = [],
37-
statusDefault = UserStatus.ONLINE,
38-
currentDate = new Date(),
39-
): { status: UserStatus; statusConnection: UserStatus } => {
40-
const statusConnection = userSessions
41-
.filter((s) => s.expiresAt > currentDate)
42-
.map((s) => s.status)
43-
.reduce(processConnectionStatus, UserStatus.OFFLINE);
44-
45-
const status = processStatus(statusConnection, statusDefault);
46-
47-
return {
48-
status,
49-
statusConnection,
50-
};
51-
};
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import { UserStatus } from '@rocket.chat/core-typings';
2+
3+
/**
4+
* Defines user's status based on presence and connection status
5+
*/
6+
export const processStatus = (statusConnection: UserStatus, statusDefault: UserStatus): UserStatus => {
7+
if (statusConnection === UserStatus.OFFLINE) {
8+
return statusConnection;
9+
}
10+
11+
if (statusDefault === UserStatus.ONLINE) {
12+
return statusConnection;
13+
}
14+
15+
return statusDefault;
16+
};
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
import type { IUserSessionConnection } from '@rocket.chat/core-typings';
2+
import { UserStatus } from '@rocket.chat/core-typings';
3+
4+
import { processConnectionStatus } from './lib/processConnectionStatus';
5+
import { processStatus } from './lib/processStatus';
6+
7+
const isAtMostFiveMinutesAgo = (userSession: IUserSessionConnection): boolean => {
8+
const now = Date.now();
9+
const diff = now - userSession._updatedAt.getTime();
10+
return diff <= 300_000; // 5 minutes in milliseconds
11+
};
12+
13+
/**
14+
* Defines user's status and connection status based on user's connections and default status
15+
*/
16+
export const processPresenceAndStatus = (
17+
userSessions: IUserSessionConnection[] = [],
18+
statusDefault = UserStatus.ONLINE,
19+
): { status: UserStatus; statusConnection: UserStatus } => {
20+
const statusConnection = userSessions
21+
.filter(isAtMostFiveMinutesAgo)
22+
.map((s) => s.status)
23+
.reduce(processConnectionStatus, UserStatus.OFFLINE);
24+
25+
const status = processStatus(statusConnection, statusDefault);
26+
27+
return {
28+
status,
29+
statusConnection,
30+
};
31+
};

0 commit comments

Comments
 (0)