@easemob-community/callkit-vue3 2.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +208 -0
  3. package/dist/callkit-vue3.css +1 -0
  4. package/dist/components/EasemobChatCallKitProvider.vue.d.ts +18 -0
  5. package/dist/components/EasemobChatMiniWindow.vue.d.ts +11 -0
  6. package/dist/components/InvitationNotification.vue.d.ts +2 -0
  7. package/dist/components/multiCall/EasemobChatGroupMemberList.vue.d.ts +19 -0
  8. package/dist/components/multiCall/EasemobChatMultiCall.vue.d.ts +69 -0
  9. package/dist/components/singleCall/CallControls.vue.d.ts +18 -0
  10. package/dist/components/singleCall/CallInfoBar.vue.d.ts +5 -0
  11. package/dist/components/singleCall/EasemobChatCallStream.vue.d.ts +12 -0
  12. package/dist/components/singleCall/EasemobChatCallWaiting.vue.d.ts +10 -0
  13. package/dist/components/singleCall/EasemobChatSingleCall.vue.d.ts +28 -0
  14. package/dist/composables/useAnswerCall.d.ts +10 -0
  15. package/dist/composables/useCallKit.d.ts +2 -0
  16. package/dist/composables/useCallKitCore.d.ts +998 -0
  17. package/dist/composables/useCallKitEvents.d.ts +42 -0
  18. package/dist/composables/useDraggable.d.ts +90 -0
  19. package/dist/composables/useEndCall.d.ts +15 -0
  20. package/dist/composables/useParticipants.d.ts +15 -0
  21. package/dist/composables/useRtcService.d.ts +80 -0
  22. package/dist/config/assets.d.ts +43 -0
  23. package/dist/core/events/CallKitEventBus.d.ts +40 -0
  24. package/dist/core/events/helpers.d.ts +59 -0
  25. package/dist/core/events/types.d.ts +264 -0
  26. package/dist/core/sdk/imSDK/index.d.ts +4 -0
  27. package/dist/index.d.ts +33 -0
  28. package/dist/index.js +7806 -0
  29. package/dist/index.umd.js +72 -0
  30. package/dist/modules/groupCall/components/CallKitIcon.vue.d.ts +12 -0
  31. package/dist/modules/groupCall/components/GroupCallShell.vue.d.ts +34 -0
  32. package/dist/modules/groupCall/components/MainVideoLayout.vue.d.ts +32 -0
  33. package/dist/modules/groupCall/components/ParticipantTile.vue.d.ts +12 -0
  34. package/dist/modules/groupCall/components/VideoGrid.vue.d.ts +29 -0
  35. package/dist/modules/groupCall/components/iconRegistry.d.ts +2 -0
  36. package/dist/modules/groupCall/index.d.ts +7 -0
  37. package/dist/modules/groupCall/media/RtcMediaBridge.d.ts +26 -0
  38. package/dist/modules/groupCall/signaling/GroupCallSignalingAdapter.d.ts +29 -0
  39. package/dist/modules/groupCall/types.d.ts +37 -0
  40. package/dist/modules/groupCall/viewModel/GroupCallStore.d.ts +345 -0
  41. package/dist/modules/groupCall/viewModel/useGroupCallViewModel.d.ts +35 -0
  42. package/dist/services/CallService.d.ts +15 -0
  43. package/dist/services/RtcAdapter.d.ts +11 -0
  44. package/dist/services/RtcService.d.ts +187 -0
  45. package/dist/services/UserProfileService.d.ts +38 -0
  46. package/dist/store/callTimer.d.ts +33 -0
  47. package/dist/store/chatClient.d.ts +5335 -0
  48. package/dist/store/globalCall.d.ts +34 -0
  49. package/dist/store/index.d.ts +1 -0
  50. package/dist/store/rtcChannel.d.ts +42 -0
  51. package/dist/store/types.d.ts +50 -0
  52. package/dist/types/callstate.types.d.ts +61 -0
  53. package/dist/types/signal.types.d.ts +187 -0
  54. package/dist/types.d.ts +103 -0
  55. package/dist/utils/callUtils.d.ts +15 -0
  56. package/dist/utils/imSdkAdapter.d.ts +29 -0
  57. package/dist/utils/index.d.ts +2 -0
  58. package/dist/utils/logger.d.ts +122 -0
  59. package/dist/utils/loggerDb.d.ts +41 -0
  60. package/dist/utils/ringtone.d.ts +20 -0
  61. package/dist/vite-env.d.ts +12 -0
  62. package/package.json +60 -0
