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
|
@@ -0,0 +1,346 @@
|
|
|
1
|
+
import { ErrorCode, RtcError } from './errors.js';
|
|
2
|
+
import { LogField, logger } from './logger.js';
|
|
3
|
+
import { addRemoteCandidate } from './media/mediaPlane.js';
|
|
4
|
+
import { CallEndReason } from './reasons.js';
|
|
5
|
+
import { toFrameProps } from './signaling/caseMapping.js';
|
|
6
|
+
import { lookupFrame } from './signaling/registry.js';
|
|
7
|
+
import { initialEngineContext, reduceEngine } from './state/engineMachine.js';
|
|
8
|
+
import { forceEnd as planForceEnd } from './state/forceEnd.js';
|
|
9
|
+
/**
|
|
10
|
+
* engine 的**核心循环**:输入喂进状态机 → 产出的帧发出去 → 应答再喂回来。
|
|
11
|
+
*
|
|
12
|
+
* 从 `engine.ts` 拆出来的理由是体量红线(CONVENTIONS §2),但这一刀本来就该切:
|
|
13
|
+
* 门面负责的是**对宿主的那张 API 表**,这里负责的是**状态机与线路之间的往返**。
|
|
14
|
+
* 状态机的当前快照也归这里管——它是这个循环的状态,不是门面的字段。
|
|
15
|
+
*/
|
|
16
|
+
/**
|
|
17
|
+
* LEAVE_CALLBACKS 是「这一轮媒体到此为止」的信号。
|
|
18
|
+
*
|
|
19
|
+
* 三个都要算:通话正常结束、自己离房、房间被服务端关掉。
|
|
20
|
+
* 少算一个的后果是同一条:下一次进房带着上一轮的 PeerConnection。
|
|
21
|
+
*/
|
|
22
|
+
const LEAVE_CALLBACKS = new Set(['onCallEnd', 'onRoomLeft', 'onRoomClosed']);
|
|
23
|
+
/** LATE_MEDIA_FRAMES 是交给媒体层之前要先看房间还在不在的那几帧。见 `handleIncoming` 开头。 */
|
|
24
|
+
const LATE_MEDIA_FRAMES = new Set(['room.ice_candidate', 'room.offer', 'room.answer']);
|
|
25
|
+
/** SLOW_REQUEST_MS:请求往返超过这么久记一条。正常是几十毫秒。 */
|
|
26
|
+
const SLOW_REQUEST_MS = 2_000;
|
|
27
|
+
/** FrameLoop 持有状态机快照,并驱动它。 */
|
|
28
|
+
export class FrameLoop {
|
|
29
|
+
deps;
|
|
30
|
+
ctx = initialEngineContext;
|
|
31
|
+
constructor(deps) {
|
|
32
|
+
this.deps = deps;
|
|
33
|
+
}
|
|
34
|
+
/** state 是状态机的当前快照,供门面转给 UI。 */
|
|
35
|
+
get state() {
|
|
36
|
+
return this.ctx;
|
|
37
|
+
}
|
|
38
|
+
/** reset 把状态机归零(logout 用)。 */
|
|
39
|
+
reset() {
|
|
40
|
+
this.ctx = initialEngineContext;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* handleIncoming 是**所有下行帧的唯一入口**——事件与应答都走它。
|
|
44
|
+
*
|
|
45
|
+
* 这里曾经漏了应答那一半:`.ok` 走的是 `request()` 的 Promise,没喂回状态机,
|
|
46
|
+
* 于是 `room.join` 发出去了、`room.join.ok` 回来了,房间状态却永远停在 `joining`,
|
|
47
|
+
* 随后的 publish 全被 R1「只有 joined 才允许发布」本地拒掉。
|
|
48
|
+
*/
|
|
49
|
+
async handleIncoming(type, data) {
|
|
50
|
+
const { media, sender } = this.deps;
|
|
51
|
+
/*
|
|
52
|
+
**房间已经不在了,迟到的媒体帧不许交给媒体层。**
|
|
53
|
+
|
|
54
|
+
强制收场、通话结束之后才到的候选或 SDP 要是照常交下去,媒体层会在一个没人要的房间上
|
|
55
|
+
继续协商、甚至把 PeerConnection 重新建起来,一直挂到下一次关媒体。
|
|
56
|
+
状态机那一侧由房间机的 idle 分支丢弃(`roomRecv.ts` 的 `handleLateFrame`)。
|
|
57
|
+
*/
|
|
58
|
+
if (this.ctx.room.state === 'idle' && LATE_MEDIA_FRAMES.has(type)) {
|
|
59
|
+
logger.debug('房间已不在,丢弃迟到的媒体帧', { type });
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
if (type === 'room.ice_candidate') {
|
|
63
|
+
await addRemoteCandidate(this.deps.mediaDeps(), (pc, init) => media.addRemoteCandidate(pc, init), data);
|
|
64
|
+
return; // 候选只关媒体层的事,状态机不认识它
|
|
65
|
+
}
|
|
66
|
+
if (type === 'room.offer' && data['pc'] === 'sub') {
|
|
67
|
+
sender.noteSubOffer(typeof data['sdp'] === 'string' ? data['sdp'] : '');
|
|
68
|
+
}
|
|
69
|
+
if (type === 'room.answer' && data['pc'] === 'pub') {
|
|
70
|
+
// 先把 SDP 应用到媒体层,再让状态机把发布状态推进到 published。
|
|
71
|
+
await media.applyPubAnswer(typeof data['sdp'] === 'string' ? data['sdp'] : '');
|
|
72
|
+
}
|
|
73
|
+
await this.dispatch({ kind: 'recv', type, data });
|
|
74
|
+
}
|
|
75
|
+
/** dispatch 把一个输入喂进状态机,然后发帧、抛事件。 */
|
|
76
|
+
async dispatch(input) {
|
|
77
|
+
await this.apply(reduceEngine(this.ctx, input), input);
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* forceEnd 强制收掉当前这一场:**先把结束帧直接交给信令连接,再在本地收场**(`CallEngine.forceEnd`)。
|
|
81
|
+
*
|
|
82
|
+
* # 为什么不走 dispatch
|
|
83
|
+
*
|
|
84
|
+
* dispatch 产出的帧要排在 `sendFrame` 的 await 链上——前面要是还有一个在途请求
|
|
85
|
+
* (比如迟迟没回的 room.join),结束帧就跟着一起卡住。2026-09-13 iOS frank 那次
|
|
86
|
+
* `call.hangup` 一帧都没到服务端,卡的正是这一段。所以帧走 `Connection.fire`,
|
|
87
|
+
* 在这次调用里就同步写进 socket。
|
|
88
|
+
*
|
|
89
|
+
* # 为什么这里不用比对「是不是同一场」
|
|
90
|
+
*
|
|
91
|
+
* 算帧与本地收场在同一次同步调用里完成,中间不会插进别的帧(iOS 那边隔着 actor 才要比对)。
|
|
92
|
+
* 拨出中还没拿到 call_id 的,此刻发不了 cancel:本地照样收场,
|
|
93
|
+
* 那条 invite.ok 迟到时由通话机的 idle 分支补发(`callRecv.ts` 的 `handleLateFrame`)。
|
|
94
|
+
*/
|
|
95
|
+
forceEnd(nowMs = Date.now(), reason) {
|
|
96
|
+
const plan = planForceEnd(this.ctx, nowMs, reason);
|
|
97
|
+
if (plan.emit.length === 0) {
|
|
98
|
+
logger.info('强制收场:没有进行中的通话或房间', {});
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
logger.warn('强制收场', {
|
|
102
|
+
[LogField.callId]: this.ctx.call.callId,
|
|
103
|
+
call_state: this.ctx.call.state,
|
|
104
|
+
[LogField.roomId]: this.ctx.room.roomId,
|
|
105
|
+
room_state: this.ctx.room.state,
|
|
106
|
+
frames: plan.send.map((frame) => frame.type).join(','),
|
|
107
|
+
});
|
|
108
|
+
this.fireFrames(plan.send);
|
|
109
|
+
// 结束帧已经直发过了,这里只落状态与事件;apply 的同步前半段(记状态、关媒体、抛事件)当场跑完。
|
|
110
|
+
this.apply({ state: plan.state, send: [], emit: plan.emit }).catch((err) => this.deps.bus.emitError(err));
|
|
111
|
+
}
|
|
112
|
+
/** fireFrames 把结束帧直接交给信令连接,不等应答。 */
|
|
113
|
+
fireFrames(frames) {
|
|
114
|
+
const connection = this.deps.connection();
|
|
115
|
+
if (connection === null) {
|
|
116
|
+
if (frames.length > 0)
|
|
117
|
+
logger.warn('强制收场:没有信令连接,结束帧发不出去,只做本地收场', {});
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
for (const frame of frames) {
|
|
121
|
+
const fields = lookupFrame(frame.type);
|
|
122
|
+
if (fields !== undefined)
|
|
123
|
+
connection.fire(frame.type, fields, toFrameProps(fields, frame.data));
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* apply 把一次推进的结果落地:记状态、同步媒体层、抛事件、发帧。
|
|
128
|
+
*
|
|
129
|
+
* **发帧之前的部分都是同步的**——`forceEnd` 靠这一点在调用返回前就把事件抛完。
|
|
130
|
+
*/
|
|
131
|
+
async apply(result, input) {
|
|
132
|
+
const { bus, bridge } = this.deps;
|
|
133
|
+
this.ctx = result.state;
|
|
134
|
+
// 认领新到的远端轨道,**并把状态机里已经没有的那些摘掉**(见 syncRemoteTracks)。
|
|
135
|
+
bridge.syncRemoteTracks(this.ctx.room.remoteTracks);
|
|
136
|
+
// **一通结束就把媒体面归零**,在抛事件之前:宿主收到 onCallEnd 时
|
|
137
|
+
// engine 已经是干净的,下一通不会带着上一通的轨道去协商。
|
|
138
|
+
if (result.emit.some((event) => LEAVE_CALLBACKS.has(event.cb)))
|
|
139
|
+
bridge.reset();
|
|
140
|
+
/*
|
|
141
|
+
**先抛事件、再发帧**,顺序不能反。
|
|
142
|
+
|
|
143
|
+
事件说的是「刚刚发生了什么」,帧说的是「接下来要做什么」——反过来的话,
|
|
144
|
+
帧的应答会在本轮事件之前就被处理掉,宿主收到的回调顺序就乱了。
|
|
145
|
+
实测症状:`call.connected` 产出 onCallBegin(事件)与 room.join(帧),
|
|
146
|
+
先发帧的话 join.ok 立刻回来并抛出 onRoomJoined,于是宿主看到的是
|
|
147
|
+
**roomJoined 和 userEnter 排在 callBegin 前面**——它还没被告知有这通电话,
|
|
148
|
+
就先收到了这通电话房间里的事件。
|
|
149
|
+
*/
|
|
150
|
+
if (input !== undefined)
|
|
151
|
+
this.logLocalReject(input, result.emit);
|
|
152
|
+
for (const event of result.emit) {
|
|
153
|
+
/*
|
|
154
|
+
**`onDisconnected` 由连接层独占**,状态机那一份不往外发。
|
|
155
|
+
|
|
156
|
+
两边都发的话宿主每次断线收到**两条** `disconnected`,而且状态机那条
|
|
157
|
+
是空载荷的(一致性向量里就是 `args: {}`——它只关心状态怎么走,
|
|
158
|
+
关闭码不是状态机的事)。实测日志里的样子是:一条 `{}`、一条
|
|
159
|
+
`{code:4401,willReconnect:false}`,中间还夹着一条假的 4403——
|
|
160
|
+
那是「鉴权失败到顶」复用了 `ws_closed_4403` 这个内部事件留下的。
|
|
161
|
+
宿主想数重连次数就没法数了。
|
|
162
|
+
*/
|
|
163
|
+
if (event.cb === 'onDisconnected')
|
|
164
|
+
continue;
|
|
165
|
+
/*
|
|
166
|
+
**`onKickedOut` 同理由连接层独占。**
|
|
167
|
+
|
|
168
|
+
状态机那一份也是空载荷的,而宿主真正需要的是**为什么被踢**:
|
|
169
|
+
`takenOver`(被顶号/被吊销,回登录页)与 `authExpired`(票的问题,换票重来)
|
|
170
|
+
处置完全相反。状态机不可能知道这个——它只收到一个 `ws_closed_4403` 内部事件,
|
|
171
|
+
而「鉴权失败到顶」也复用了同一个内部事件(见上面那段注释)。
|
|
172
|
+
两边都发的话宿主会收到两条 kickedOut,其中一条还没有 reason。
|
|
173
|
+
*/
|
|
174
|
+
if (event.cb === 'onKickedOut')
|
|
175
|
+
continue;
|
|
176
|
+
bus.emitMachine(event);
|
|
177
|
+
}
|
|
178
|
+
/*
|
|
179
|
+
有人开了摄像头:等他的**新画面真的上屏**再抛一次 firstVideoFrame(见 `FirstFrameGate`)。
|
|
180
|
+
放在抛事件之后——界面先收到 userVideoAvailable 记成「等画面」,再等这一帧来揭示。
|
|
181
|
+
*/
|
|
182
|
+
for (const uid of videoTurnedOn(result.emit)) {
|
|
183
|
+
bridge.awaitFirstVideoFrame(uid, (trackId) => bus.emit('firstVideoFrame', { uid, trackId }));
|
|
184
|
+
}
|
|
185
|
+
for (const frame of result.send) {
|
|
186
|
+
await this.sendFrame(frame);
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
/** sendFrame 发一帧,并把应答喂回状态机。 */
|
|
190
|
+
async sendFrame(frame) {
|
|
191
|
+
const connection = this.deps.connection();
|
|
192
|
+
/*
|
|
193
|
+
**没有连接不是「什么都不做」,是一次失败。**
|
|
194
|
+
|
|
195
|
+
原先这里是裸的 `if (connection === null) return`:状态机已经迁移过了,帧却没发出去,
|
|
196
|
+
既不回滚也不报错。宿主在 `login()` 之前(或 `logout()` 之后)调一次 `call()`,
|
|
197
|
+
通话机就永久停在 `inviting`——界面「正在呼叫…」转个不停,之后 `hangup()` 被本地
|
|
198
|
+
拒成 2005、`cancel()` 产出的帧同样被丢掉,**再也回不到 idle**,下一通真电话也被
|
|
199
|
+
2005 挡住。走下面这条收场路径之后,宿主拿到的是一条 `2007 not_logged_in`
|
|
200
|
+
加一次正常的 `callEnd`,界面收得掉。(Android 的 `IMSignalConnection.request`
|
|
201
|
+
未连接时就是立刻回 `NOT_LOGGED_IN`,本端这个码定义了却一直没人用。)
|
|
202
|
+
*/
|
|
203
|
+
if (connection === null) {
|
|
204
|
+
const err = new RtcError(ErrorCode.notLoggedIn, { forType: frame.type });
|
|
205
|
+
this.deps.bus.emitError(err);
|
|
206
|
+
await this.rollback(frame);
|
|
207
|
+
return;
|
|
208
|
+
}
|
|
209
|
+
const startedMs = Date.now();
|
|
210
|
+
try {
|
|
211
|
+
const reply = await this.deps.sender.send(connection, frame.type, frame.data);
|
|
212
|
+
noteSlowRequest(frame.type, startedMs, false);
|
|
213
|
+
// **应答也要喂回状态机**:join.ok / publish.ok 都是状态推进的关键一步。
|
|
214
|
+
if (reply !== null)
|
|
215
|
+
await this.handleIncoming(reply.type, reply.data);
|
|
216
|
+
}
|
|
217
|
+
catch (err) {
|
|
218
|
+
noteSlowRequest(frame.type, startedMs, true);
|
|
219
|
+
// 请求失败不该中断整个事件流:转成 error 事件交给宿主。
|
|
220
|
+
this.deps.bus.emitError(err);
|
|
221
|
+
await this.rollback(frame);
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* rollback 把「这一帧没送到」翻译成状态机能收场的内部事件。
|
|
226
|
+
*
|
|
227
|
+
* **一张表管住所有中间态**:留在中间态的代价永远是同一种——界面停在一个转圈的屏上,
|
|
228
|
+
* 而之后每一个动作都被不变量本地拒成 2005,宿主只看到一串没头没尾的 2005,
|
|
229
|
+
* 真正的原因早淹在上一条 error 里了。四端同一张表(Android 的
|
|
230
|
+
* `IMCallEngine.onRequestFailed`、iOS 的 `IMFrameLoop.sendFrame`)。
|
|
231
|
+
*/
|
|
232
|
+
async rollback(frame) {
|
|
233
|
+
const { type } = frame;
|
|
234
|
+
/*
|
|
235
|
+
呼叫 / 接听 / 主动加入被拒都要退回 idle。
|
|
236
|
+
|
|
237
|
+
`call.invite` 不退的话界面停在「正在呼叫…」,而服务端根本没有这通电话,
|
|
238
|
+
之后每次挂断都换回 1401 call_not_found,用户永远退不出那一屏。
|
|
239
|
+
**`call.accept` 与 `call.join` 是后补的**:被拒时通话机滞留在 `accepting`,
|
|
240
|
+
而 `reject()` 要求 `ringing`——来电屏上两个按钮全都点不动,一个出口都没有。
|
|
241
|
+
*/
|
|
242
|
+
if (type === 'call.invite' || type === 'call.accept' || type === 'call.join') {
|
|
243
|
+
await this.dispatch({ kind: 'internal', name: 'call_failed' });
|
|
244
|
+
return;
|
|
245
|
+
}
|
|
246
|
+
/*
|
|
247
|
+
**进房失败要把房间状态退回 idle**。
|
|
248
|
+
|
|
249
|
+
不退的话状态机永远停在 `joining`,之后每一次 publish 都会被不变量 R1
|
|
250
|
+
本地拒掉(2005 invalid_state),而宿主只看到两条没头没尾的 2005——
|
|
251
|
+
真正的原因(那条 room.join 被服务端拒了)已经淹在上一条 error 里了。
|
|
252
|
+
退回 idle 至少让「重进一次」成为可能。
|
|
253
|
+
*/
|
|
254
|
+
if (type === 'room.join') {
|
|
255
|
+
await this.dispatch({ kind: 'internal', name: 'join_failed' });
|
|
256
|
+
return;
|
|
257
|
+
}
|
|
258
|
+
/*
|
|
259
|
+
**离房被拒也要退回 idle**:服务端在「会话已不在房间里」时回 1203,
|
|
260
|
+
而那正说明我们已经不在房里了。不接这一条的话房间永久停在 `leaving`——
|
|
261
|
+
`onRoomLeft` 抛不出来,于是 `LEAVE_CALLBACKS` 不命中、`bridge.reset()` 不跑,
|
|
262
|
+
**摄像头与麦克风一直开着**,而之后每次 join / leave 都被本地拒成 2005,
|
|
263
|
+
这台 engine 除非 logout 否则再也进不了房。
|
|
264
|
+
*/
|
|
265
|
+
if (type === 'room.leave') {
|
|
266
|
+
await this.dispatch({ kind: 'internal', name: 'leave_failed' });
|
|
267
|
+
return;
|
|
268
|
+
}
|
|
269
|
+
/*
|
|
270
|
+
**发布被拒:通话里直接收掉整通(reason=error),没有通话才只回滚那一条**(静默失败审计 §A)。
|
|
271
|
+
|
|
272
|
+
原先这张表不认 `room.publish`,那条轨道永远停在 `publishing`:publish.ok 不来 →
|
|
273
|
+
pub offer 永不产出 → 上行从未协商。界面显示已接通、计时器在走、按钮显示没静音,
|
|
274
|
+
**对方全程听不见看不见,零提示**。留在通话里只报错也不够——Kit 并不展示这类错误,
|
|
275
|
+
而服务端会拒的几种情形(房间已不在、同一路重复发布、请求超时)重试都救不回来。
|
|
276
|
+
收场走 forceEnd:挂断帧不排队、callEnd 只抛一次,各端 Kit 本来就认它。
|
|
277
|
+
*/
|
|
278
|
+
if (type === 'room.publish') {
|
|
279
|
+
if (this.ctx.call.state !== 'idle') {
|
|
280
|
+
logger.warn('发布被拒,结束本端通话', { [LogField.callId]: this.ctx.call.callId });
|
|
281
|
+
this.forceEnd(Date.now(), CallEndReason.error);
|
|
282
|
+
return;
|
|
283
|
+
}
|
|
284
|
+
await this.dispatch({ kind: 'internal', name: 'publish_failed', args: { cid: frame.data['cid'] } });
|
|
285
|
+
return;
|
|
286
|
+
}
|
|
287
|
+
// 订阅被拒只摘记账,不收场:最常见的 1301 是订阅与对方停推赛跑输了,通话本身没事。
|
|
288
|
+
if (type === 'room.subscribe') {
|
|
289
|
+
await this.dispatch({
|
|
290
|
+
kind: 'internal',
|
|
291
|
+
name: 'subscribe_failed',
|
|
292
|
+
args: { track_id: frame.data['track_id'] },
|
|
293
|
+
});
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
/**
|
|
297
|
+
* logLocalReject 把「状态机本地拒掉了一个动作」记成一条**说得清的**日志。
|
|
298
|
+
*
|
|
299
|
+
* 宿主收到的 `onError` 只有 `code=2005 / invalid_state`——**哪个动作、当时什么状态,
|
|
300
|
+
* 一个字都没有**。三人会议那次排查就卡在这里:日志里十几条一模一样的 2005,
|
|
301
|
+
* 要读代码才能推出「点的是挂断、而会议里没有 call」。
|
|
302
|
+
*
|
|
303
|
+
* 不把这些塞进 `onError` 的载荷,是因为那是四端共用的公开回调表;
|
|
304
|
+
* 诊断信息进日志就够了。
|
|
305
|
+
*/
|
|
306
|
+
logLocalReject(input, emit) {
|
|
307
|
+
if (input.kind !== 'act')
|
|
308
|
+
return;
|
|
309
|
+
const rejected = emit.some((event) => event.cb === 'onError' && event.args['code'] === ErrorCode.invalidState);
|
|
310
|
+
if (!rejected)
|
|
311
|
+
return;
|
|
312
|
+
logger.warn('动作被状态机本地拒绝', {
|
|
313
|
+
op: input.op,
|
|
314
|
+
call_state: this.ctx.call.state,
|
|
315
|
+
room_state: this.ctx.room.state,
|
|
316
|
+
});
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
/**
|
|
320
|
+
* noteSlowRequest 记下「这一帧从交给 sender 到拿回应答」慢得不正常的那几次。
|
|
321
|
+
*
|
|
322
|
+
* 2026-09-13 iOS frank 的 room.join 从状态机产出到服务端收到隔了 28.6 秒,而客户端一个字都没留下。
|
|
323
|
+
* 有了这一条,拿 `elapsed_ms` 对服务端的受理时刻,就分得清慢在本端发出之前还是服务端那边。
|
|
324
|
+
*/
|
|
325
|
+
function noteSlowRequest(type, startedMs, failed) {
|
|
326
|
+
const elapsedMs = Date.now() - startedMs;
|
|
327
|
+
if (elapsedMs < SLOW_REQUEST_MS)
|
|
328
|
+
return;
|
|
329
|
+
logger.warn('请求往返慢', { type, elapsed_ms: elapsedMs, failed });
|
|
330
|
+
}
|
|
331
|
+
/**
|
|
332
|
+
* videoTurnedOn 挑出这一批事件里「开了摄像头」的人。只看视频、只看开——
|
|
333
|
+
* 关摄像头与麦克风开关不用等画面(Android `videoTurnedOn` 同一条判据)。
|
|
334
|
+
*/
|
|
335
|
+
export function videoTurnedOn(emit) {
|
|
336
|
+
const uids = [];
|
|
337
|
+
for (const event of emit) {
|
|
338
|
+
if (event.cb !== 'onUserVideoAvailable' || event.args['available'] !== true)
|
|
339
|
+
continue;
|
|
340
|
+
const uid = event.args['uid'];
|
|
341
|
+
if (typeof uid === 'string' && uid !== '')
|
|
342
|
+
uids.push(uid);
|
|
343
|
+
}
|
|
344
|
+
return uids;
|
|
345
|
+
}
|
|
346
|
+
//# sourceMappingURL=frameLoop.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"frameLoop.js","sourceRoot":"","sources":["../src/frameLoop.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `im-rtc-call-engine` —— im-rtc 的无 UI 核心。
|
|
3
|
+
*
|
|
4
|
+
* **框架无关**:本包禁止依赖 react 或任何 UI 库,且必须能在无 DOM 的环境构造
|
|
5
|
+
* (一致性向量测试就跑在 Node 里)。DOM / WebRTC 的接触点收敛在 media/ 与 devices/。
|
|
6
|
+
*
|
|
7
|
+
* **协议契约在 `im-rtc-server/docs/RTC_PROTOCOL.md`,本仓只读引用**——
|
|
8
|
+
* 不得单方面加字段。改协议 = 改四个仓 + 同步一致性向量。
|
|
9
|
+
*
|
|
10
|
+
* 当前进度(P2 第一刀):信令帧的编解码与协议常量。
|
|
11
|
+
* 状态机、WS 客户端、媒体适配器随后落地。
|
|
12
|
+
*/
|
|
13
|
+
export { SDK_VERSION } from './version.js';
|
|
14
|
+
export { ERROR_DEFINITIONS, ErrorCode, RtcError, errorName, isLocalError, isRetryable, isRtcError, lookupError, } from './errors.js';
|
|
15
|
+
export type { ErrorCodeName, ErrorCodeValue, ErrorDefinition } from './errors.js';
|
|
16
|
+
/** 宿主可以自己先验一遍生成的 id,不必等到 login() / joinRoom() 才发现(协议 §2.5)。 */
|
|
17
|
+
export { checkDeviceId, checkRoomId } from './protocolId.js';
|
|
18
|
+
export { CallEndReason, GROUP_DOMINANT_PRIORITY, callDurationSec, dominantReason, normalizeReason, } from './reasons.js';
|
|
19
|
+
export type { CallEndReasonValue } from './reasons.js';
|
|
20
|
+
export { LogField, clearDiagnostics, exportDiagnostics, logger, redact, redactCandidate, redactSdp, setLogClock, setLogLevel, setLogSink, } from './logger.js';
|
|
21
|
+
export type { DiagnosticEntry, LogFields, LogLevel, LogSink } from './logger.js';
|
|
22
|
+
export { MAX_FRAME_BYTES, OK_SUFFIX, decodeEnvelope, encodeEnvelope, isEvent, okType, } from './signaling/envelope.js';
|
|
23
|
+
export type { Envelope } from './signaling/envelope.js';
|
|
24
|
+
export { checkDiscipline } from './signaling/discipline.js';
|
|
25
|
+
export { DEFAULT_TIMEOUT_SEC, LAYERS, MAX_TIMEOUT_SEC, MEDIA_TYPES, MIN_TIMEOUT_SEC, PC_ROLES, REASONS, ROOM_KINDS, TRACK_KINDS, TRACK_SOURCES, } from './signaling/enums.js';
|
|
26
|
+
export type { HandledAction, Layer, MediaType, PcRole, RoomKind, TrackKind, TrackSource, } from './signaling/enums.js';
|
|
27
|
+
export { FrameType, REQUEST_TYPES, RESERVED_TYPES, decodeFrame, encodeFrame, isRequestType, isReservedType, knownFrameTypes, lookupFrame, newFrameData, } from './signaling/registry.js';
|
|
28
|
+
export type { FieldSpec, FrameData, FrameFields } from './signaling/fieldSpec.js';
|
|
29
|
+
export { BACKOFF_STEPS_MS, backoffDelayMs } from './signaling/backoff.js';
|
|
30
|
+
export { CloseCode, shouldReconnect } from './signaling/webSocket.js';
|
|
31
|
+
export type { WebSocketFactory, WebSocketLike } from './signaling/webSocket.js';
|
|
32
|
+
export { Connection } from './signaling/connection.js';
|
|
33
|
+
export type { ConnectionEvents, ConnectionOptions, ConnectionState, HelloOk } from './signaling/connection.js';
|
|
34
|
+
export { initialCallContext, reduceCall, synthesizeNetworkEnd } from './state/callMachine.js';
|
|
35
|
+
export type { CallContext, CallRole, CallState } from './state/callMachine.js';
|
|
36
|
+
export { initialRoomContext, reduceRoom, resumeRoom } from './state/roomMachine.js';
|
|
37
|
+
export type { PublishState, RoomContext, RoomState, SubscribeState } from './state/roomMachine.js';
|
|
38
|
+
export { initialEngineContext, reduceEngine } from './state/engineMachine.js';
|
|
39
|
+
export type { EngineContext } from './state/engineMachine.js';
|
|
40
|
+
export type { EmittedEvent, MachineInput, MachineOutput, OutgoingFrame } from './state/types.js';
|
|
41
|
+
export { CallEngine } from './engine.js';
|
|
42
|
+
export type { CallOptions, EngineOptions } from './engine.js';
|
|
43
|
+
export { EventBus } from './eventBus.js';
|
|
44
|
+
export { EngineBus } from './engineBus.js';
|
|
45
|
+
export { MACHINE_EVENT_NAMES } from './events.js';
|
|
46
|
+
export type { CallRoleName, EngineEventHandler, EngineEventName, EngineEvents } from './events.js';
|
|
47
|
+
export { WebRTCAdapter } from './media/webrtcAdapter.js';
|
|
48
|
+
export { VideoProfiles, defaultVideoProfile, videoConstraints } from './media/videoProfile.js';
|
|
49
|
+
export type { VideoProfile } from './media/videoProfile.js';
|
|
50
|
+
export { ViewRegistry } from './media/viewRegistry.js';
|
|
51
|
+
export { MediaBridge } from './media/mediaBridge.js';
|
|
52
|
+
export type { ViewElement } from './media/viewRegistry.js';
|
|
53
|
+
export { camelizeArgs, snakeToCamel, toFrameProps } from './signaling/caseMapping.js';
|
|
54
|
+
export { FrameSender } from './signaling/frameSender.js';
|
|
55
|
+
export { parseCandidate } from './signaling/candidate.js';
|
|
56
|
+
export { createConnection } from './signaling/connectionFactory.js';
|
|
57
|
+
export type { ParsedCandidate } from './signaling/candidate.js';
|
|
58
|
+
export type { LocalTrackInfo, MediaAdapter, MediaAdapterEvents, MediaSource, } from './media/mediaAdapter.js';
|
|
59
|
+
export * as frames from './signaling/frames.room.js';
|
|
60
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE3C,OAAO,EACL,iBAAiB,EACjB,SAAS,EACT,QAAQ,EACR,SAAS,EACT,YAAY,EACZ,WAAW,EACX,UAAU,EACV,WAAW,GACZ,MAAM,aAAa,CAAC;AACrB,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAElF,+DAA+D;AAC/D,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAE7D,OAAO,EACL,aAAa,EACb,uBAAuB,EACvB,eAAe,EACf,cAAc,EACd,eAAe,GAChB,MAAM,cAAc,CAAC;AACtB,YAAY,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAEvD,OAAO,EACL,QAAQ,EACR,gBAAgB,EAChB,iBAAiB,EACjB,MAAM,EACN,MAAM,EACN,eAAe,EACf,SAAS,EACT,WAAW,EACX,WAAW,EACX,UAAU,GACX,MAAM,aAAa,CAAC;AACrB,YAAY,EAAE,eAAe,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAEjF,OAAO,EACL,eAAe,EACf,SAAS,EACT,cAAc,EACd,cAAc,EACd,OAAO,EACP,MAAM,GACP,MAAM,yBAAyB,CAAC;AACjC,YAAY,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAExD,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAE5D,OAAO,EACL,mBAAmB,EACnB,MAAM,EACN,eAAe,EACf,WAAW,EACX,eAAe,EACf,QAAQ,EACR,OAAO,EACP,UAAU,EACV,WAAW,EACX,aAAa,GACd,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EACV,aAAa,EACb,KAAK,EACL,SAAS,EACT,MAAM,EACN,QAAQ,EACR,SAAS,EACT,WAAW,GACZ,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EACL,SAAS,EACT,aAAa,EACb,cAAc,EACd,WAAW,EACX,WAAW,EACX,aAAa,EACb,cAAc,EACd,eAAe,EACf,WAAW,EACX,YAAY,GACb,MAAM,yBAAyB,CAAC;AAEjC,YAAY,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAElF,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC1E,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AACtE,YAAY,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAChF,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACvD,YAAY,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,2BAA2B,CAAC;AAE/G,OAAO,EAAE,kBAAkB,EAAE,UAAU,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9F,YAAY,EAAE,WAAW,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAC/E,OAAO,EAAE,kBAAkB,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpF,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACnG,OAAO,EAAE,oBAAoB,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAC9E,YAAY,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAC9D,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEjG,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC9D,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAClD,YAAY,EAAE,YAAY,EAAE,kBAAkB,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AACnG,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC/F,YAAY,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,YAAY,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AACtF,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AACpE,YAAY,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAChE,YAAY,EACV,cAAc,EACd,YAAY,EACZ,kBAAkB,EAClB,WAAW,GACZ,MAAM,yBAAyB,CAAC;AAEjC,OAAO,KAAK,MAAM,MAAM,4BAA4B,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `im-rtc-call-engine` —— im-rtc 的无 UI 核心。
|
|
3
|
+
*
|
|
4
|
+
* **框架无关**:本包禁止依赖 react 或任何 UI 库,且必须能在无 DOM 的环境构造
|
|
5
|
+
* (一致性向量测试就跑在 Node 里)。DOM / WebRTC 的接触点收敛在 media/ 与 devices/。
|
|
6
|
+
*
|
|
7
|
+
* **协议契约在 `im-rtc-server/docs/RTC_PROTOCOL.md`,本仓只读引用**——
|
|
8
|
+
* 不得单方面加字段。改协议 = 改四个仓 + 同步一致性向量。
|
|
9
|
+
*
|
|
10
|
+
* 当前进度(P2 第一刀):信令帧的编解码与协议常量。
|
|
11
|
+
* 状态机、WS 客户端、媒体适配器随后落地。
|
|
12
|
+
*/
|
|
13
|
+
export { SDK_VERSION } from './version.js';
|
|
14
|
+
export { ERROR_DEFINITIONS, ErrorCode, RtcError, errorName, isLocalError, isRetryable, isRtcError, lookupError, } from './errors.js';
|
|
15
|
+
/** 宿主可以自己先验一遍生成的 id,不必等到 login() / joinRoom() 才发现(协议 §2.5)。 */
|
|
16
|
+
export { checkDeviceId, checkRoomId } from './protocolId.js';
|
|
17
|
+
export { CallEndReason, GROUP_DOMINANT_PRIORITY, callDurationSec, dominantReason, normalizeReason, } from './reasons.js';
|
|
18
|
+
export { LogField, clearDiagnostics, exportDiagnostics, logger, redact, redactCandidate, redactSdp, setLogClock, setLogLevel, setLogSink, } from './logger.js';
|
|
19
|
+
export { MAX_FRAME_BYTES, OK_SUFFIX, decodeEnvelope, encodeEnvelope, isEvent, okType, } from './signaling/envelope.js';
|
|
20
|
+
export { checkDiscipline } from './signaling/discipline.js';
|
|
21
|
+
export { DEFAULT_TIMEOUT_SEC, LAYERS, MAX_TIMEOUT_SEC, MEDIA_TYPES, MIN_TIMEOUT_SEC, PC_ROLES, REASONS, ROOM_KINDS, TRACK_KINDS, TRACK_SOURCES, } from './signaling/enums.js';
|
|
22
|
+
export { FrameType, REQUEST_TYPES, RESERVED_TYPES, decodeFrame, encodeFrame, isRequestType, isReservedType, knownFrameTypes, lookupFrame, newFrameData, } from './signaling/registry.js';
|
|
23
|
+
export { BACKOFF_STEPS_MS, backoffDelayMs } from './signaling/backoff.js';
|
|
24
|
+
export { CloseCode, shouldReconnect } from './signaling/webSocket.js';
|
|
25
|
+
export { Connection } from './signaling/connection.js';
|
|
26
|
+
export { initialCallContext, reduceCall, synthesizeNetworkEnd } from './state/callMachine.js';
|
|
27
|
+
export { initialRoomContext, reduceRoom, resumeRoom } from './state/roomMachine.js';
|
|
28
|
+
export { initialEngineContext, reduceEngine } from './state/engineMachine.js';
|
|
29
|
+
export { CallEngine } from './engine.js';
|
|
30
|
+
export { EventBus } from './eventBus.js';
|
|
31
|
+
export { EngineBus } from './engineBus.js';
|
|
32
|
+
export { MACHINE_EVENT_NAMES } from './events.js';
|
|
33
|
+
export { WebRTCAdapter } from './media/webrtcAdapter.js';
|
|
34
|
+
export { VideoProfiles, defaultVideoProfile, videoConstraints } from './media/videoProfile.js';
|
|
35
|
+
export { ViewRegistry } from './media/viewRegistry.js';
|
|
36
|
+
export { MediaBridge } from './media/mediaBridge.js';
|
|
37
|
+
export { camelizeArgs, snakeToCamel, toFrameProps } from './signaling/caseMapping.js';
|
|
38
|
+
export { FrameSender } from './signaling/frameSender.js';
|
|
39
|
+
export { parseCandidate } from './signaling/candidate.js';
|
|
40
|
+
export { createConnection } from './signaling/connectionFactory.js';
|
|
41
|
+
export * as frames from './signaling/frames.room.js';
|
|
42
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE3C,OAAO,EACL,iBAAiB,EACjB,SAAS,EACT,QAAQ,EACR,SAAS,EACT,YAAY,EACZ,WAAW,EACX,UAAU,EACV,WAAW,GACZ,MAAM,aAAa,CAAC;AAGrB,+DAA+D;AAC/D,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAE7D,OAAO,EACL,aAAa,EACb,uBAAuB,EACvB,eAAe,EACf,cAAc,EACd,eAAe,GAChB,MAAM,cAAc,CAAC;AAGtB,OAAO,EACL,QAAQ,EACR,gBAAgB,EAChB,iBAAiB,EACjB,MAAM,EACN,MAAM,EACN,eAAe,EACf,SAAS,EACT,WAAW,EACX,WAAW,EACX,UAAU,GACX,MAAM,aAAa,CAAC;AAGrB,OAAO,EACL,eAAe,EACf,SAAS,EACT,cAAc,EACd,cAAc,EACd,OAAO,EACP,MAAM,GACP,MAAM,yBAAyB,CAAC;AAGjC,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAE5D,OAAO,EACL,mBAAmB,EACnB,MAAM,EACN,eAAe,EACf,WAAW,EACX,eAAe,EACf,QAAQ,EACR,OAAO,EACP,UAAU,EACV,WAAW,EACX,aAAa,GACd,MAAM,sBAAsB,CAAC;AAW9B,OAAO,EACL,SAAS,EACT,aAAa,EACb,cAAc,EACd,WAAW,EACX,WAAW,EACX,aAAa,EACb,cAAc,EACd,eAAe,EACf,WAAW,EACX,YAAY,GACb,MAAM,yBAAyB,CAAC;AAIjC,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC1E,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAEtE,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAGvD,OAAO,EAAE,kBAAkB,EAAE,UAAU,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAE9F,OAAO,EAAE,kBAAkB,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAEpF,OAAO,EAAE,oBAAoB,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAI9E,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAElD,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAE/F,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAErD,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AACtF,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AASpE,OAAO,KAAK,MAAM,MAAM,4BAA4B,CAAC"}
|
package/dist/logger.d.ts
ADDED
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 日志:**engine / uikit / demo 的唯一日志入口**(CONVENTIONS §6)。
|
|
3
|
+
*
|
|
4
|
+
* 机制与取舍见 `im-rtc-server/docs/mechanism/LOGGING.md`——那份文档是四仓统一的。
|
|
5
|
+
* 三条要点:
|
|
6
|
+
* - **三条管道分开**:诊断日志(这里)/ 业务事件(engine 回调)/ 质量指标(onNetworkQuality)。
|
|
7
|
+
* - **级别按「谁该被叫醒」分**:断线是 `warn` 不是 `error`(那是常态);
|
|
8
|
+
* `info` 只记状态跃迁,一次通话个位数条。
|
|
9
|
+
* - **不提供任何兼容桥接**——想打日志只有这一条路。姊妹项目上正是因为有桥接兜底,
|
|
10
|
+
* 54 处违规才能长期无人察觉。`scripts/check-logging.sh` 会拦住直接用 console 的写法。
|
|
11
|
+
*/
|
|
12
|
+
/** LogLevel 是日志级别。 */
|
|
13
|
+
export type LogLevel = 'debug' | 'info' | 'warn' | 'error';
|
|
14
|
+
/** LogFields 是结构化字段。 */
|
|
15
|
+
export type LogFields = Readonly<Record<string, unknown>>;
|
|
16
|
+
/** LogSink 接收一条日志。宿主可以替换它把日志接进自己的体系。 */
|
|
17
|
+
export type LogSink = (level: LogLevel, message: string, fields: LogFields) => void;
|
|
18
|
+
/**
|
|
19
|
+
* LogField 是必带字段的名字,**与服务端 internal/observability 的常量一一对应**。
|
|
20
|
+
*
|
|
21
|
+
* 别写字符串字面量:`room_id` / `roomId` / `room` 三种写法同时出现在一份日志里,
|
|
22
|
+
* 就没法按字段检索了。
|
|
23
|
+
*/
|
|
24
|
+
export declare const LogField: {
|
|
25
|
+
readonly requestId: "request_id";
|
|
26
|
+
readonly sessionId: "session_id";
|
|
27
|
+
readonly roomId: "room_id";
|
|
28
|
+
readonly callId: "call_id";
|
|
29
|
+
readonly uid: "uid";
|
|
30
|
+
readonly deviceId: "device_id";
|
|
31
|
+
readonly trackId: "track_id";
|
|
32
|
+
readonly code: "code";
|
|
33
|
+
};
|
|
34
|
+
/** DiagnosticEntry 是环形缓冲里的一条。 */
|
|
35
|
+
export interface DiagnosticEntry {
|
|
36
|
+
readonly atMs: number;
|
|
37
|
+
readonly level: LogLevel;
|
|
38
|
+
readonly message: string;
|
|
39
|
+
readonly fields: LogFields;
|
|
40
|
+
}
|
|
41
|
+
/** setLogSink 替换日志出口。传 null 恢复默认。 */
|
|
42
|
+
export declare function setLogSink(next: LogSink | null): void;
|
|
43
|
+
/** setLogLevel 设置最低输出级别。生产建议 'info'。 */
|
|
44
|
+
export declare function setLogLevel(level: LogLevel): void;
|
|
45
|
+
/** setLogClock 注入时钟,仅供测试。 */
|
|
46
|
+
export declare function setLogClock(next: (() => number) | null): void;
|
|
47
|
+
/**
|
|
48
|
+
* exportDiagnostics 导出最近的日志,供宿主做「报告问题」按钮。
|
|
49
|
+
*
|
|
50
|
+
* **不受 setLogLevel 影响**:环形缓冲永远记 `info` 及以上,
|
|
51
|
+
* 否则用户报障时正好没开 debug,等于什么都没有。
|
|
52
|
+
*/
|
|
53
|
+
export declare function exportDiagnostics(): DiagnosticEntry[];
|
|
54
|
+
/** clearDiagnostics 清空环形缓冲(通话结束或宿主登出时)。 */
|
|
55
|
+
export declare function clearDiagnostics(): void;
|
|
56
|
+
/** logger 是日志的公开入口。 */
|
|
57
|
+
export declare const logger: {
|
|
58
|
+
debug: (message: string, fields?: LogFields) => void;
|
|
59
|
+
info: (message: string, fields?: LogFields) => void;
|
|
60
|
+
warn: (message: string, fields?: LogFields) => void;
|
|
61
|
+
error: (message: string, fields?: LogFields) => void;
|
|
62
|
+
};
|
|
63
|
+
export { redact, redactCandidate, redactSdp } from './redact.js';
|
|
64
|
+
//# sourceMappingURL=logger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,sBAAsB;AACtB,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAE3D,wBAAwB;AACxB,MAAM,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;AAE1D,wCAAwC;AACxC,MAAM,MAAM,OAAO,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,KAAK,IAAI,CAAC;AAEpF;;;;;GAKG;AACH,eAAO,MAAM,QAAQ;;;;;;;;;CASX,CAAC;AAEX,iCAAiC;AACjC,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC;CAC5B;AAgCD,qCAAqC;AACrC,wBAAgB,UAAU,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,GAAG,IAAI,CAErD;AAED,wCAAwC;AACxC,wBAAgB,WAAW,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI,CAEjD;AAED,6BAA6B;AAC7B,wBAAgB,WAAW,CAAC,IAAI,EAAE,CAAC,MAAM,MAAM,CAAC,GAAG,IAAI,GAAG,IAAI,CAE7D;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,IAAI,eAAe,EAAE,CAErD;AAED,2CAA2C;AAC3C,wBAAgB,gBAAgB,IAAI,IAAI,CAEvC;AAYD,uBAAuB;AACvB,eAAO,MAAM,MAAM;qBACA,MAAM,WAAU,SAAS,KAAQ,IAAI;oBACtC,MAAM,WAAU,SAAS,KAAQ,IAAI;oBACrC,MAAM,WAAU,SAAS,KAAQ,IAAI;qBACpC,MAAM,WAAU,SAAS,KAAQ,IAAI;CACvD,CAAC;AAEF,OAAO,EAAE,MAAM,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC"}
|