@@ -41,6 +41,8 @@ import {
4141 extractArticleIdFromRoomName ,
4242 isValidRoomName ,
4343 parseRoomName ,
44+ resolvePresenceReaderId ,
45+ toPublicPresenceReader ,
4446} from './activity.util'
4547
4648interface ActivityPayloadWithRef {
@@ -346,12 +348,10 @@ export class ActivityService implements OnModuleInit, OnModuleDestroy {
346348 const socket = roomSockets [ index ]
347349 const socketMeta = roomSocketMetas [ index ]
348350
349- // Prefer the readerId resolved server-side from the HTTP session cookie
350- // (RolesGuard runs globally and fills request.readerId before this
351- // service runs). Fall back to the socket-handshake binding, and finally
352- // the client-provided value, both of which are less authoritative.
353- const resolvedReaderId =
354- RequestContext . currentReaderId ( ) || socketMeta ?. readerId || data . readerId
351+ const resolvedReaderId = resolvePresenceReaderId (
352+ RequestContext . currentReaderId ( ) ,
353+ socketMeta ?. readerId ,
354+ )
355355
356356 const presenceData : ActivityPresence = {
357357 ...data ,
@@ -360,6 +360,7 @@ export class ActivityService implements OnModuleInit, OnModuleDestroy {
360360 updatedAt : Date . now ( ) ,
361361 connectedAt : socketMeta ?. connectedAt ?? Date . now ( ) ,
362362 readerId : resolvedReaderId ,
363+ image : data . image ,
363364 ip,
364365 }
365366
@@ -370,12 +371,14 @@ export class ActivityService implements OnModuleInit, OnModuleDestroy {
370371 resolvedReaderId ,
371372 ] )
372373 if ( reader . length ) {
374+ const publicReader = toPublicPresenceReader ( reader [ 0 ] )
373375 Object . assign ( serializedPresenceData , {
374- reader : camelcaseKeys ( {
375- ...reader [ 0 ] ,
376- id : reader [ 0 ] . id . toString ( ) ,
377- } ) ,
376+ reader : camelcaseKeys ( publicReader ) ,
378377 } )
378+ if ( ! serializedPresenceData . image && publicReader . image ) {
379+ serializedPresenceData . image = publicReader . image
380+ presenceData . image = publicReader . image
381+ }
379382 }
380383 }
381384
0 commit comments