1- import { useMemo } from 'react' ;
2- // import type TypedEventEmitter from 'typed-emitter';
1+ import { useEffect , useMemo , useRef } from 'react' ;
2+ import type TypedEventEmitter from 'typed-emitter' ;
33import { SendTextOptions } from 'livekit-client' ;
4- // import { EventEmitter } from "events";
4+ import { EventEmitter } from "events" ;
55import {
66 ReceivedMessage ,
77 ReceivedChatMessage ,
@@ -25,10 +25,9 @@ export type UseSessionMessagesReturn = {
2525
2626 send : ( message : string , options ?: SendTextOptions ) => Promise < ReceivedChatMessage > ;
2727
28- // FIXME: does there need to be a way to subscribe to individual messages?
29- // internal: {
30- // emitter: TypedEventEmitter<MessagesCallbacks>;
31- // };
28+ internal : {
29+ emitter : TypedEventEmitter < MessagesCallbacks > ;
30+ } ;
3231} ;
3332
3433/** @public */
@@ -46,6 +45,8 @@ export type MessagesCallbacks = {
4645export function useSessionMessages ( session ?: UseSessionReturn ) : UseSessionMessagesReturn {
4746 const { room } = useEnsureSession ( session ) ;
4847
48+ const emitter = useMemo ( ( ) => new EventEmitter ( ) as TypedEventEmitter < MessagesCallbacks > , [ ] ) ;
49+
4950 const agent = useAgent ( session ) ;
5051
5152 const transcriptions : Array < TextStreamData > = useTranscriptions ( { room } ) ;
@@ -105,11 +106,24 @@ export function useSessionMessages(session?: UseSessionReturn): UseSessionMessag
105106 return merged . sort ( ( a , b ) => a . timestamp - b . timestamp ) ;
106107 } , [ transcriptionMessages , chat . chatMessages ] ) ;
107108
109+ const previouslyReceivedMessageIdsRef = useRef ( new Set ( ) ) ;
110+ useEffect ( ( ) => {
111+ for ( const message of receivedMessages ) {
112+ if ( previouslyReceivedMessageIdsRef . current . has ( message . id ) ) {
113+ continue ;
114+ }
115+
116+ previouslyReceivedMessageIdsRef . current . add ( message . id ) ;
117+ emitter . emit ( MessagesEvent . MessageReceived , message ) ;
118+ }
119+ } , [ receivedMessages ] ) ;
120+
108121 return useMemo (
109122 ( ) => ( {
110123 messages : receivedMessages ,
111124 send : chat . send ,
112125 isSending : chat . isSending ,
126+ internal : { emitter } ,
113127 } ) ,
114128 [ receivedMessages , chat . send , chat . isSending ] ,
115129 ) ;
0 commit comments