From daea0d8452e1220ac783b5a194b8b240d58cd747 Mon Sep 17 00:00:00 2001 From: Dmytro Kulyk Date: Tue, 28 Jul 2020 14:39:02 +0300 Subject: [PATCH 1/3] Increases speed for filtering unique members. --- src/channels/presence-channel.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/channels/presence-channel.ts b/src/channels/presence-channel.ts index 7b618720..fd7d6c58 100644 --- a/src/channels/presence-channel.ts +++ b/src/channels/presence-channel.ts @@ -1,6 +1,5 @@ import { Database } from './../database'; import { Log } from './../log'; -var _ = require("lodash"); export class PresenceChannel { /** @@ -94,7 +93,9 @@ export class PresenceChannel { this.db.set(channel + ":members", members); - members = _.uniqBy(members.reverse(), "user_id"); + members = members.filter((m) => { + return m.user_id !== member.user_id || m.socketId === member.socketId + }); this.onSubscribed(socket, channel, members); From 15d9f1a94b3395b22c34aac33caefe1bcea76143 Mon Sep 17 00:00:00 2001 From: Dmytro Kulyk Date: Tue, 28 Jul 2020 22:32:33 +0300 Subject: [PATCH 2/3] Update presence-channel.ts --- src/channels/presence-channel.ts | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/channels/presence-channel.ts b/src/channels/presence-channel.ts index fd7d6c58..200ea4d0 100644 --- a/src/channels/presence-channel.ts +++ b/src/channels/presence-channel.ts @@ -93,9 +93,11 @@ export class PresenceChannel { this.db.set(channel + ":members", members); - members = members.filter((m) => { - return m.user_id !== member.user_id || m.socketId === member.socketId - }); + members = [ + ...members.reduce((map, m) => { + return map.set(m.user_id, m) + }, new Map()).values() + ] this.onSubscribed(socket, channel, members); From 50456860e6ac86e05ff6c3daa9f8f25331998595 Mon Sep 17 00:00:00 2001 From: Dmytro Kulyk Date: Tue, 28 Jul 2020 22:51:40 +0300 Subject: [PATCH 3/3] removed lodash requirements. --- package-lock.json | 6 ------ package.json | 2 -- src/api/http-api.ts | 18 ++++++++++-------- src/channels/presence-channel.ts | 6 +++--- 4 files changed, 13 insertions(+), 19 deletions(-) diff --git a/package-lock.json b/package-lock.json index 28800ade..b859ff58 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,12 +9,6 @@ "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==" }, - "@types/lodash": { - "version": "4.14.149", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.149.tgz", - "integrity": "sha512-ijGqzZt/b7BfzcK9vTrS6MFljQRPn5BFWOx8oE0GYxribu6uV+aA9zZuXI1zc/etK9E8nrgdoF2+LgUw7+9tJQ==", - "dev": true - }, "@types/node": { "version": "13.9.1", "resolved": "https://registry.npmjs.org/@types/node/-/node-13.9.1.tgz", diff --git a/package.json b/package.json index 335d2528..e1c128f9 100644 --- a/package.json +++ b/package.json @@ -27,13 +27,11 @@ "express": "^4.17.1", "inquirer": "^7.1.0", "ioredis": "^4.16.0", - "lodash": "^4.17.15", "request": "^2.88.2", "socket.io": "^2.3.0", "yargs": "^15.3.1" }, "devDependencies": { - "@types/lodash": "^4.14.149", "@types/node": "^13.9.1", "typescript": "^3.8.3" }, diff --git a/src/api/http-api.ts b/src/api/http-api.ts index 58477394..3651270d 100644 --- a/src/api/http-api.ts +++ b/src/api/http-api.ts @@ -1,6 +1,5 @@ import { Log } from './../log'; let url = require('url'); -import * as _ from 'lodash'; export class HttpApi { /** @@ -129,8 +128,10 @@ export class HttpApi { }; if (this.channel.isPresence(channelName)) { - this.channel.presence.getMembers(channelName).then(members => { - result['user_count'] = _.uniqBy(members, 'user_id').length; + this.channel.presence.getMembers(channelName).then((members: any[]) => { + result['user_count'] = members.reduce( + (map, member) => map.set(member.user_id, member), new Map() + ).size; res.json(result); }); @@ -158,11 +159,12 @@ export class HttpApi { } this.channel.presence.getMembers(channelName).then(members => { - let users = []; - - _.uniqBy(members, 'user_id').forEach((member: any) => { - users.push({ id: member.user_id, user_info: member.user_info }); - }); + let users = [ + ...members.reduce((map, member) => map.set(member.user_id, { + id: member.user_id, + user_info: member.user_info + }), new Map()) + ] res.json({ users: users }); }, error => Log.error(error)); diff --git a/src/channels/presence-channel.ts b/src/channels/presence-channel.ts index 200ea4d0..5454967f 100644 --- a/src/channels/presence-channel.ts +++ b/src/channels/presence-channel.ts @@ -94,9 +94,9 @@ export class PresenceChannel { this.db.set(channel + ":members", members); members = [ - ...members.reduce((map, m) => { - return map.set(m.user_id, m) - }, new Map()).values() + ...members.reduce( + (map, member) => map.set(member.user_id, member), new Map() + ).values() ] this.onSubscribed(socket, channel, members);