/** * API客户端 * 封装所有API调用,处理HTTP请求 */ class ApiClient { constructor(baseUrl = '') { this.baseUrl = baseUrl || location.origin; } /** * 获取通话信息 * @param {string} callId - 通话ID * @returns {Promise} 通话信息 */ async getCallInfo(callId) { try { const response = await fetch(`${this.baseUrl}/api/call/${callId}`); if (!response.ok) { throw new Error(`API error: ${response.status}`); } return await response.json(); } catch (error) { console.error('Error getting call info:', error); throw error; } } /** * 加入通话 * @param {string} callId - 通话ID * @returns {Promise} 加入结果 */ async joinCall(callId) { try { const response = await fetch(`${this.baseUrl}/api/call/${callId}/join`, { method: 'POST', headers: { 'Content-Type': 'application/json' } }); if (!response.ok) { throw new Error(`API error: ${response.status}`); } return await response.json(); } catch (error) { console.error('Error joining call:', error); throw error; } } /** * 离开通话 * @param {string} callId - 通话ID * @returns {Promise} 离开结果 */ async leaveCall(callId) { try { const response = await fetch(`${this.baseUrl}/api/call/${callId}/leave`, { method: 'POST', headers: { 'Content-Type': 'application/json' } }); if (!response.ok) { throw new Error(`API error: ${response.status}`); } return await response.json(); } catch (error) { console.error('Error leaving call:', error); throw error; } } /** * 更新媒体状态 * @param {string} callId - 通话ID * @param {Object} mediaState - 媒体状态 {audio?: boolean, video?: boolean} * @returns {Promise} 更新结果 */ async updateMediaState(callId, mediaState) { try { const response = await fetch(`${this.baseUrl}/api/call/${callId}/media`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(mediaState) }); if (!response.ok) { throw new Error(`API error: ${response.status}`); } return await response.json(); } catch (error) { console.error('Error updating media state:', error); throw error; } } /** * 获取历史消息 * @param {string} callId - 通话ID * @param {number} limit - 消息数量限制 * @param {string} before - 时间戳 * @returns {Promise} 消息列表 */ async getMessages(callId, limit = 50, before = null) { try { let url = `${this.baseUrl}/api/call/${callId}/messages?limit=${limit}`; if (before) { url += `&before=${before}`; } const response = await fetch(url); if (!response.ok) { throw new Error(`API error: ${response.status}`); } return await response.json(); } catch (error) { console.error('Error getting messages:', error); throw error; } } /** * 发送消息 * @param {string} callId - 通话ID * @param {string} content - 消息内容 * @param {string} type - 消息类型 * @returns {Promise} 发送结果 */ async sendMessage(callId, content, type = 'text') { try { const response = await fetch(`${this.baseUrl}/api/call/${callId}/message`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ content, type }) }); if (!response.ok) { throw new Error(`API error: ${response.status}`); } return await response.json(); } catch (error) { console.error('Error sending message:', error); throw error; } } } // 创建单例实例 const apiClient = new ApiClient(); export default apiClient;