UNPKG

@revrag-ai/embed-react-native

Version:

A powerful React Native library for integrating AI-powered voice agents into mobile applications. Features real-time voice communication, intelligent speech processing, customizable UI components, and comprehensive event handling for building conversation

123 lines (107 loc) 3.18 kB
"use strict"; /** * Embed Event Manager * Main class for managing embed events and agent communication */ import { getAgentData, setAgentData } from "../store/store.key.js"; import { APIService } from "../api/api.js"; import { buildEventPayload } from "../utils/constant.js"; import { AgentEventEmitter } from "./agent-event-emitter.js"; import { validateEventKey, validateAnalyticsEvent } from "./embed.validators.js"; class Embed { events = {}; // Agent event emitter for listening to agent state changes constructor() { this.event = new AgentEventEmitter(); } /** * Automatically adds a default listener if none exists * @private */ ensureDefaultListener(eventKey) { if (!this.events[eventKey]) { this.events[eventKey] = [_data => { // console.i('default event this', _data); // todo: handle default event }]; } } /** * Enriches event data with user identity * @private */ async enrichEventData(eventKey, data) { if (eventKey !== 'user_data') { const userIdentity = await getAgentData('user_data'); if (userIdentity) { data.app_user_id = userIdentity.app_user_id; } else { throw new Error('User identity not found'); } } } /** * Sends event data to the backend API * @private */ async sendEventToAPI(eventKey, data, key) { try { const apiService = APIService.getInstance(); const paramsData = buildEventPayload({ ...data, eventKey: key }); // Validate analytics events have event_name validateAnalyticsEvent(paramsData); const response = await apiService.updateUserData({ ...paramsData }); if (!response.success) { throw new Error(`Failed to trigger API for event: ${eventKey}`); } setAgentData(data, key); } catch (error) { throw new Error(`Failed to trigger API for event: ${eventKey}`); } } /** * Triggers local event listeners * @private */ triggerEventListeners(key, data) { this.events[key]?.forEach(callback => callback(data)); } /** * Send an event to the AI agent * @param eventKey - The event type to send * @param data - Event data payload */ async Event(eventKey, data) { // Validate event key validateEventKey(eventKey); const key = eventKey; // Enrich event data with user identity await this.enrichEventData(key, data); // Ensure a default listener is registered this.ensureDefaultListener(key); // Send event to backend API await this.sendEventToAPI(eventKey, data, key); // Trigger local event listeners this.triggerEventListeners(key, data); } /** * Add listener for data events (legacy support) * @deprecated Use event.on() for agent events instead */ on(eventKey, callback) { if (!this.events[eventKey]) { this.events[eventKey] = []; } this.events[eventKey]?.push(callback); } } const embed = new Embed(); export default embed; // Re-export types and enums for convenience export { EventKeys, AgentEvent } from "./embed.types.js"; //# sourceMappingURL=embed.event.js.map