im-rtc-call-engine 1.0.0
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.
- package/LICENSE +21 -0
- package/dist/bytes.d.ts +11 -0
- package/dist/bytes.d.ts.map +1 -0
- package/dist/bytes.js +20 -0
- package/dist/bytes.js.map +1 -0
- package/dist/callOptions.d.ts +27 -0
- package/dist/callOptions.d.ts.map +1 -0
- package/dist/callOptions.js +19 -0
- package/dist/callOptions.js.map +1 -0
- package/dist/deviceId.d.ts +10 -0
- package/dist/deviceId.d.ts.map +1 -0
- package/dist/deviceId.js +55 -0
- package/dist/deviceId.js.map +1 -0
- package/dist/engine.d.ts +302 -0
- package/dist/engine.d.ts.map +1 -0
- package/dist/engine.js +489 -0
- package/dist/engine.js.map +1 -0
- package/dist/engineBus.d.ts +16 -0
- package/dist/engineBus.d.ts.map +1 -0
- package/dist/engineBus.js +89 -0
- package/dist/engineBus.js.map +1 -0
- package/dist/engineWiring.d.ts +40 -0
- package/dist/engineWiring.d.ts.map +1 -0
- package/dist/engineWiring.js +57 -0
- package/dist/engineWiring.js.map +1 -0
- package/dist/errors.d.ts +185 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +253 -0
- package/dist/errors.js.map +1 -0
- package/dist/eventBus.d.ts +24 -0
- package/dist/eventBus.d.ts.map +1 -0
- package/dist/eventBus.js +50 -0
- package/dist/eventBus.js.map +1 -0
- package/dist/events.d.ts +220 -0
- package/dist/events.d.ts.map +1 -0
- package/dist/events.js +35 -0
- package/dist/events.js.map +1 -0
- package/dist/frameLoop.d.ts +93 -0
- package/dist/frameLoop.d.ts.map +1 -0
- package/dist/frameLoop.js +346 -0
- package/dist/frameLoop.js.map +1 -0
- package/dist/index.d.ts +60 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +42 -0
- package/dist/index.js.map +1 -0
- package/dist/logger.d.ts +64 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +101 -0
- package/dist/logger.js.map +1 -0
- package/dist/media/engineMediaApi.d.ts +40 -0
- package/dist/media/engineMediaApi.d.ts.map +1 -0
- package/dist/media/engineMediaApi.js +71 -0
- package/dist/media/engineMediaApi.js.map +1 -0
- package/dist/media/firstFrameGate.d.ts +47 -0
- package/dist/media/firstFrameGate.d.ts.map +1 -0
- package/dist/media/firstFrameGate.js +117 -0
- package/dist/media/firstFrameGate.js.map +1 -0
- package/dist/media/mediaAdapter.d.ts +135 -0
- package/dist/media/mediaAdapter.d.ts.map +1 -0
- package/dist/media/mediaAdapter.js +2 -0
- package/dist/media/mediaAdapter.js.map +1 -0
- package/dist/media/mediaBridge.d.ts +99 -0
- package/dist/media/mediaBridge.d.ts.map +1 -0
- package/dist/media/mediaBridge.js +186 -0
- package/dist/media/mediaBridge.js.map +1 -0
- package/dist/media/mediaPlane.d.ts +58 -0
- package/dist/media/mediaPlane.d.ts.map +1 -0
- package/dist/media/mediaPlane.js +119 -0
- package/dist/media/mediaPlane.js.map +1 -0
- package/dist/media/videoProfile.d.ts +79 -0
- package/dist/media/videoProfile.d.ts.map +1 -0
- package/dist/media/videoProfile.js +46 -0
- package/dist/media/videoProfile.js.map +1 -0
- package/dist/media/videoProfile.test.d.ts +2 -0
- package/dist/media/videoProfile.test.d.ts.map +1 -0
- package/dist/media/videoProfile.test.js +26 -0
- package/dist/media/videoProfile.test.js.map +1 -0
- package/dist/media/viewRegistry.d.ts +75 -0
- package/dist/media/viewRegistry.d.ts.map +1 -0
- package/dist/media/viewRegistry.js +130 -0
- package/dist/media/viewRegistry.js.map +1 -0
- package/dist/media/webrtcAdapter.d.ts +158 -0
- package/dist/media/webrtcAdapter.d.ts.map +1 -0
- package/dist/media/webrtcAdapter.js +502 -0
- package/dist/media/webrtcAdapter.js.map +1 -0
- package/dist/protocolId.d.ts +14 -0
- package/dist/protocolId.d.ts.map +1 -0
- package/dist/protocolId.js +109 -0
- package/dist/protocolId.js.map +1 -0
- package/dist/reasons.d.ts +63 -0
- package/dist/reasons.d.ts.map +1 -0
- package/dist/reasons.js +81 -0
- package/dist/reasons.js.map +1 -0
- package/dist/redact.d.ts +19 -0
- package/dist/redact.d.ts.map +1 -0
- package/dist/redact.js +50 -0
- package/dist/redact.js.map +1 -0
- package/dist/signaling/backoff.d.ts +17 -0
- package/dist/signaling/backoff.d.ts.map +1 -0
- package/dist/signaling/backoff.js +23 -0
- package/dist/signaling/backoff.js.map +1 -0
- package/dist/signaling/candidate.d.ts +19 -0
- package/dist/signaling/candidate.d.ts.map +1 -0
- package/dist/signaling/candidate.js +22 -0
- package/dist/signaling/candidate.js.map +1 -0
- package/dist/signaling/caseMapping.d.ts +19 -0
- package/dist/signaling/caseMapping.d.ts.map +1 -0
- package/dist/signaling/caseMapping.js +34 -0
- package/dist/signaling/caseMapping.js.map +1 -0
- package/dist/signaling/connection.d.ts +110 -0
- package/dist/signaling/connection.d.ts.map +1 -0
- package/dist/signaling/connection.js +365 -0
- package/dist/signaling/connection.js.map +1 -0
- package/dist/signaling/connectionFactory.d.ts +55 -0
- package/dist/signaling/connectionFactory.d.ts.map +1 -0
- package/dist/signaling/connectionFactory.js +29 -0
- package/dist/signaling/connectionFactory.js.map +1 -0
- package/dist/signaling/connectionTypes.d.ts +94 -0
- package/dist/signaling/connectionTypes.d.ts.map +1 -0
- package/dist/signaling/connectionTypes.js +2 -0
- package/dist/signaling/connectionTypes.js.map +1 -0
- package/dist/signaling/discipline.d.ts +6 -0
- package/dist/signaling/discipline.d.ts.map +1 -0
- package/dist/signaling/discipline.js +100 -0
- package/dist/signaling/discipline.js.map +1 -0
- package/dist/signaling/enums.d.ts +53 -0
- package/dist/signaling/enums.d.ts.map +1 -0
- package/dist/signaling/enums.js +52 -0
- package/dist/signaling/enums.js.map +1 -0
- package/dist/signaling/envelope.d.ts +31 -0
- package/dist/signaling/envelope.d.ts.map +1 -0
- package/dist/signaling/envelope.js +91 -0
- package/dist/signaling/envelope.js.map +1 -0
- package/dist/signaling/fieldSpec.d.ts +101 -0
- package/dist/signaling/fieldSpec.d.ts.map +1 -0
- package/dist/signaling/fieldSpec.js +130 -0
- package/dist/signaling/fieldSpec.js.map +1 -0
- package/dist/signaling/frameSender.d.ts +34 -0
- package/dist/signaling/frameSender.d.ts.map +1 -0
- package/dist/signaling/frameSender.js +57 -0
- package/dist/signaling/frameSender.js.map +1 -0
- package/dist/signaling/frames.call.d.ts +299 -0
- package/dist/signaling/frames.call.d.ts.map +1 -0
- package/dist/signaling/frames.call.js +149 -0
- package/dist/signaling/frames.call.js.map +1 -0
- package/dist/signaling/frames.room.d.ts +566 -0
- package/dist/signaling/frames.room.d.ts.map +1 -0
- package/dist/signaling/frames.room.js +165 -0
- package/dist/signaling/frames.room.js.map +1 -0
- package/dist/signaling/frames.sys.d.ts +145 -0
- package/dist/signaling/frames.sys.d.ts.map +1 -0
- package/dist/signaling/frames.sys.js +53 -0
- package/dist/signaling/frames.sys.js.map +1 -0
- package/dist/signaling/handshakeGiveUp.d.ts +36 -0
- package/dist/signaling/handshakeGiveUp.d.ts.map +1 -0
- package/dist/signaling/handshakeGiveUp.js +48 -0
- package/dist/signaling/handshakeGiveUp.js.map +1 -0
- package/dist/signaling/heartbeat.d.ts +34 -0
- package/dist/signaling/heartbeat.d.ts.map +1 -0
- package/dist/signaling/heartbeat.js +52 -0
- package/dist/signaling/heartbeat.js.map +1 -0
- package/dist/signaling/pendingRequests.d.ts +33 -0
- package/dist/signaling/pendingRequests.d.ts.map +1 -0
- package/dist/signaling/pendingRequests.js +57 -0
- package/dist/signaling/pendingRequests.js.map +1 -0
- package/dist/signaling/reconnector.d.ts +43 -0
- package/dist/signaling/reconnector.d.ts.map +1 -0
- package/dist/signaling/reconnector.js +76 -0
- package/dist/signaling/reconnector.js.map +1 -0
- package/dist/signaling/registry.d.ts +100 -0
- package/dist/signaling/registry.d.ts.map +1 -0
- package/dist/signaling/registry.js +217 -0
- package/dist/signaling/registry.js.map +1 -0
- package/dist/signaling/resumeDeadline.d.ts +48 -0
- package/dist/signaling/resumeDeadline.d.ts.map +1 -0
- package/dist/signaling/resumeDeadline.js +89 -0
- package/dist/signaling/resumeDeadline.js.map +1 -0
- package/dist/signaling/tokenExpiry.d.ts +89 -0
- package/dist/signaling/tokenExpiry.d.ts.map +1 -0
- package/dist/signaling/tokenExpiry.js +106 -0
- package/dist/signaling/tokenExpiry.js.map +1 -0
- package/dist/signaling/webSocket.d.ts +59 -0
- package/dist/signaling/webSocket.d.ts.map +1 -0
- package/dist/signaling/webSocket.js +50 -0
- package/dist/signaling/webSocket.js.map +1 -0
- package/dist/state/callMachine.d.ts +56 -0
- package/dist/state/callMachine.d.ts.map +1 -0
- package/dist/state/callMachine.js +176 -0
- package/dist/state/callMachine.js.map +1 -0
- package/dist/state/callRecv.d.ts +12 -0
- package/dist/state/callRecv.d.ts.map +1 -0
- package/dist/state/callRecv.js +255 -0
- package/dist/state/callRecv.js.map +1 -0
- package/dist/state/engineMachine.d.ts +41 -0
- package/dist/state/engineMachine.d.ts.map +1 -0
- package/dist/state/engineMachine.js +210 -0
- package/dist/state/engineMachine.js.map +1 -0
- package/dist/state/forceEnd.d.ts +44 -0
- package/dist/state/forceEnd.d.ts.map +1 -0
- package/dist/state/forceEnd.js +96 -0
- package/dist/state/forceEnd.js.map +1 -0
- package/dist/state/roomMachine.d.ts +92 -0
- package/dist/state/roomMachine.d.ts.map +1 -0
- package/dist/state/roomMachine.js +319 -0
- package/dist/state/roomMachine.js.map +1 -0
- package/dist/state/roomRecv.d.ts +7 -0
- package/dist/state/roomRecv.d.ts.map +1 -0
- package/dist/state/roomRecv.js +209 -0
- package/dist/state/roomRecv.js.map +1 -0
- package/dist/state/types.d.ts +61 -0
- package/dist/state/types.d.ts.map +1 -0
- package/dist/state/types.js +30 -0
- package/dist/state/types.js.map +1 -0
- package/dist/version.d.ts +11 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +11 -0
- package/dist/version.js.map +1 -0
- package/package.json +35 -0
package/dist/events.d.ts
ADDED
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
import type { CallEndReasonValue } from './reasons.js';
|
|
2
|
+
import type { KickedOutReason } from './signaling/connectionTypes.js';
|
|
3
|
+
import type { MediaType } from './signaling/enums.js';
|
|
4
|
+
/**
|
|
5
|
+
* Engine 公开事件表 —— 对应设计文档 §7.5 的回调总表。
|
|
6
|
+
*
|
|
7
|
+
* **事件名三端同名**(CONVENTIONS §4)。这张表就是「只引 SDK 自画 UI」那条路的全部内容:
|
|
8
|
+
* uikit 不是特权组件,它只消费这张表,没有任何私有通道。
|
|
9
|
+
* 一旦某个界面需要 engine 开私有口子,说明表少了一项——**补表,不开后门**。
|
|
10
|
+
*/
|
|
11
|
+
/** CallRoleName 是本端在通话里的角色。 */
|
|
12
|
+
export type CallRoleName = 'caller' | 'callee' | '';
|
|
13
|
+
/** EngineEvents 是全部公开事件。参数用 TS 惯用的 camelCase。 */
|
|
14
|
+
export interface EngineEvents {
|
|
15
|
+
connected: {
|
|
16
|
+
sessionId: string;
|
|
17
|
+
resumed: boolean;
|
|
18
|
+
};
|
|
19
|
+
/**
|
|
20
|
+
* 信令连接断开。
|
|
21
|
+
*
|
|
22
|
+
* **两个字段都一定有**:这个事件只由连接层抛,而关闭码与「会不会自己回来」
|
|
23
|
+
* 都是它当场就知道的。(状态机内部也有一份 `onDisconnected`,但那份只用来
|
|
24
|
+
* 驱动状态迁移、不往宿主发——见 frameLoop.ts 的 dispatch。)
|
|
25
|
+
*
|
|
26
|
+
* `code === 4401` 是宿主唯一需要特殊处理的一个:换新票再来(协议 §1.5),
|
|
27
|
+
* 见 `updateToken`。
|
|
28
|
+
*/
|
|
29
|
+
disconnected: {
|
|
30
|
+
code: number;
|
|
31
|
+
willReconnect: boolean;
|
|
32
|
+
};
|
|
33
|
+
/**
|
|
34
|
+
* 被踢,**不会自动重连**。
|
|
35
|
+
*
|
|
36
|
+
* `reason` 决定宿主该做什么,两者处置相反——合并成一个「被踢」的话,
|
|
37
|
+
* 宿主只能都当登录失效处理,把本可静默恢复的场景也变成「请重新登录」:
|
|
38
|
+
* - `takenOver` —— 同账号同设备号在别处登录,或宿主主动吊销(都是 4403/1104,
|
|
39
|
+
* 客户端无从区分)。**回登录页**,换票没用。
|
|
40
|
+
* - `authExpired` —— 票不被接受且连续三次没换上(4401 用尽)。
|
|
41
|
+
* 宿主取一枚新票再 `login` 即可。
|
|
42
|
+
*/
|
|
43
|
+
kickedOut: {
|
|
44
|
+
reason: KickedOutReason;
|
|
45
|
+
};
|
|
46
|
+
/**
|
|
47
|
+
* 当前这张票快到期了(默认到期前 60s),宿主该去取新票并 `updateToken`。
|
|
48
|
+
*
|
|
49
|
+
* **不处理也不会立刻出事**——服务端不复查活连接,票过期不断线。但下一次重连
|
|
50
|
+
* (网络抖动、切后台回来、服务端重启)会撞上 4401,用户被踢回登录页。
|
|
51
|
+
* 这个事件就是为了把那次「必然会发生但时间不定」的掉线消灭在发生之前。
|
|
52
|
+
*
|
|
53
|
+
* 服务端说「未知」(`token_expires_at_ms` 为 0)时**不会触发**,此时退化成
|
|
54
|
+
* 被动行为(4401 → 换票重连),是刻意降级不是故障。
|
|
55
|
+
*/
|
|
56
|
+
tokenWillExpire: {
|
|
57
|
+
expiresAtMs: number;
|
|
58
|
+
};
|
|
59
|
+
error: {
|
|
60
|
+
code: number;
|
|
61
|
+
name: string;
|
|
62
|
+
message: string;
|
|
63
|
+
};
|
|
64
|
+
callReceived: {
|
|
65
|
+
callId: string;
|
|
66
|
+
/** 发起人:这通电话是谁起的头。**通话期间不变**。 */
|
|
67
|
+
caller: string;
|
|
68
|
+
/**
|
|
69
|
+
* 这次邀请是谁发的——「谁把你拉进来的」。首次邀请就是 `caller` 本人;
|
|
70
|
+
* 群通话里被别人 `inviteMore` 加进来时是那个人。**来电界面该显示的是它**。
|
|
71
|
+
*
|
|
72
|
+
* 旧服务端不带这个字段,那时回落成 `caller`(engine 已经兜好,宿主不用再判空)。
|
|
73
|
+
*/
|
|
74
|
+
inviter: string;
|
|
75
|
+
/**
|
|
76
|
+
* 这通电话邀了谁(不含主叫,**含自己**)。
|
|
77
|
+
*
|
|
78
|
+
* 群通话的界面靠它把还没接的人先摆成占位格——否则主叫那边是四格、
|
|
79
|
+
* 被叫这边只有两格,同一通电话两种样子。
|
|
80
|
+
*/
|
|
81
|
+
calleeIds: string[];
|
|
82
|
+
mediaType: MediaType;
|
|
83
|
+
isGroup: boolean;
|
|
84
|
+
/** 宿主自己的群号,`call()` 的选项里没给就是空串(HOST_INTEGRATION_DESIGN §3.2)。 */
|
|
85
|
+
chatGroupId: string;
|
|
86
|
+
/** 原样透传,服务端不解析。 */
|
|
87
|
+
userData: string;
|
|
88
|
+
};
|
|
89
|
+
/** 接通。**主被叫都抛**,此刻开始计时。 */
|
|
90
|
+
callBegin: {
|
|
91
|
+
callId: string;
|
|
92
|
+
roomId: string;
|
|
93
|
+
mediaType: MediaType;
|
|
94
|
+
isGroup: boolean;
|
|
95
|
+
role: CallRoleName;
|
|
96
|
+
/**
|
|
97
|
+
* 发起人。`joinCall()` 进来的人没收过 `callReceived`,只有这里能知道是谁打的这通电话。
|
|
98
|
+
*/
|
|
99
|
+
caller: string;
|
|
100
|
+
/**
|
|
101
|
+
* 群号:取 `call.connected` 里的值,为空时回落到本通 `callReceived` / `call()`
|
|
102
|
+
* 选项里记下的值(兼容旧服务端,HOST_INTEGRATION_DESIGN §3.3)。Kit 靠它决定
|
|
103
|
+
* 「添加成员」列谁的通讯录。
|
|
104
|
+
*/
|
|
105
|
+
chatGroupId: string;
|
|
106
|
+
userData: string;
|
|
107
|
+
};
|
|
108
|
+
/** **所有结束分支的唯一出口**。只监听它也能完整记录一通电话。 */
|
|
109
|
+
callEnd: {
|
|
110
|
+
callId: string;
|
|
111
|
+
reason: CallEndReasonValue;
|
|
112
|
+
durationSec: number;
|
|
113
|
+
endedBy: string;
|
|
114
|
+
};
|
|
115
|
+
/** 以下四个是**便利事件**,只在 1v1 抛;随后必有 callEnd。 */
|
|
116
|
+
callCancelled: {
|
|
117
|
+
uid: string;
|
|
118
|
+
};
|
|
119
|
+
callRejected: {
|
|
120
|
+
uid: string;
|
|
121
|
+
};
|
|
122
|
+
callBusy: {
|
|
123
|
+
uid: string;
|
|
124
|
+
};
|
|
125
|
+
callNoAnswer: {
|
|
126
|
+
uid: string;
|
|
127
|
+
};
|
|
128
|
+
/**
|
|
129
|
+
* **通话中**有人打进来,服务端已经替你回了忙线——这一通你不会振铃。
|
|
130
|
+
*
|
|
131
|
+
* MVP 是单通道:同一时刻只有一通电话(协议 §4.3 的忙线分支)。这条事件只是让界面
|
|
132
|
+
* 提示一句「谁来过电话」,宿主不需要做任何处理。
|
|
133
|
+
*/
|
|
134
|
+
callMissed: {
|
|
135
|
+
callId: string;
|
|
136
|
+
caller: string;
|
|
137
|
+
reason: string;
|
|
138
|
+
};
|
|
139
|
+
/** 本账号另一台设备接听/拒绝了。 */
|
|
140
|
+
handledOnOtherDevice: {
|
|
141
|
+
callId: string;
|
|
142
|
+
action: string;
|
|
143
|
+
};
|
|
144
|
+
userEnter: {
|
|
145
|
+
uid: string;
|
|
146
|
+
};
|
|
147
|
+
userLeave: {
|
|
148
|
+
uid: string;
|
|
149
|
+
};
|
|
150
|
+
userAccept: {
|
|
151
|
+
uid: string;
|
|
152
|
+
};
|
|
153
|
+
userReject: {
|
|
154
|
+
uid: string;
|
|
155
|
+
};
|
|
156
|
+
userNoResponse: {
|
|
157
|
+
uid: string;
|
|
158
|
+
};
|
|
159
|
+
userAudioAvailable: {
|
|
160
|
+
uid: string;
|
|
161
|
+
available: boolean;
|
|
162
|
+
};
|
|
163
|
+
userVideoAvailable: {
|
|
164
|
+
uid: string;
|
|
165
|
+
available: boolean;
|
|
166
|
+
};
|
|
167
|
+
/** 主讲人变化。服务端节流 300ms,**别依赖更高频率**。 */
|
|
168
|
+
activeSpeakers: {
|
|
169
|
+
speakers: {
|
|
170
|
+
uid: string;
|
|
171
|
+
volume: number;
|
|
172
|
+
}[];
|
|
173
|
+
};
|
|
174
|
+
/** 网络质量 0~6。服务端节流 2s。 */
|
|
175
|
+
networkQuality: {
|
|
176
|
+
entries: {
|
|
177
|
+
uid: string;
|
|
178
|
+
level: number;
|
|
179
|
+
}[];
|
|
180
|
+
};
|
|
181
|
+
/**
|
|
182
|
+
* 某人的画面**真的开始出数据**了,UI 用来撤 loading。
|
|
183
|
+
* **本地事件,没有对应的信令帧**。
|
|
184
|
+
*
|
|
185
|
+
* 判据是轨道 `unmute` 而不是 `ontrack`:协商完成时远端轨道还是 muted 的,
|
|
186
|
+
* 那一刻撤 loading 会露出黑屏。
|
|
187
|
+
*/
|
|
188
|
+
firstVideoFrame: {
|
|
189
|
+
uid: string;
|
|
190
|
+
trackId: string;
|
|
191
|
+
};
|
|
192
|
+
/** 收到一条下行轨道,宿主用它挂到 <video>。 */
|
|
193
|
+
remoteTrack: {
|
|
194
|
+
trackId: string;
|
|
195
|
+
track: MediaStreamTrack;
|
|
196
|
+
};
|
|
197
|
+
roomJoined: {
|
|
198
|
+
roomId: string;
|
|
199
|
+
};
|
|
200
|
+
roomLeft: {
|
|
201
|
+
roomId: string;
|
|
202
|
+
};
|
|
203
|
+
roomClosed: {
|
|
204
|
+
roomId: string;
|
|
205
|
+
reason: string;
|
|
206
|
+
};
|
|
207
|
+
}
|
|
208
|
+
/** EngineEventName 是事件名的联合。 */
|
|
209
|
+
export type EngineEventName = keyof EngineEvents;
|
|
210
|
+
/** EngineEventHandler 是某个事件的处理函数。 */
|
|
211
|
+
export type EngineEventHandler<K extends EngineEventName> = (payload: EngineEvents[K]) => void;
|
|
212
|
+
/**
|
|
213
|
+
* MACHINE_EVENT_NAMES 把状态机内部的回调名(`onXxx`)映射到公开事件名。
|
|
214
|
+
*
|
|
215
|
+
* 状态机产出的名字沿用协议文档与一致性向量里的 `onXxx` 写法,
|
|
216
|
+
* 公开事件用 `engine.on('callReceived', …)` 这种字符串键——
|
|
217
|
+
* 两边一一对应,这张表就是那座桥。
|
|
218
|
+
*/
|
|
219
|
+
export declare const MACHINE_EVENT_NAMES: Readonly<Record<string, EngineEventName>>;
|
|
220
|
+
//# sourceMappingURL=events.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../src/events.ts"],"names":[],"mappings":"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"}
|
package/dist/events.js
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MACHINE_EVENT_NAMES 把状态机内部的回调名(`onXxx`)映射到公开事件名。
|
|
3
|
+
*
|
|
4
|
+
* 状态机产出的名字沿用协议文档与一致性向量里的 `onXxx` 写法,
|
|
5
|
+
* 公开事件用 `engine.on('callReceived', …)` 这种字符串键——
|
|
6
|
+
* 两边一一对应,这张表就是那座桥。
|
|
7
|
+
*/
|
|
8
|
+
export const MACHINE_EVENT_NAMES = {
|
|
9
|
+
onConnected: 'connected',
|
|
10
|
+
onDisconnected: 'disconnected',
|
|
11
|
+
onKickedOut: 'kickedOut',
|
|
12
|
+
onError: 'error',
|
|
13
|
+
onCallReceived: 'callReceived',
|
|
14
|
+
onCallBegin: 'callBegin',
|
|
15
|
+
onCallEnd: 'callEnd',
|
|
16
|
+
onCallCancelled: 'callCancelled',
|
|
17
|
+
onCallRejected: 'callRejected',
|
|
18
|
+
onCallBusy: 'callBusy',
|
|
19
|
+
onCallNoAnswer: 'callNoAnswer',
|
|
20
|
+
onCallMissed: 'callMissed',
|
|
21
|
+
onHandledOnOtherDevice: 'handledOnOtherDevice',
|
|
22
|
+
onUserEnter: 'userEnter',
|
|
23
|
+
onUserLeave: 'userLeave',
|
|
24
|
+
onUserAccept: 'userAccept',
|
|
25
|
+
onUserReject: 'userReject',
|
|
26
|
+
onUserNoResponse: 'userNoResponse',
|
|
27
|
+
onUserAudioAvailable: 'userAudioAvailable',
|
|
28
|
+
onUserVideoAvailable: 'userVideoAvailable',
|
|
29
|
+
onActiveSpeakers: 'activeSpeakers',
|
|
30
|
+
onNetworkQuality: 'networkQuality',
|
|
31
|
+
onRoomJoined: 'roomJoined',
|
|
32
|
+
onRoomLeft: 'roomLeft',
|
|
33
|
+
onRoomClosed: 'roomClosed',
|
|
34
|
+
};
|
|
35
|
+
//# sourceMappingURL=events.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"events.js","sourceRoot":"","sources":["../src/events.ts"],"names":[],"mappings":"AA8JA;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAA8C;IAC5E,WAAW,EAAE,WAAW;IACxB,cAAc,EAAE,cAAc;IAC9B,WAAW,EAAE,WAAW;IACxB,OAAO,EAAE,OAAO;IAChB,cAAc,EAAE,cAAc;IAC9B,WAAW,EAAE,WAAW;IACxB,SAAS,EAAE,SAAS;IACpB,eAAe,EAAE,eAAe;IAChC,cAAc,EAAE,cAAc;IAC9B,UAAU,EAAE,UAAU;IACtB,cAAc,EAAE,cAAc;IAC9B,YAAY,EAAE,YAAY;IAC1B,sBAAsB,EAAE,sBAAsB;IAC9C,WAAW,EAAE,WAAW;IACxB,WAAW,EAAE,WAAW;IACxB,YAAY,EAAE,YAAY;IAC1B,YAAY,EAAE,YAAY;IAC1B,gBAAgB,EAAE,gBAAgB;IAClC,oBAAoB,EAAE,oBAAoB;IAC1C,oBAAoB,EAAE,oBAAoB;IAC1C,gBAAgB,EAAE,gBAAgB;IAClC,gBAAgB,EAAE,gBAAgB;IAClC,YAAY,EAAE,YAAY;IAC1B,UAAU,EAAE,UAAU;IACtB,YAAY,EAAE,YAAY;CAC3B,CAAC"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import type { EngineBus } from './engineBus.js';
|
|
2
|
+
import type { MediaAdapter } from './media/mediaAdapter.js';
|
|
3
|
+
import type { MediaBridge } from './media/mediaBridge.js';
|
|
4
|
+
import type { MediaPlaneDeps } from './media/mediaPlane.js';
|
|
5
|
+
import type { CallEndReasonValue } from './reasons.js';
|
|
6
|
+
import type { Connection } from './signaling/connection.js';
|
|
7
|
+
import type { FrameSender } from './signaling/frameSender.js';
|
|
8
|
+
import type { EngineContext } from './state/engineMachine.js';
|
|
9
|
+
import type { EmittedEvent, MachineInput } from './state/types.js';
|
|
10
|
+
/** FrameLoopDeps 是这个循环要用到的全部东西。 */
|
|
11
|
+
export interface FrameLoopDeps {
|
|
12
|
+
readonly bus: EngineBus;
|
|
13
|
+
readonly bridge: MediaBridge;
|
|
14
|
+
readonly media: MediaAdapter;
|
|
15
|
+
readonly sender: FrameSender;
|
|
16
|
+
/** 当前连接;没登录时为 null。取成函数是因为它会随重连换对象。 */
|
|
17
|
+
connection: () => Connection | null;
|
|
18
|
+
/** 媒体接线的依赖袋(见 media/mediaPlane.ts)。 */
|
|
19
|
+
mediaDeps: () => MediaPlaneDeps;
|
|
20
|
+
}
|
|
21
|
+
/** FrameLoop 持有状态机快照,并驱动它。 */
|
|
22
|
+
export declare class FrameLoop {
|
|
23
|
+
private readonly deps;
|
|
24
|
+
private ctx;
|
|
25
|
+
constructor(deps: FrameLoopDeps);
|
|
26
|
+
/** state 是状态机的当前快照,供门面转给 UI。 */
|
|
27
|
+
get state(): EngineContext;
|
|
28
|
+
/** reset 把状态机归零(logout 用)。 */
|
|
29
|
+
reset(): void;
|
|
30
|
+
/**
|
|
31
|
+
* handleIncoming 是**所有下行帧的唯一入口**——事件与应答都走它。
|
|
32
|
+
*
|
|
33
|
+
* 这里曾经漏了应答那一半:`.ok` 走的是 `request()` 的 Promise,没喂回状态机,
|
|
34
|
+
* 于是 `room.join` 发出去了、`room.join.ok` 回来了,房间状态却永远停在 `joining`,
|
|
35
|
+
* 随后的 publish 全被 R1「只有 joined 才允许发布」本地拒掉。
|
|
36
|
+
*/
|
|
37
|
+
handleIncoming(type: string, data: Record<string, unknown>): Promise<void>;
|
|
38
|
+
/** dispatch 把一个输入喂进状态机,然后发帧、抛事件。 */
|
|
39
|
+
dispatch(input: MachineInput): Promise<void>;
|
|
40
|
+
/**
|
|
41
|
+
* forceEnd 强制收掉当前这一场:**先把结束帧直接交给信令连接,再在本地收场**(`CallEngine.forceEnd`)。
|
|
42
|
+
*
|
|
43
|
+
* # 为什么不走 dispatch
|
|
44
|
+
*
|
|
45
|
+
* dispatch 产出的帧要排在 `sendFrame` 的 await 链上——前面要是还有一个在途请求
|
|
46
|
+
* (比如迟迟没回的 room.join),结束帧就跟着一起卡住。2026-09-13 iOS frank 那次
|
|
47
|
+
* `call.hangup` 一帧都没到服务端,卡的正是这一段。所以帧走 `Connection.fire`,
|
|
48
|
+
* 在这次调用里就同步写进 socket。
|
|
49
|
+
*
|
|
50
|
+
* # 为什么这里不用比对「是不是同一场」
|
|
51
|
+
*
|
|
52
|
+
* 算帧与本地收场在同一次同步调用里完成,中间不会插进别的帧(iOS 那边隔着 actor 才要比对)。
|
|
53
|
+
* 拨出中还没拿到 call_id 的,此刻发不了 cancel:本地照样收场,
|
|
54
|
+
* 那条 invite.ok 迟到时由通话机的 idle 分支补发(`callRecv.ts` 的 `handleLateFrame`)。
|
|
55
|
+
*/
|
|
56
|
+
forceEnd(nowMs?: number, reason?: CallEndReasonValue): void;
|
|
57
|
+
/** fireFrames 把结束帧直接交给信令连接,不等应答。 */
|
|
58
|
+
private fireFrames;
|
|
59
|
+
/**
|
|
60
|
+
* apply 把一次推进的结果落地:记状态、同步媒体层、抛事件、发帧。
|
|
61
|
+
*
|
|
62
|
+
* **发帧之前的部分都是同步的**——`forceEnd` 靠这一点在调用返回前就把事件抛完。
|
|
63
|
+
*/
|
|
64
|
+
private apply;
|
|
65
|
+
/** sendFrame 发一帧,并把应答喂回状态机。 */
|
|
66
|
+
private sendFrame;
|
|
67
|
+
/**
|
|
68
|
+
* rollback 把「这一帧没送到」翻译成状态机能收场的内部事件。
|
|
69
|
+
*
|
|
70
|
+
* **一张表管住所有中间态**:留在中间态的代价永远是同一种——界面停在一个转圈的屏上,
|
|
71
|
+
* 而之后每一个动作都被不变量本地拒成 2005,宿主只看到一串没头没尾的 2005,
|
|
72
|
+
* 真正的原因早淹在上一条 error 里了。四端同一张表(Android 的
|
|
73
|
+
* `IMCallEngine.onRequestFailed`、iOS 的 `IMFrameLoop.sendFrame`)。
|
|
74
|
+
*/
|
|
75
|
+
private rollback;
|
|
76
|
+
/**
|
|
77
|
+
* logLocalReject 把「状态机本地拒掉了一个动作」记成一条**说得清的**日志。
|
|
78
|
+
*
|
|
79
|
+
* 宿主收到的 `onError` 只有 `code=2005 / invalid_state`——**哪个动作、当时什么状态,
|
|
80
|
+
* 一个字都没有**。三人会议那次排查就卡在这里:日志里十几条一模一样的 2005,
|
|
81
|
+
* 要读代码才能推出「点的是挂断、而会议里没有 call」。
|
|
82
|
+
*
|
|
83
|
+
* 不把这些塞进 `onError` 的载荷,是因为那是四端共用的公开回调表;
|
|
84
|
+
* 诊断信息进日志就够了。
|
|
85
|
+
*/
|
|
86
|
+
private logLocalReject;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* videoTurnedOn 挑出这一批事件里「开了摄像头」的人。只看视频、只看开——
|
|
90
|
+
* 关摄像头与麦克风开关不用等画面(Android `videoTurnedOn` 同一条判据)。
|
|
91
|
+
*/
|
|
92
|
+
export declare function videoTurnedOn(emit: readonly EmittedEvent[]): string[];
|
|
93
|
+
//# sourceMappingURL=frameLoop.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"frameLoop.d.ts","sourceRoot":"","sources":["../src/frameLoop.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAGhD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAG5D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAEvD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAC5D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAE9D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAG9D,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAgC,MAAM,kBAAkB,CAAC;AAwBjG,mCAAmC;AACnC,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,GAAG,EAAE,SAAS,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAC7B,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAC7B,uCAAuC;IACvC,UAAU,EAAE,MAAM,UAAU,GAAG,IAAI,CAAC;IACpC,uCAAuC;IACvC,SAAS,EAAE,MAAM,cAAc,CAAC;CACjC;AAED,8BAA8B;AAC9B,qBAAa,SAAS;IAGR,OAAO,CAAC,QAAQ,CAAC,IAAI;IAFjC,OAAO,CAAC,GAAG,CAAuC;gBAErB,IAAI,EAAE,aAAa;IAEhD,gCAAgC;IAChC,IAAI,KAAK,IAAI,aAAa,CAEzB;IAED,8BAA8B;IAC9B,KAAK,IAAI,IAAI;IAIb;;;;;;OAMG;IACG,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IA+BhF,oCAAoC;IAC9B,QAAQ,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAIlD;;;;;;;;;;;;;;;OAeG;IACH,QAAQ,CAAC,KAAK,GAAE,MAAmB,EAAE,MAAM,CAAC,EAAE,kBAAkB,GAAG,IAAI;IAoBvE,oCAAoC;IACpC,OAAO,CAAC,UAAU;IAYlB;;;;OAIG;YACW,KAAK;IAyDnB,+BAA+B;YACjB,SAAS;IAiCvB;;;;;;;OAOG;YACW,QAAQ;IAiEtB;;;;;;;;;OASG;IACH,OAAO,CAAC,cAAc;CAYvB;AAcD;;;GAGG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,SAAS,YAAY,EAAE,GAAG,MAAM,EAAE,CAQrE"}
|