@anam-ai/js-sdk
Version:
Client side JavaScript SDK for Anam AI
70 lines • 3.15 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.MessageHistoryClient = void 0;
const types_1 = require("../types");
class MessageHistoryClient {
constructor(publicEventEmitter, internalEventEmitter) {
this.messages = [];
this.publicEventEmitter = publicEventEmitter;
this.internalEventEmitter = internalEventEmitter;
// register for events
this.internalEventEmitter.addListener(types_1.InternalEvent.WEBRTC_CHAT_MESSAGE_RECEIVED, this.processWebRtcTextMessageEvent.bind(this));
}
webRtcTextMessageEventToMessageStreamEvent(event) {
return {
id: `${event.role}::${event.message_id}`, // id is the same for persona and user for a single question response, so we need to differentiate them
content: event.content,
role: event.role,
endOfSpeech: event.end_of_speech,
interrupted: event.interrupted,
};
}
processUserMessage(messageEvent) {
// each user message is added directly to the history
// user messages can not be interrupted
const userMessage = {
id: messageEvent.id,
content: messageEvent.content,
role: messageEvent.role,
};
this.messages.push(userMessage);
}
processPersonaMessage(messageEvent) {
const personaMessage = {
id: messageEvent.id,
content: messageEvent.content,
role: messageEvent.role,
interrupted: messageEvent.interrupted,
};
// check for existing message in the history
const existingMessageIndex = this.messages.findIndex((m) => m.id === personaMessage.id);
if (existingMessageIndex !== -1) {
const existingMessage = this.messages[existingMessageIndex];
// update the existing message
this.messages[existingMessageIndex] = Object.assign(Object.assign({}, existingMessage), { content: existingMessage.content + personaMessage.content, interrupted: existingMessage.interrupted || personaMessage.interrupted });
}
else {
// add the new persona message to the history
this.messages.push(personaMessage);
}
}
processWebRtcTextMessageEvent(event) {
const messageStreamEvent = this.webRtcTextMessageEventToMessageStreamEvent(event);
// pass to callback stream
this.publicEventEmitter.emit(types_1.AnamEvent.MESSAGE_STREAM_EVENT_RECEIVED, messageStreamEvent);
// update the message history
switch (messageStreamEvent.role) {
case types_1.MessageRole.USER:
this.processUserMessage(messageStreamEvent);
break;
case types_1.MessageRole.PERSONA:
this.processPersonaMessage(messageStreamEvent);
break;
}
if (messageStreamEvent.endOfSpeech) {
this.publicEventEmitter.emit(types_1.AnamEvent.MESSAGE_HISTORY_UPDATED, this.messages);
}
}
}
exports.MessageHistoryClient = MessageHistoryClient;
//# sourceMappingURL=MessageHistoryClient.js.map
;