diff --git a/apps/api/src/controllers/live.controller.ts b/apps/api/src/controllers/live.controller.ts index 214576ce..76d4f993 100644 --- a/apps/api/src/controllers/live.controller.ts +++ b/apps/api/src/controllers/live.controller.ts @@ -76,7 +76,7 @@ export function wsVisitors( const { params } = req; getRedisSub().subscribe('event:received'); - getRedisSub().psubscribe('__key*:expired'); + getRedisSub().psubscribe('__keyevent@0__:expired'); const message = (channel: string, message: string) => { if (channel === 'event:received') { @@ -89,6 +89,10 @@ export function wsVisitors( } }; const pmessage = (pattern: string, channel: string, message: string) => { + if (!message.startsWith('live:visitors:')) { + return null; + } + const [projectId] = getLiveEventInfo(message); if (projectId && projectId === params.projectId) { getLiveVisitors(params.projectId).then((count) => { @@ -102,7 +106,7 @@ export function wsVisitors( connection.socket.on('close', () => { getRedisSub().unsubscribe('event:saved'); - getRedisSub().punsubscribe('__key*:expired'); + getRedisSub().punsubscribe('__keyevent@0__:expired'); getRedisSub().off('message', message); getRedisSub().off('pmessage', pmessage); }); diff --git a/packages/db/src/buffers/event-buffer-redis.ts b/packages/db/src/buffers/event-buffer-redis.ts index 8478f4bf..122b3bf8 100644 --- a/packages/db/src/buffers/event-buffer-redis.ts +++ b/packages/db/src/buffers/event-buffer-redis.ts @@ -246,12 +246,8 @@ return "OK" } if (event.profile_id) { - multi.set( - `live:event:${event.project_id}:${event.profile_id}`, - '', - 'EX', - 60 * 5, - ); + multi.sadd(`live:visitors:${event.project_id}`, event.profile_id); + multi.expire(`live:visitors:${event.project_id}`, 60 * 5); // 5 minutes } if (!_multi) { diff --git a/packages/db/src/services/event.service.ts b/packages/db/src/services/event.service.ts index 0a4ced6d..d2d78497 100644 --- a/packages/db/src/services/event.service.ts +++ b/packages/db/src/services/event.service.ts @@ -235,8 +235,7 @@ export function transformMinimalEvent( } export async function getLiveVisitors(projectId: string) { - const keys = await getRedisCache().keys(`live:event:${projectId}:*`); - return keys.length; + return getRedisCache().scard(`live:visitors:${projectId}`); } export async function getEvents(