@@ -0,0 +1,34 @@
1
+ /**
2
+ * GlobalCallStore
3
+ * 跨通话域的共享状态:用户资料映射、窗口模式等
4
+ * 单聊/群聊共用,但不属于任何特定通话域
5
+ */
6
+ export declare const useGlobalCallStore: import('pinia').StoreDefinition<"globalCall", {
7
+ userInfoMap: Map<string, {
8
+ nickname?: string;
9
+ avatarURL?: string;
10
+ }>;
11
+ isMinimized: boolean;
12
+ }, {
13
+ getUserInfo(): (userId: string) => {
14
+ nickname?: string;
15
+ avatarURL?: string;
16
+ };
17
+ getIsMinimized(): boolean;
18
+ }, {
19
+ setUserInfo(userId: string, userInfo: {
20
+ nickname?: string;
21
+ avatarURL?: string;
22
+ }): void;
23
+ /**
24
+ * 批量设置用户信息
25
+ */
26
+ batchSetUserInfo(entries: Array<{
27
+ userId: string;
28
+ userInfo: {
29
+ nickname?: string;
30
+ avatarURL?: string;
31
+ };
32
+ }>): void;
33
+ setMinimized(value: boolean): void;
34
+ }>;
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,42 @@
1
+ import { IAgoraRTCClient } from 'agora-rtc-sdk-ng';
2
+ import { RtcChannelState } from './types';
3
+ import { RtcService } from '../services/RtcService';
4
+ /**
5
+ * RtcChannelStore(简化版)
6
+ * 职责:管理 RtcService 单例、本地媒体流状态、音视频开关状态
7
+ * 注意:频道管理、远程流管理已由 RtcService / GroupCallStore 负责
8
+ */
9
+ export declare const useRtcChannelStore: import('pinia').StoreDefinition<"rtcChannel", RtcChannelState, {}, {
10
+ /**
11
+ * 获取RTC服务实例(从模块级变量读取,非 state)
12
+ */
13
+ getRtcService(): RtcService | null;
14
+ /**
15
+ * 初始化RTC服务
16
+ */
17
+ initializeRtcService(agoraAppId: string, agoraClient?: IAgoraRTCClient): Promise<void>;
18
+ /**
19
+ * 销毁RTC服务
20
+ */
21
+ destroyRtcService(): Promise<void>;
22
+ /**
23
+ * 设置连接状态
24
+ */
25
+ setConnected(connected: boolean): void;
26
+ /**
27
+ * 设置本地媒体流
28
+ */
29
+ setLocalStream(stream: MediaStream | null): void;
30
+ /**
31
+ * 启用/禁用音频
32
+ */
33
+ setAudioEnabled(enabled: boolean): void;
34
+ /**
35
+ * 启用/禁用视频
36
+ */
37
+ setVideoEnabled(enabled: boolean): void;
38
+ /**
39
+ * 重置所有RTC状态
40
+ */
41
+ reset(): void;
42
+ }>;
@@ -0,0 +1,50 @@
1
+ import { Chat } from '../core/sdk/imSDK';
2
+ import { CALL_STATUS, CALL_INFO, CALL_TYPE } from '../types/callstate.types';
3
+ export type CallStatus = CALL_STATUS;
4
+ export interface ChatClientState {
5
+ client: Chat.Connection | null;
6
+ /** 是否使用环信 IM SDK miniCore 版本(插件模式) */
7
+ isMiniCore: boolean;
8
+ }
9
+ export interface CallParticipant {
10
+ userId: string;
11
+ nickname?: string;
12
+ avatar?: string;
13
+ isAudioEnabled: boolean;
14
+ isVideoEnabled: boolean;
15
+ isLocalUser: boolean;
16
+ joinedAt: number;
17
+ }
18
+ export interface CurrentCallInfo {
19
+ callId: string;
20
+ callerId: string;
21
+ calleeIds: string[];
22
+ callType: "audio" | "video";
23
+ startTime: number;
24
+ duration: number;
25
+ status: CallStatus;
26
+ participants: CallParticipant[];
27
+ isGroupCall: boolean;
28
+ channelId?: string;
29
+ }
30
+ export interface INVITE_INFO {
31
+ type: CALL_TYPE;
32
+ calleeUserId: string;
33
+ groupId?: string;
34
+ groupName?: string;
35
+ groupAvatar?: string;
36
+ invitedMembers?: string[];
37
+ }
38
+ export interface CallState extends CALL_INFO {
39
+ status: CallStatus;
40
+ callType: "audio" | "video" | null;
41
+ inviteTimeout?: number;
42
+ inviteTimeoutTimer?: any | null;
43
+ }
44
+ export interface RtcChannelState {
45
+ isConnected: boolean;
46
+ localStream: MediaStream | null;
47
+ audioEnabled: boolean;
48
+ videoEnabled: boolean;
49
+ agoraAppId: string | null;
50
+ }
@@ -0,0 +1,61 @@
1
+ export type CallMode = "audio" | "video" | "group";
2
+ export type CALL_STATUS_NAME = "idle" | "inviting" | "ringing" | "connecting" | "connected" | "ended";
3
+ export type CALL_STATUS = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7;
4
+ export declare const CALL_STATUS: {
5
+ readonly IDLE: 0;
6
+ readonly INVITING: 1;
7
+ readonly ALERTING: 2;
8
+ readonly CONFIRM_RING: 3;
9
+ readonly RECEIVED_CONFIRM_RING: 4;
10
+ readonly ANSWER_CALL: 5;
11
+ readonly CONFIRM_CALLEE: 6;
12
+ readonly IN_CALL: 7;
13
+ };
14
+ export type CALLKIT_CMD_MSG_RESULT_TYPE = "accept" | "refuse" | "busy";
15
+ export declare const CALLKIT_CMD_MSG_RESULT_TYPE: {
16
+ readonly ACCEPT: "accept";
17
+ readonly REFUSE: "refuse";
18
+ readonly BUSY: "busy";
19
+ };
20
+ export type CALLKIT_ACTION_MSG_TYPE = "rtcCallWithAgora";
21
+ export type CALLKIT_TEXT_MSG_ACTION = "invite";
22
+ export type CALLKIT_CMD_MSG_ACTION_TYPE = "confirmRing" | "alert" | "answerCall" | "leaveCall" | "confirmCallee" | "cancelCall";
23
+ export type CALL_TYPE = 0 | 1 | 2 | 3;
24
+ export declare const CALL_TYPE: {
25
+ readonly AUDIO_1V1: 0;
26
+ readonly VIDEO_1V1: 1;
27
+ readonly VIDEO_MULTI: 2;
28
+ readonly AUDIO_MULTI: 3;
29
+ };
30
+ export interface CALL_INFO {
31
+ callId: string;
32
+ channel: string;
33
+ token?: string;
34
+ type: CALL_TYPE;
35
+ callerDevId: string;
36
+ calleeDevId?: string;
37
+ callerUserId: string;
38
+ calleeUserId?: string;
39
+ groupId?: string;
40
+ groupName?: string;
41
+ groupAvatar?: string;
42
+ callerNickname?: string;
43
+ invitedMembers?: string[];
44
+ joinedMembers?: any[];
45
+ inviteMessageId?: string;
46
+ duration?: string;
47
+ state?: CALL_STATUS;
48
+ }
49
+ export type HANGUP_REASON = "hangup" | "cancel" | "remoteCancel" | "refuse" | "remoteRefuse" | "busy" | "noResponse" | "remoteNoResponse" | "handleOnOtherDevice" | "abnormalEnd";
50
+ export declare const HANGUP_REASON: {
51
+ readonly HANGUP: "hangup";
52
+ readonly CANCEL: "cancel";
53
+ readonly REMOTE_CANCEL: "remoteCancel";
54
+ readonly REFUSE: "refuse";
55
+ readonly REMOTE_REFUSE: "remoteRefuse";
56
+ readonly BUSY: "busy";
57
+ readonly NO_RESPONSE: "noResponse";
58
+ readonly REMOTE_NO_RESPONSE: "remoteNoResponse";
59
+ readonly HANDLE_ON_OTHER_DEVICE: "handleOnOtherDevice";
60
+ readonly ABNORMAL_END: "abnormalEnd";
61
+ };
@@ -0,0 +1,187 @@
1
+ import { CALL_TYPE, CALLKIT_ACTION_MSG_TYPE } from './callstate.types';
2
+ export interface SignalMessageInviteExt {
3
+ action: "invite";
4
+ callId: string;
5
+ calleeIMName: string;
6
+ callerDevId: string;
7
+ callerIMName: string;
8
+ channelName: string;
9
+ chatType: CALL_TYPE;
10
+ type: CALL_TYPE;
11
+ ts: number;
12
+ msgType: CALLKIT_ACTION_MSG_TYPE;
13
+ em_push_ext: {
14
+ type: "call";
15
+ custom: {
16
+ action: "invite";
17
+ channelName: string;
18
+ type: CALL_TYPE;
19
+ callerDevId: string;
20
+ callId: string;
21
+ ts: number;
22
+ msgType: CALLKIT_ACTION_MSG_TYPE;
23
+ callerIMName: string;
24
+ calleeIMName: string;
25
+ callerNickname: string;
26
+ chatType: CALL_TYPE;
27
+ };
28
+ };
29
+ em_apns_ext: {
30
+ em_push_type: "voip";
31
+ };
32
+ ease_chat_uikit_user_info?: {
33
+ nickname: string;
34
+ avatarURL: string;
35
+ };
36
+ callkitGroupInfo?: {
37
+ groupId: string;
38
+ groupName?: string;
39
+ groupAvatar?: string;
40
+ };
41
+ }
42
+ /**
43
+ * 基础信令消息扩展字段接口
44
+ */
45
+ export interface BaseSignalingExt {
46
+ /** 操作类型 */
47
+ action: string;
48
+ /** 通话ID */
49
+ callId: string;
50
+ /** 时间戳 */
51
+ ts: number;
52
+ /** 消息类型 */
53
+ msgType: string;
54
+ }
55
+ /**
56
+ * 邀请消息扩展字段接口
57
+ */
58
+ export interface InviteSignalingExt extends BaseSignalingExt {
59
+ action: "invite";
60
+ /** RTC频道名称 */
61
+ channelName: string;
62
+ /** 通话类型 */
63
+ type: number;
64
+ /** 主叫设备ID */
65
+ callerDevId: string;
66
+ /** 主叫IM用户名 */
67
+ callerIMName: string;
68
+ /** 被叫IM用户名 */
69
+ calleeIMName: string;
70
+ /** 聊天类型 */
71
+ chatType: number;
72
+ /** 推送扩展字段 */
73
+ em_push_ext: {
74
+ type: string;
75
+ custom: {
76
+ action: string;
77
+ channelName: string;
78
+ type: number;
79
+ callerDevId: string;
80
+ callId: string;
81
+ ts: number;
82
+ msgType: string;
83
+ callerIMName: string;
84
+ calleeIMName: string;
85
+ callerNickname: string;
86
+ chatType: number;
87
+ ext?: Record<string, any>;
88
+ };
89
+ };
90
+ /** APNS推送扩展字段 */
91
+ em_apns_ext: {
92
+ em_push_type: string;
93
+ };
94
+ /** 自定义扩展字段 */
95
+ ext?: Record<string, any>;
96
+ /** 被邀请成员列表(群组通话时使用) */
97
+ invitedMembers?: string[];
98
+ /** 用户信息(发送方 caller 资料) */
99
+ ease_chat_uikit_user_info?: {
100
+ nickname: string;
101
+ avatarURL: string;
102
+ };
103
+ /** 群组通话信息 */
104
+ callkitGroupInfo?: {
105
+ groupId: string;
106
+ groupName?: string;
107
+ groupAvatar?: string;
108
+ };
109
+ }
110
+ /**
111
+ * 响铃消息扩展字段接口
112
+ */
113
+ export interface AlertSignalingExt extends BaseSignalingExt {
114
+ action: "alert";
115
+ /** 被叫设备ID */
116
+ calleeDevId: string;
117
+ /** 主叫设备ID */
118
+ callerDevId: string;
119
+ }
120
+ /**
121
+ * 确认响铃消息扩展字段接口
122
+ */
123
+ export interface ConfirmRingSignalingExt extends BaseSignalingExt {
124
+ action: "confirmRing";
125
+ /** 确认状态 */
126
+ status: boolean;
127
+ /** 主叫设备ID */
128
+ callerDevId: string;
129
+ /** 被叫设备ID */
130
+ calleeDevId: string;
131
+ }
132
+ /**
133
+ * 应答消息扩展字段接口
134
+ */
135
+ export interface AnswerCallSignalingExt extends BaseSignalingExt {
136
+ action: "answerCall";
137
+ /** 应答结果 */
138
+ result: "accept" | "refuse" | "busy";
139
+ /** 主叫设备ID */
140
+ callerDevId: string;
141
+ /** 被叫设备ID */
142
+ calleeDevId: string;
143
+ }
144
+ /**
145
+ * 确认被叫方消息扩展字段接口
146
+ */
147
+ export interface ConfirmCalleeSignalingExt extends BaseSignalingExt {
148
+ action: "confirmCallee";
149
+ /** 确认结果 */
150
+ result: string;
151
+ /** 主叫设备ID */
152
+ callerDevId: string;
153
+ /** 被叫设备ID */
154
+ calleeDevId: string;
155
+ }
156
+ /**
157
+ * 取消通话消息扩展字段接口
158
+ */
159
+ export interface CancelCallSignalingExt extends BaseSignalingExt {
160
+ action: "cancelCall";
161
+ /** 主叫设备ID */
162
+ callerDevId: string;
163
+ }
164
+ /**
165
+ * 挂断通话消息扩展字段接口
166
+ */
167
+ export interface LeaveCallSignalingExt extends BaseSignalingExt {
168
+ action: "leaveCall";
169
+ }
170
+ /**
171
+ * 所有信令消息扩展字段的联合类型
172
+ */
173
+ export type SignalingExt = AlertSignalingExt | ConfirmRingSignalingExt | AnswerCallSignalingExt | ConfirmCalleeSignalingExt | CancelCallSignalingExt | LeaveCallSignalingExt;
174
+ /**
175
+ * 信令消息配置接口
176
+ */
177
+ export interface SignalingMessageOptions {
178
+ type: "cmd";
179
+ chatType: "singleChat" | "groupChat";
180
+ to: string;
181
+ action: string;
182
+ ext: SignalingExt;
183
+ receiverList?: string[];
184
+ /** 是否直投在线用户 */
185
+ deliverOnlineOnly: boolean;
186
+ }
187
+ export type CALLKIT_SIGNALING_CMD_ACTION = "rtcCall";
@@ -0,0 +1,103 @@
1
+ import { Chat } from './core/sdk/imSDK';
2
+ import { IAgoraRTCClient } from 'agora-rtc-sdk-ng';
3
+ import { HANGUP_REASON } from './types/callstate.types';
4
+ import { LogLevel } from './utils/logger';
5
+ export interface EasemobChatCallKitOptions {
6
+ appKey: string;
7
+ userId?: string;
8
+ accessToken?: string;
9
+ debug?: boolean;
10
+ enableRingtone?: boolean;
11
+ resizable?: boolean;
12
+ draggable?: boolean;
13
+ chatClient?: any;
14
+ }
15
+ export interface CallKitInstance {
16
+ startCall: (targetId: string, type: "audio" | "video") => void;
17
+ endCall: () => void;
18
+ startChat: (targetId: string) => void;
19
+ isInCall: boolean;
20
+ callType: "audio" | "video" | null;
21
+ targetUser: string;
22
+ config: any;
23
+ }
24
+ export interface ProviderConfig {
25
+ chatClient?: Chat.Connection;
26
+ agoraClient?: IAgoraRTCClient;
27
+ agoraAppId?: string;
28
+ /**
29
+ * 是否使用环信 IM SDK miniCore 版本(插件模式)
30
+ * 启用后 callkit 内部将使用命名空间 API(client.contact.* / client.group.* / client.Message.create)
31
+ * 默认 false,使用 full 版本 API(实例直调)
32
+ */
33
+ isMiniCore?: boolean;
34
+ initConfig?: {
35
+ debug?: boolean;
36
+ logLevel?: LogLevel;
37
+ enableIDBLog?: boolean;
38
+ enableRingtone?: boolean;
39
+ resizable?: boolean;
40
+ draggable?: boolean;
41
+ inviteTimeout?: number;
42
+ };
43
+ /**
44
+ * 用户信息查询 Provider
45
+ * 用于获取通话参与者的昵称和头像
46
+ * @param userIds 用户ID数组
47
+ * @returns 用户信息数组 { userId, nickname?, avatarUrl? }
48
+ */
49
+ getUserInfo?: (userIds: string[]) => Promise<Array<{
50
+ userId: string;
51
+ nickname?: string;
52
+ avatarUrl?: string;
53
+ }>>;
54
+ /**
55
+ * 群组信息查询 Provider
56
+ * 用于获取群组的名称和头像
57
+ * @param groupIds 群组ID数组
58
+ * @returns 群组信息数组 { groupId, groupName?, groupAvatar? }
59
+ */
60
+ getGroupInfo?: (groupIds: string[]) => Promise<Array<{
61
+ groupId: string;
62
+ groupName?: string;
63
+ groupAvatar?: string;
64
+ }>>;
65
+ }
66
+ export interface CallParams {
67
+ targetId: string;
68
+ type: "audio" | "video";
69
+ msg?: string;
70
+ userInfo?: {
71
+ nickname?: string;
72
+ avatarURL?: string;
73
+ };
74
+ }
75
+ export interface GroupCallParams {
76
+ groupId: string;
77
+ members: string[];
78
+ type: "audio" | "video";
79
+ msg?: string;
80
+ groupName?: string;
81
+ groupAvatar?: string;
82
+ userInfo?: {
83
+ nickname?: string;
84
+ avatarURL?: string;
85
+ };
86
+ }
87
+ export type EasemobChatCallKitInstance = CallKitInstance;
88
+ export interface UseCallKitReturn {
89
+ /** 发起单人通话 */
90
+ call: (params: CallParams) => Promise<void>;
91
+ /** 发起群组通话 */
92
+ groupCall: (params: GroupCallParams) => Promise<void>;
93
+ /** 挂断/结束通话 */
94
+ hangup: (reason?: HANGUP_REASON) => Promise<void>;
95
+ /** 取消通话邀请 */
96
+ cancel: () => Promise<void>;
97
+ /** 接听通话 */
98
+ accept: () => Promise<void>;
99
+ /** 拒绝通话 */
100
+ reject: () => Promise<void>;
101
+ /** 忙碌拒绝通话 */
102
+ rejectBusy: () => Promise<void>;
103
+ }
@@ -0,0 +1,15 @@
1
+ /**
2
+ * CallKit工具函数
3
+ */
4
+ /**
5
+ * 生成随机channel字符串
6
+ * @param length 字符串长度,默认8位
7
+ * @returns 随机字符串
8
+ */
9
+ export declare const generateRandomChannel: (length?: number) => string;
10
+ /**
11
+ * 格式化通话时间
12
+ * @param seconds 秒数
13
+ * @returns 格式化的时间字符串 (HH:MM:SS 或 MM:SS)
14
+ */
15
+ export declare const formatCallDuration: (seconds: number) => string;
@@ -0,0 +1,29 @@
1
+ /**
2
+ * IM SDK 兼容适配层
3
+ *
4
+ * 通过外层传入的 isMiniCore 标志显式切换调用方式:
5
+ * - isMiniCore = false (默认): 使用 full 版 API,直接挂在 Connection 实例上
6
+ * - isMiniCore = true: 使用 miniCore 插件模式 API,挂在命名空间下
7
+ */
8
+ /**
9
+ * 获取用户资料(昵称、头像等)
10
+ * full: client.fetchUserInfoById(userIds, properties)
11
+ * miniCore(插件): client.contact.fetchUserInfoById(userIds, properties)
12
+ */
13
+ export declare function fetchUserInfoById(client: any, userIds: string[], properties?: string[], isMiniCore?: boolean): Promise<any>;
14
+ /**
15
+ * 获取群成员列表
16
+ * full: client.getGroupMembers(params)
17
+ * miniCore(插件): client.group.getGroupMembers(params)
18
+ */
19
+ export declare function getGroupMembers(client: any, params: {
20
+ groupId: string;
21
+ pageSize: number;
22
+ cursor?: string | null;
23
+ }, isMiniCore?: boolean): Promise<any>;
24
+ /**
25
+ * 获取好友列表(如需扩展)
26
+ * full: client.getContacts(params)
27
+ * miniCore(插件): client.contact.getContacts(params)
28
+ */
29
+ export declare function getContacts(client: any, params?: any, isMiniCore?: boolean): Promise<any>;
@@ -0,0 +1,2 @@
1
+ export * from './callUtils';
2
+ export * from './logger';
@@ -0,0 +1,122 @@
1
+ export declare const LogLevel: {
2
+ readonly ERROR: 0;
3
+ readonly WARN: 1;
4
+ readonly INFO: 2;
5
+ readonly DEBUG: 3;
6
+ readonly VERBOSE: 4;
7
+ };
8
+ export type LogLevel = typeof LogLevel[keyof typeof LogLevel];
9
+ export declare const ANSI_COLORS: {
10
+ RESET: string;
11
+ RED: string;
12
+ YELLOW: string;
13
+ GREEN: string;
14
+ BLUE: string;
15
+ GRAY: string;
16
+ };
17
+ export declare const LogLevelNames: {
18
+ 0: string;
19
+ 1: string;
20
+ 2: string;
21
+ 3: string;
22
+ 4: string;
23
+ };
24
+ export declare const LogLevelColors: {
25
+ 0: string;
26
+ 1: string;
27
+ 2: string;
28
+ 3: string;
29
+ 4: string;
30
+ };
31
+ export interface LoggerConfig {
32
+ level: LogLevel;
33
+ enableConsole: boolean;
34
+ enablePrefix: boolean;
35
+ prefix?: string;
36
+ debug?: boolean;
37
+ enableIDB?: boolean;
38
+ idbLevel?: LogLevel;
39
+ idbRetentionDays?: number;
40
+ idbMaxSizeMB?: number;
41
+ }
42
+ export declare class Logger {
43
+ private static instance;
44
+ private config;
45
+ private db;
46
+ private sessionId;
47
+ private constructor();
48
+ static getInstance(config?: Partial<LoggerConfig>): Logger;
49
+ updateConfig(config: Partial<LoggerConfig>): void;
50
+ setDebug(debug: boolean): void;
51
+ getConfig(): LoggerConfig;
52
+ setLevel(level: LogLevel): void;
53
+ setConsoleEnabled(enabled: boolean): void;
54
+ setPrefixEnabled(enabled: boolean): void;
55
+ setPrefix(prefix: string): void;
56
+ setIDBEnabled(enabled: boolean): void;
57
+ setIDBLevel(level: LogLevel): void;
58
+ setSessionId(id: string | undefined): void;
59
+ getSessionId(): string | undefined;
60
+ private shouldLog;
61
+ private shouldWriteToIDB;
62
+ private formatMessage;
63
+ private initDB;
64
+ private extractMeta;
65
+ private writeToIDB;
66
+ error(message: string, ...args: any[]): void;
67
+ warn(message: string, ...args: any[]): void;
68
+ info(message: string, ...args: any[]): void;
69
+ debug(message: string, ...args: any[]): void;
70
+ verbose(message: string, ...args: any[]): void;
71
+ log(message: string, ...args: any[]): void;
72
+ console(message: string, ...args: any[]): void;
73
+ getCurrentLevelName(): string;
74
+ isLevelEnabled(level: LogLevel): boolean;
75
+ /**
76
+ * 信令日志
77
+ * @param direction 'send' | 'recv'
78
+ * @param action 信令 action
79
+ * @param meta 结构化数据(from/to/callId/result 等)
80
+ */
81
+ signal(direction: 'send' | 'recv', action: string, meta?: Record<string, any>): void;
82
+ /**
83
+ * 状态变更日志
84
+ * @param from 原状态
85
+ * @param to 新状态
86
+ * @param meta 触发上下文
87
+ */
88
+ stateChange(from: any, to: any, meta?: Record<string, any>): void;
89
+ /**
90
+ * RTC 事件日志
91
+ * @param event 事件名
92
+ * @param meta 结构化数据
93
+ */
94
+ rtc(event: string, meta?: Record<string, any>): void;
95
+ /**
96
+ * 业务事件日志
97
+ * @param event 事件名
98
+ * @param meta 结构化数据
99
+ */
100
+ event(event: string, meta?: Record<string, any>): void;
101
+ /** 按 sessionId 导出日志(不传则导出全部) */
102
+ exportLogsBySession(sessionId?: string): Promise<import('./loggerDb').CallKitLogEntry[]>;
103
+ /** 按时间范围导出日志 */
104
+ exportLogsByTimeRange(start: number, end: number): Promise<import('./loggerDb').CallKitLogEntry[]>;
105
+ /** 获取最近有日志的 sessionId 列表 */
106
+ getSessions(): Promise<string[]>;
107
+ /** 清理日志(默认按配置中的保留天数) */
108
+ clearLogs(days?: number): Promise<number>;
109
+ /** 导出为 JSON 字符串(便于下载/上报) */
110
+ exportLogsAsJSON(sessionId?: string): Promise<string>;
111
+ /** 导出为纯文本字符串(便于直接阅读) */
112
+ exportLogsAsText(sessionId?: string): Promise<string>;
113
+ /** 格式化为易读的本地时间 */
114
+ private formatReadableTime;
115
+ }
116
+ export declare const logger: Logger;
117
+ export declare const logError: (message: string, ...args: any[]) => void;
118
+ export declare const logWarn: (message: string, ...args: any[]) => void;
119
+ export declare const logInfo: (message: string, ...args: any[]) => void;
120
+ export declare const logDebug: (message: string, ...args: any[]) => void;
121
+ export declare const logVerbose: (message: string, ...args: any[]) => void;
122
+ export declare const log: (message: string, ...args: any[]) => void;
@@ -0,0 +1,41 @@
1
+ import { default as Dexie, Table } from 'dexie';
2
+ import { LogLevel } from './logger';
3
+ export type LogCategory = 'signal' | 'state' | 'rtc' | 'event' | 'error' | 'general';
4
+ /**
5
+ * CallKit 单条日志结构
6
+ * 设计目标:支持按通话(callId)维度还原完整信令时序与状态流转
7
+ */
8
+ export interface CallKitLogEntry {
9
+ id?: number;
10
+ timestamp: number;
11
+ level: LogLevel;
12
+ category: LogCategory;
13
+ tag: string;
14
+ message: string;
15
+ sessionId?: string;
16
+ meta?: Record<string, any>;
17
+ }
18
+ /**
19
+ * CallKitLogDB
20
+ * 基于 Dexie 的 IndexedDB 封装
21
+ * 职责:结构化存储日志,支持按会话/时间范围导出,自带容量上限控制
22
+ */
23
+ export declare class CallKitLogDB extends Dexie {
24
+ logs: Table<CallKitLogEntry, number>;
25
+ constructor();
26
+ write(entry: Omit<CallKitLogEntry, 'id'>, maxSizeMB?: number): Promise<void>;
27
+ /** 按容量上限清理最旧的日志 */
28
+ enforceSizeLimit(maxSizeMB: number): Promise<void>;
29
+ /** 按 sessionId 导出(正序,最近 2000 条) */
30
+ exportBySession(sessionId: string, limit?: number): Promise<CallKitLogEntry[]>;
31
+ /** 按时间范围导出(正序) */
32
+ exportByTimeRange(start: number, end: number, limit?: number): Promise<CallKitLogEntry[]>;
33
+ /** 导出全部(倒序,最近 5000 条) */
34
+ exportAll(limit?: number): Promise<CallKitLogEntry[]>;
35
+ /** 清理 N 天前的日志 */
36
+ clearBefore(days?: number): Promise<number>;
37
+ /** 按 sessionId 清理 */
38
+ clearBySession(sessionId: string): Promise<number>;
39
+ /** 获取最近有日志的 sessionId 列表(去重) */
40
+ getSessions(limit?: number): Promise<string[]>;
41
+ }