@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 (113 loc) • 4.35 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = exports.EventKeys = exports.AgentEvent = void 0;
var _storeKey = require("../store/store.key.js");
var _api = require("../api/api.js");
var _eventEmitter = _interopRequireDefault(require("./eventEmitter.js"));
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
// Predefined event keys
let EventKeys = exports.EventKeys = /*#__PURE__*/function (EventKeys) {
EventKeys["USER_DATA"] = "user_data";
EventKeys["SCREEN_STATE"] = "screen_state";
EventKeys["OFFER_STATE"] = "offer_state";
EventKeys["SCREEN_VIEW"] = "screen_view";
EventKeys["FORM_STATE"] = "form_state";
return EventKeys;
}({});
let AgentEvent = exports.AgentEvent = /*#__PURE__*/function (AgentEvent) {
AgentEvent["AGENT_CONNECTED"] = "agent_connected";
AgentEvent["AGENT_DISCONNECTED"] = "agent_disconnected";
AgentEvent["POPUP_MESSAGE_VISIBLE"] = "popup_message_visible";
return AgentEvent;
}({}); // // Event data structure for listener events
// export interface EmbedEventData {
// timestamp: number; // Unix timestamp when event occurred
// value: boolean; // Boolean state (connected/visible = true)
// metadata?: {
// // Additional context data
// connectionState?: string; // LiveKit connection state
// roomId?: string; // Voice room identifier
// trigger?: 'user_interaction' | 'auto_open' | 'call_ended';
// previousState?: boolean; // Previous state before change
// // ... other contextual information
// [key: string]: any;
// };
// }
// Listener callback type
// export type EmbedEventListener = (data: EmbedEventData) => void;
class Embed {
events = {};
event = new _eventEmitter.default();
userDataInitialized = false;
// Automatically adds a default listener if none exists
// private ensureDefaultListener(eventKey: EventKeys) {
// if (!this.events[eventKey]) {
// this.events[eventKey] = [
// (data: any) => {
// // todo: handle default event
// console.log('default event', eventKey, data);
// },
// ];
// }
// }
async Event(eventKey, data) {
console.log('eventKey', eventKey, data);
if (!Object.values(EventKeys).includes(eventKey)) {
// todo: handle invalid event key
throw new Error(`Invalid event key: ${eventKey}. Must be one of: ${Object.values(EventKeys).join(', ')}`);
}
const key = eventKey;
// Restrict all events except USER_DATA until USER_DATA is initialized
if (key !== EventKeys.USER_DATA && !this.userDataInitialized) {
throw new Error(`Cannot trigger ${eventKey} event. USER_DATA event must be triggered first to initialize user identity.`);
}
if (key !== EventKeys.USER_DATA) {
const userIdentity = await (0, _storeKey.getAgentData)(EventKeys.USER_DATA);
if (userIdentity) {
data.app_user_id = userIdentity.app_user_id;
} else {
throw new Error('User identity not found');
}
}
// Ensure a default listener is registered if not already
// this.ensureDefaultListener(key);
// Trigger API call
try {
const apiService = _api.APIService.getInstance();
const response = await apiService.updateUserData({
eventKey: key,
data
});
if (!response.success) {
throw new Error(`Failed to trigger API for event: ${eventKey}`);
}
(0, _storeKey.setAgentData)(data, key);
// Mark USER_DATA as initialized after successful processing
if (key === EventKeys.USER_DATA) {
this.userDataInitialized = true;
}
} catch (error) {
console.log('data_Event_error', key, data);
throw new Error(`Failed to trigger API for event: ${eventKey}`);
// todo: handle error triggering API
}
// Trigger event listeners
this.events[key]?.forEach(callback => callback(data));
}
// Still allow custom listeners (optional)
on(eventKey, callback) {
if (!this.events[eventKey]) {
this.events[eventKey] = [];
}
this.events[eventKey]?.push(callback);
}
// Check if USER_DATA has been initialized
isUserDataInitialized() {
return this.userDataInitialized;
}
}
const embed = new Embed();
var _default = exports.default = embed;
//# sourceMappingURL=embed.event.js.map