@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
JavaScript
;
/**
* 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