classroom.ts 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. import axios from 'axios';
  2. const API_BASE_URL = '/api';
  3. // Token API 相关类型定义
  4. interface IMTokenResponse {
  5. nonce: string;
  6. token: string;
  7. appId: string;
  8. appSign: string;
  9. timestamp: number;
  10. }
  11. interface RTCTokenResponse {
  12. token: string;
  13. appId: string;
  14. timestamp: number;
  15. }
  16. interface TokenError {
  17. message: string;
  18. code?: number;
  19. }
  20. // 课堂相关API
  21. export const ClassroomAPI = {
  22. /**
  23. * 获取IM Token
  24. * @param userId 用户ID
  25. * @param role 用户角色 (admin/student)
  26. * @returns Promise<string> 返回IM Token
  27. * @throws {TokenError} 获取失败时抛出错误
  28. */
  29. getIMToken: async (userId: string, role: string): Promise<IMTokenResponse> => {
  30. try {
  31. const response = await axios.post(`${API_BASE_URL}/classroom/im_token`, {
  32. userId,
  33. role
  34. });
  35. if (!response.data.token) {
  36. throw new Error('Invalid token response');
  37. }
  38. return response.data;
  39. } catch (error) {
  40. console.error('Failed to get IM token:', error);
  41. throw new Error('Failed to get IM token');
  42. }
  43. },
  44. /**
  45. * 获取RTC Token
  46. * @param channelId 频道ID
  47. * @param userId 用户ID
  48. * @returns Promise<string> 返回RTC Token
  49. * @throws {TokenError} 获取失败时抛出错误
  50. */
  51. getRTCToken: async (channelId: string, userId: string): Promise<RTCTokenResponse> => {
  52. try {
  53. const response = await axios.post(`${API_BASE_URL}/classroom/rtc_token`, {
  54. channelId,
  55. userId
  56. });
  57. if (!response.data.token) {
  58. throw new Error('Invalid token response');
  59. }
  60. return response.data;
  61. } catch (error) {
  62. console.error('Failed to get RTC token:', error);
  63. throw new Error('Failed to get RTC token');
  64. }
  65. }
  66. };