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.
Files changed (218) hide show
  1. package/LICENSE +21 -0
  2. package/dist/bytes.d.ts +11 -0
  3. package/dist/bytes.d.ts.map +1 -0
  4. package/dist/bytes.js +20 -0
  5. package/dist/bytes.js.map +1 -0
  6. package/dist/callOptions.d.ts +27 -0
  7. package/dist/callOptions.d.ts.map +1 -0
  8. package/dist/callOptions.js +19 -0
  9. package/dist/callOptions.js.map +1 -0
  10. package/dist/deviceId.d.ts +10 -0
  11. package/dist/deviceId.d.ts.map +1 -0
  12. package/dist/deviceId.js +55 -0
  13. package/dist/deviceId.js.map +1 -0
  14. package/dist/engine.d.ts +302 -0
  15. package/dist/engine.d.ts.map +1 -0
  16. package/dist/engine.js +489 -0
  17. package/dist/engine.js.map +1 -0
  18. package/dist/engineBus.d.ts +16 -0
  19. package/dist/engineBus.d.ts.map +1 -0
  20. package/dist/engineBus.js +89 -0
  21. package/dist/engineBus.js.map +1 -0
  22. package/dist/engineWiring.d.ts +40 -0
  23. package/dist/engineWiring.d.ts.map +1 -0
  24. package/dist/engineWiring.js +57 -0
  25. package/dist/engineWiring.js.map +1 -0
  26. package/dist/errors.d.ts +185 -0
  27. package/dist/errors.d.ts.map +1 -0
  28. package/dist/errors.js +253 -0
  29. package/dist/errors.js.map +1 -0
  30. package/dist/eventBus.d.ts +24 -0
  31. package/dist/eventBus.d.ts.map +1 -0
  32. package/dist/eventBus.js +50 -0
  33. package/dist/eventBus.js.map +1 -0
  34. package/dist/events.d.ts +220 -0
  35. package/dist/events.d.ts.map +1 -0
  36. package/dist/events.js +35 -0
  37. package/dist/events.js.map +1 -0
  38. package/dist/frameLoop.d.ts +93 -0
  39. package/dist/frameLoop.d.ts.map +1 -0
  40. package/dist/frameLoop.js +346 -0
  41. package/dist/frameLoop.js.map +1 -0
  42. package/dist/index.d.ts +60 -0
  43. package/dist/index.d.ts.map +1 -0
  44. package/dist/index.js +42 -0
  45. package/dist/index.js.map +1 -0
  46. package/dist/logger.d.ts +64 -0
  47. package/dist/logger.d.ts.map +1 -0
  48. package/dist/logger.js +101 -0
  49. package/dist/logger.js.map +1 -0
  50. package/dist/media/engineMediaApi.d.ts +40 -0
  51. package/dist/media/engineMediaApi.d.ts.map +1 -0
  52. package/dist/media/engineMediaApi.js +71 -0
  53. package/dist/media/engineMediaApi.js.map +1 -0
  54. package/dist/media/firstFrameGate.d.ts +47 -0
  55. package/dist/media/firstFrameGate.d.ts.map +1 -0
  56. package/dist/media/firstFrameGate.js +117 -0
  57. package/dist/media/firstFrameGate.js.map +1 -0
  58. package/dist/media/mediaAdapter.d.ts +135 -0
  59. package/dist/media/mediaAdapter.d.ts.map +1 -0
  60. package/dist/media/mediaAdapter.js +2 -0
  61. package/dist/media/mediaAdapter.js.map +1 -0
  62. package/dist/media/mediaBridge.d.ts +99 -0
  63. package/dist/media/mediaBridge.d.ts.map +1 -0
  64. package/dist/media/mediaBridge.js +186 -0
  65. package/dist/media/mediaBridge.js.map +1 -0
  66. package/dist/media/mediaPlane.d.ts +58 -0
  67. package/dist/media/mediaPlane.d.ts.map +1 -0
  68. package/dist/media/mediaPlane.js +119 -0
  69. package/dist/media/mediaPlane.js.map +1 -0
  70. package/dist/media/videoProfile.d.ts +79 -0
  71. package/dist/media/videoProfile.d.ts.map +1 -0
  72. package/dist/media/videoProfile.js +46 -0
  73. package/dist/media/videoProfile.js.map +1 -0
  74. package/dist/media/videoProfile.test.d.ts +2 -0
  75. package/dist/media/videoProfile.test.d.ts.map +1 -0
  76. package/dist/media/videoProfile.test.js +26 -0
  77. package/dist/media/videoProfile.test.js.map +1 -0
  78. package/dist/media/viewRegistry.d.ts +75 -0
  79. package/dist/media/viewRegistry.d.ts.map +1 -0
  80. package/dist/media/viewRegistry.js +130 -0
  81. package/dist/media/viewRegistry.js.map +1 -0
  82. package/dist/media/webrtcAdapter.d.ts +158 -0
  83. package/dist/media/webrtcAdapter.d.ts.map +1 -0
  84. package/dist/media/webrtcAdapter.js +502 -0
  85. package/dist/media/webrtcAdapter.js.map +1 -0
  86. package/dist/protocolId.d.ts +14 -0
  87. package/dist/protocolId.d.ts.map +1 -0
  88. package/dist/protocolId.js +109 -0
  89. package/dist/protocolId.js.map +1 -0
  90. package/dist/reasons.d.ts +63 -0
  91. package/dist/reasons.d.ts.map +1 -0
  92. package/dist/reasons.js +81 -0
  93. package/dist/reasons.js.map +1 -0
  94. package/dist/redact.d.ts +19 -0
  95. package/dist/redact.d.ts.map +1 -0
  96. package/dist/redact.js +50 -0
  97. package/dist/redact.js.map +1 -0
  98. package/dist/signaling/backoff.d.ts +17 -0
  99. package/dist/signaling/backoff.d.ts.map +1 -0
  100. package/dist/signaling/backoff.js +23 -0
  101. package/dist/signaling/backoff.js.map +1 -0
  102. package/dist/signaling/candidate.d.ts +19 -0
  103. package/dist/signaling/candidate.d.ts.map +1 -0
  104. package/dist/signaling/candidate.js +22 -0
  105. package/dist/signaling/candidate.js.map +1 -0
  106. package/dist/signaling/caseMapping.d.ts +19 -0
  107. package/dist/signaling/caseMapping.d.ts.map +1 -0
  108. package/dist/signaling/caseMapping.js +34 -0
  109. package/dist/signaling/caseMapping.js.map +1 -0
  110. package/dist/signaling/connection.d.ts +110 -0
  111. package/dist/signaling/connection.d.ts.map +1 -0
  112. package/dist/signaling/connection.js +365 -0
  113. package/dist/signaling/connection.js.map +1 -0
  114. package/dist/signaling/connectionFactory.d.ts +55 -0
  115. package/dist/signaling/connectionFactory.d.ts.map +1 -0
  116. package/dist/signaling/connectionFactory.js +29 -0
  117. package/dist/signaling/connectionFactory.js.map +1 -0
  118. package/dist/signaling/connectionTypes.d.ts +94 -0
  119. package/dist/signaling/connectionTypes.d.ts.map +1 -0
  120. package/dist/signaling/connectionTypes.js +2 -0
  121. package/dist/signaling/connectionTypes.js.map +1 -0
  122. package/dist/signaling/discipline.d.ts +6 -0
  123. package/dist/signaling/discipline.d.ts.map +1 -0
  124. package/dist/signaling/discipline.js +100 -0
  125. package/dist/signaling/discipline.js.map +1 -0
  126. package/dist/signaling/enums.d.ts +53 -0
  127. package/dist/signaling/enums.d.ts.map +1 -0
  128. package/dist/signaling/enums.js +52 -0
  129. package/dist/signaling/enums.js.map +1 -0
  130. package/dist/signaling/envelope.d.ts +31 -0
  131. package/dist/signaling/envelope.d.ts.map +1 -0
  132. package/dist/signaling/envelope.js +91 -0
  133. package/dist/signaling/envelope.js.map +1 -0
  134. package/dist/signaling/fieldSpec.d.ts +101 -0
  135. package/dist/signaling/fieldSpec.d.ts.map +1 -0
  136. package/dist/signaling/fieldSpec.js +130 -0
  137. package/dist/signaling/fieldSpec.js.map +1 -0
  138. package/dist/signaling/frameSender.d.ts +34 -0
  139. package/dist/signaling/frameSender.d.ts.map +1 -0
  140. package/dist/signaling/frameSender.js +57 -0
  141. package/dist/signaling/frameSender.js.map +1 -0
  142. package/dist/signaling/frames.call.d.ts +299 -0
  143. package/dist/signaling/frames.call.d.ts.map +1 -0
  144. package/dist/signaling/frames.call.js +149 -0
  145. package/dist/signaling/frames.call.js.map +1 -0
  146. package/dist/signaling/frames.room.d.ts +566 -0
  147. package/dist/signaling/frames.room.d.ts.map +1 -0
  148. package/dist/signaling/frames.room.js +165 -0
  149. package/dist/signaling/frames.room.js.map +1 -0
  150. package/dist/signaling/frames.sys.d.ts +145 -0
  151. package/dist/signaling/frames.sys.d.ts.map +1 -0
  152. package/dist/signaling/frames.sys.js +53 -0
  153. package/dist/signaling/frames.sys.js.map +1 -0
  154. package/dist/signaling/handshakeGiveUp.d.ts +36 -0
  155. package/dist/signaling/handshakeGiveUp.d.ts.map +1 -0
  156. package/dist/signaling/handshakeGiveUp.js +48 -0
  157. package/dist/signaling/handshakeGiveUp.js.map +1 -0
  158. package/dist/signaling/heartbeat.d.ts +34 -0
  159. package/dist/signaling/heartbeat.d.ts.map +1 -0
  160. package/dist/signaling/heartbeat.js +52 -0
  161. package/dist/signaling/heartbeat.js.map +1 -0
  162. package/dist/signaling/pendingRequests.d.ts +33 -0
  163. package/dist/signaling/pendingRequests.d.ts.map +1 -0
  164. package/dist/signaling/pendingRequests.js +57 -0
  165. package/dist/signaling/pendingRequests.js.map +1 -0
  166. package/dist/signaling/reconnector.d.ts +43 -0
  167. package/dist/signaling/reconnector.d.ts.map +1 -0
  168. package/dist/signaling/reconnector.js +76 -0
  169. package/dist/signaling/reconnector.js.map +1 -0
  170. package/dist/signaling/registry.d.ts +100 -0
  171. package/dist/signaling/registry.d.ts.map +1 -0
  172. package/dist/signaling/registry.js +217 -0
  173. package/dist/signaling/registry.js.map +1 -0
  174. package/dist/signaling/resumeDeadline.d.ts +48 -0
  175. package/dist/signaling/resumeDeadline.d.ts.map +1 -0
  176. package/dist/signaling/resumeDeadline.js +89 -0
  177. package/dist/signaling/resumeDeadline.js.map +1 -0
  178. package/dist/signaling/tokenExpiry.d.ts +89 -0
  179. package/dist/signaling/tokenExpiry.d.ts.map +1 -0
  180. package/dist/signaling/tokenExpiry.js +106 -0
  181. package/dist/signaling/tokenExpiry.js.map +1 -0
  182. package/dist/signaling/webSocket.d.ts +59 -0
  183. package/dist/signaling/webSocket.d.ts.map +1 -0
  184. package/dist/signaling/webSocket.js +50 -0
  185. package/dist/signaling/webSocket.js.map +1 -0
  186. package/dist/state/callMachine.d.ts +56 -0
  187. package/dist/state/callMachine.d.ts.map +1 -0
  188. package/dist/state/callMachine.js +176 -0
  189. package/dist/state/callMachine.js.map +1 -0
  190. package/dist/state/callRecv.d.ts +12 -0
  191. package/dist/state/callRecv.d.ts.map +1 -0
  192. package/dist/state/callRecv.js +255 -0
  193. package/dist/state/callRecv.js.map +1 -0
  194. package/dist/state/engineMachine.d.ts +41 -0
  195. package/dist/state/engineMachine.d.ts.map +1 -0
  196. package/dist/state/engineMachine.js +210 -0
  197. package/dist/state/engineMachine.js.map +1 -0
  198. package/dist/state/forceEnd.d.ts +44 -0
  199. package/dist/state/forceEnd.d.ts.map +1 -0
  200. package/dist/state/forceEnd.js +96 -0
  201. package/dist/state/forceEnd.js.map +1 -0
  202. package/dist/state/roomMachine.d.ts +92 -0
  203. package/dist/state/roomMachine.d.ts.map +1 -0
  204. package/dist/state/roomMachine.js +319 -0
  205. package/dist/state/roomMachine.js.map +1 -0
  206. package/dist/state/roomRecv.d.ts +7 -0
  207. package/dist/state/roomRecv.d.ts.map +1 -0
  208. package/dist/state/roomRecv.js +209 -0
  209. package/dist/state/roomRecv.js.map +1 -0
  210. package/dist/state/types.d.ts +61 -0
  211. package/dist/state/types.d.ts.map +1 -0
  212. package/dist/state/types.js +30 -0
  213. package/dist/state/types.js.map +1 -0
  214. package/dist/version.d.ts +11 -0
  215. package/dist/version.d.ts.map +1 -0
  216. package/dist/version.js +11 -0
  217. package/dist/version.js.map +1 -0
  218. package/package.json +35 -0
@@ -0,0 +1,209 @@
1
+ import { FrameType } from '../signaling/registry.js';
2
+ import { clearedRoom, replayBuffered, roomOut } from './roomMachine.js';
3
+ import { bool, str } from './types.js';
4
+ /**
5
+ * 房间状态机的**下行帧**分支。
6
+ *
7
+ * 与 roomMachine.ts 拆开是体量红线(CONVENTIONS §2);「上行动作」与「下行帧」
8
+ * 本来也是两组独立的关注点。
9
+ */
10
+ const ROOM_JOIN_OK = `${FrameType.roomJoin}.ok`;
11
+ const ROOM_LEAVE_OK = `${FrameType.roomLeave}.ok`;
12
+ const ROOM_PUBLISH_OK = `${FrameType.roomPublish}.ok`;
13
+ const ROOM_UNPUBLISH_OK = `${FrameType.roomUnpublish}.ok`;
14
+ const ROOM_UNSUBSCRIBE_OK = `${FrameType.roomUnsubscribe}.ok`;
15
+ /** reduceRoomRecv 处理一条下行房间帧。 */
16
+ export function reduceRoomRecv(ctx, type, data) {
17
+ if (ctx.state === 'idle')
18
+ return handleLateFrame(ctx, type, data);
19
+ switch (type) {
20
+ case ROOM_JOIN_OK:
21
+ return handleJoinOk(ctx, data);
22
+ case ROOM_LEAVE_OK:
23
+ return roomOut(clearedRoom('idle'), [], [
24
+ { cb: 'onRoomLeft', args: { room_id: ctx.roomId } },
25
+ ]);
26
+ case ROOM_PUBLISH_OK:
27
+ return handlePublishOk(ctx, data);
28
+ case FrameType.roomAnswer:
29
+ // 服务端对 pub offer 的应答:本端那条上行协商完成了。
30
+ return roomOut({ ...ctx, publish: promoteAll(ctx.publish, 'publishing', 'published') });
31
+ case FrameType.roomOffer:
32
+ return handleSubOffer(ctx, data);
33
+ case ROOM_UNPUBLISH_OK:
34
+ return roomOut({ ...ctx, publish: dropByState(ctx.publish, 'unpublishing') });
35
+ case ROOM_UNSUBSCRIBE_OK:
36
+ return roomOut({ ...ctx, subscribe: dropByState(ctx.subscribe, 'unsubscribing') });
37
+ case FrameType.roomParticipantJoined:
38
+ return roomOut(ctx, [], [{ cb: 'onUserEnter', args: { uid: str(data, 'uid') } }]);
39
+ case FrameType.roomParticipantLeft:
40
+ return handleParticipantLeft(ctx, data);
41
+ case FrameType.roomTrackPublished:
42
+ return handleTrackPublished(ctx, data);
43
+ case FrameType.roomTrackUnpublished:
44
+ return handleTrackUnpublished(ctx, data);
45
+ case FrameType.roomTrackMuted:
46
+ return handleTrackMuted(ctx, data);
47
+ case FrameType.roomActiveSpeakers:
48
+ return roomOut(ctx, [], [{ cb: 'onActiveSpeakers', args: { speakers: data['speakers'] } }]);
49
+ case FrameType.roomQuality:
50
+ return roomOut(ctx, [], [{ cb: 'onNetworkQuality', args: { entries: data['entries'] } }]);
51
+ case FrameType.roomClosed:
52
+ return roomOut(clearedRoom('idle'), [], [
53
+ {
54
+ cb: 'onRoomClosed',
55
+ args: { room_id: str(data, 'room_id'), reason: str(data, 'reason') },
56
+ },
57
+ ]);
58
+ default:
59
+ // 其余的 .ok(subscribe / update_layer / mute)不改状态也不抛回调。
60
+ return roomOut(ctx);
61
+ }
62
+ }
63
+ /**
64
+ * handleLateFrame:**idle 下迟到的房间帧一律丢弃**,与通话机的第 2 条规则同一个道理——
65
+ * 本地已经不在房里,这些帧说的是一个本端不再关心的房间。
66
+ *
67
+ * 唯一例外是 `room.join.ok`:它说明**服务端已经把我们放进房了**,而本地早就收场了
68
+ * (强制收场时还卡在路上的那条 join,或 join 超时回滚之后才回来的应答)。
69
+ * 认领它会把一个没人要的房间捡回来;不理它,服务端就一直挂着这个人——服务端只验房票、
70
+ * 不查通话成员。所以补发一条 `room.leave`,本地状态不动。那条 leave 的 `.ok` 回来时
71
+ * 同样落在这里被丢掉,不会多抛一次 onRoomLeft。与 iOS `IMRoomMachine.handleLateFrame` 同形。
72
+ */
73
+ function handleLateFrame(ctx, type, data) {
74
+ const roomId = str(data, 'room_id');
75
+ if (type !== ROOM_JOIN_OK || roomId === '')
76
+ return roomOut(ctx);
77
+ return roomOut(ctx, [{ type: FrameType.roomLeave, data: { room_id: roomId } }]);
78
+ }
79
+ /** handleJoinOk 用快照把房间一次性搭起来:先成员,再他们的 Track。 */
80
+ function handleJoinOk(ctx, data) {
81
+ const emit = [{ cb: 'onRoomJoined', args: { room_id: str(data, 'room_id') } }];
82
+ const remoteTracks = { ...ctx.remoteTracks };
83
+ const subscribe = { ...ctx.subscribe };
84
+ for (const participant of asArray(data['participants'])) {
85
+ emit.push({ cb: 'onUserEnter', args: { uid: str(participant, 'uid') } });
86
+ }
87
+ for (const track of asArray(data['tracks'])) {
88
+ const trackId = str(track, 'track_id');
89
+ const kind = str(track, 'kind') === 'video' ? 'video' : 'audio';
90
+ remoteTracks[trackId] = {
91
+ uid: str(track, 'uid'),
92
+ kind,
93
+ participantId: str(track, 'participant_id'),
94
+ };
95
+ emit.push(availabilityEvent(kind, str(track, 'uid'), !bool(track, 'muted')));
96
+ // 自动订阅是**服务端**做的,客户端这边只记账,等 sub offer 来把它们坐实。
97
+ if (ctx.autoSubscribe)
98
+ subscribe[trackId] = 'subscribing';
99
+ }
100
+ // 进房成功之后**立刻重放 joining 期间攒下的意图**(不变量 R2):
101
+ // 宿主在 onCallBegin 里就发起的 publish 走的正是这条路。
102
+ const replayed = replayBuffered({
103
+ ...ctx,
104
+ state: 'joined',
105
+ // **这一笔账只在这里记**:它是「服务端真的受理了我们」的唯一证据,
106
+ // resumeRoom 靠它分辨 reconnecting 的两种来路。
107
+ didJoin: true,
108
+ roomId: str(data, 'room_id'),
109
+ participantId: str(data, 'participant_id'),
110
+ remoteTracks,
111
+ subscribe,
112
+ });
113
+ return roomOut(replayed.state, [...replayed.send], [...emit, ...replayed.emit]);
114
+ }
115
+ function handlePublishOk(ctx, data) {
116
+ const cid = str(data, 'cid');
117
+ const trackId = str(data, 'track_id');
118
+ // 拿到 track_id 之后才发 pub offer:服务端要靠 msid 里的 cid 认领 m-line(§3.2)。
119
+ return roomOut({ ...ctx, publishTrackIds: { ...ctx.publishTrackIds, [cid]: trackId } }, [{ type: FrameType.roomOffer, data: { pc: 'pub', sdp: '' } }]);
120
+ }
121
+ /**
122
+ * handleSubOffer:**sub PC 的 offerer 恒为服务端**(§3.3),我们只负责应答。
123
+ * 应答的同时把「订阅中」坐实为「已订阅」——那条流这时才真的挂上来。
124
+ */
125
+ function handleSubOffer(ctx, data) {
126
+ if (str(data, 'pc') !== 'sub')
127
+ return roomOut(ctx);
128
+ const send = [{ type: FrameType.roomAnswer, data: { pc: 'sub', sdp: '' } }];
129
+ return roomOut({ ...ctx, subscribe: promoteAll(ctx.subscribe, 'subscribing', 'subscribed') }, send);
130
+ }
131
+ function handleParticipantLeft(ctx, data) {
132
+ const participantId = str(data, 'participant_id');
133
+ const remoteTracks = {};
134
+ const subscribe = { ...ctx.subscribe };
135
+ for (const [trackId, track] of Object.entries(ctx.remoteTracks)) {
136
+ if (track.participantId === participantId) {
137
+ // 人走了,他的 Track 与我们对它的订阅一起清掉——不清的话重连时会重放一个死订阅。
138
+ delete subscribe[trackId];
139
+ continue;
140
+ }
141
+ remoteTracks[trackId] = track;
142
+ }
143
+ return roomOut({ ...ctx, remoteTracks, subscribe }, [], [
144
+ { cb: 'onUserLeave', args: { uid: str(data, 'uid') } },
145
+ ]);
146
+ }
147
+ function handleTrackPublished(ctx, data) {
148
+ const trackId = str(data, 'track_id');
149
+ const kind = str(data, 'kind') === 'video' ? 'video' : 'audio';
150
+ const uid = str(data, 'uid');
151
+ const subscribe = { ...ctx.subscribe };
152
+ if (ctx.autoSubscribe)
153
+ subscribe[trackId] = 'subscribing';
154
+ return roomOut({
155
+ ...ctx,
156
+ remoteTracks: {
157
+ ...ctx.remoteTracks,
158
+ [trackId]: { uid, kind, participantId: str(data, 'participant_id') },
159
+ },
160
+ subscribe,
161
+ }, [], [availabilityEvent(kind, uid, !bool(data, 'muted'))]);
162
+ }
163
+ /** handleTrackUnpublished:帧里**不带 kind**,只能靠本地记账知道该抛音频还是视频事件。 */
164
+ function handleTrackUnpublished(ctx, data) {
165
+ const trackId = str(data, 'track_id');
166
+ const known = ctx.remoteTracks[trackId];
167
+ const remoteTracks = { ...ctx.remoteTracks };
168
+ const subscribe = { ...ctx.subscribe };
169
+ delete remoteTracks[trackId];
170
+ delete subscribe[trackId];
171
+ const emit = known === undefined ? [] : [availabilityEvent(known.kind, known.uid, false)];
172
+ return roomOut({ ...ctx, remoteTracks, subscribe }, [], emit);
173
+ }
174
+ function handleTrackMuted(ctx, data) {
175
+ const kind = str(data, 'kind') === 'video' ? 'video' : 'audio';
176
+ return roomOut(ctx, [], [availabilityEvent(kind, str(data, 'uid'), !bool(data, 'muted'))]);
177
+ }
178
+ /** availabilityEvent 把「Track 有没有」翻译成 §7.5 的两个回调之一。 */
179
+ function availabilityEvent(kind, uid, available) {
180
+ return {
181
+ cb: kind === 'video' ? 'onUserVideoAvailable' : 'onUserAudioAvailable',
182
+ args: { uid, available },
183
+ };
184
+ }
185
+ function promoteAll(map, from, to) {
186
+ const out = {};
187
+ for (const [key, value] of Object.entries(map)) {
188
+ out[key] = value === from ? to : value;
189
+ }
190
+ return out;
191
+ }
192
+ function dropByState(map, target) {
193
+ const out = {};
194
+ for (const [key, value] of Object.entries(map)) {
195
+ if (value !== target)
196
+ out[key] = value;
197
+ }
198
+ return out;
199
+ }
200
+ function asArray(value) {
201
+ if (!Array.isArray(value))
202
+ return [];
203
+ return value.filter((item) => item !== null && typeof item === 'object' && !Array.isArray(item));
204
+ }
205
+ /** publishStateOf 供测试与诊断读取某个 cid 的发布状态。 */
206
+ export function publishStateOf(ctx, cid) {
207
+ return ctx.publish[cid];
208
+ }
209
+ //# sourceMappingURL=roomRecv.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"roomRecv.js","sourceRoot":"","sources":["../../src/state/roomRecv.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,61 @@
1
+ /**
2
+ * 状态机的公共类型。
3
+ *
4
+ * 状态机是**纯函数 reducer**:`(state, input) => { state, send, emit }`。
5
+ * 不碰网络、不碰 DOM、不碰计时器——所以它能被
6
+ * `im-rtc-server/docs/conformance/*_fsm.json` 的向量逐条驱动,
7
+ * 与另外三端跑**同一份**用例。
8
+ */
9
+ /** OutgoingFrame 是状态机要求发出去的一帧(线路形状,snake_case)。 */
10
+ export interface OutgoingFrame {
11
+ readonly type: string;
12
+ readonly data: Readonly<Record<string, unknown>>;
13
+ }
14
+ /**
15
+ * EmittedEvent 是状态机要求抛给宿主的一个回调。
16
+ *
17
+ * `args` 的键用**协议的 snake_case 名**,与一致性向量一致;
18
+ * 由 engine 门面转成各端惯用形式再交给宿主。
19
+ */
20
+ export interface EmittedEvent {
21
+ readonly cb: string;
22
+ readonly args: Readonly<Record<string, unknown>>;
23
+ }
24
+ /** MachineOutput 是一次状态转移的产物。 */
25
+ export interface MachineOutput<S> {
26
+ readonly state: S;
27
+ readonly send: readonly OutgoingFrame[];
28
+ readonly emit: readonly EmittedEvent[];
29
+ }
30
+ /** MachineInput 是驱动状态机的三种输入之一(与向量的 act / recv / internal 一一对应)。 */
31
+ export type MachineInput =
32
+ /** 宿主调用了 engine 的公开方法。 */
33
+ {
34
+ readonly kind: 'act';
35
+ readonly op: string;
36
+ readonly args?: Readonly<Record<string, unknown>>;
37
+ }
38
+ /** 收到一条下行帧。 */
39
+ | {
40
+ readonly kind: 'recv';
41
+ readonly type: string;
42
+ readonly data: Readonly<Record<string, unknown>>;
43
+ }
44
+ /**
45
+ * engine 内部事件,既不来自信令也不来自宿主(如媒体就绪)。
46
+ * `args` 只有「哪一条被拒了」这类需要带标识的才有(`publish_failed` 的 cid、`subscribe_failed` 的 track_id)。
47
+ */
48
+ | {
49
+ readonly kind: 'internal';
50
+ readonly name: string;
51
+ readonly args?: Readonly<Record<string, unknown>>;
52
+ };
53
+ /** str 从线路数据里安全取一个字符串字段。 */
54
+ export declare function str(data: Readonly<Record<string, unknown>>, key: string): string;
55
+ /** num 从线路数据里安全取一个整数字段。 */
56
+ export declare function num(data: Readonly<Record<string, unknown>>, key: string): number;
57
+ /** bool 从线路数据里安全取一个布尔字段。 */
58
+ export declare function bool(data: Readonly<Record<string, unknown>>, key: string): boolean;
59
+ /** strArray 从线路数据里安全取一个字符串数组字段。 */
60
+ export declare function strArray(data: Readonly<Record<string, unknown>>, key: string): string[];
61
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/state/types.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,mDAAmD;AACnD,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;CAClD;AAED;;;;;GAKG;AACH,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;CAClD;AAED,gCAAgC;AAChC,MAAM,WAAW,aAAa,CAAC,CAAC;IAC9B,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC;IAClB,QAAQ,CAAC,IAAI,EAAE,SAAS,aAAa,EAAE,CAAC;IACxC,QAAQ,CAAC,IAAI,EAAE,SAAS,YAAY,EAAE,CAAC;CACxC;AAED,mEAAmE;AACnE,MAAM,MAAM,YAAY;AACtB,0BAA0B;AACxB;IAAE,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;CAAE;AAClG,eAAe;GACb;IACE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;CAClD;AACH;;;GAGG;GACD;IACE,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;CACnD,CAAC;AAEN,4BAA4B;AAC5B,wBAAgB,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAGhF;AAED,2BAA2B;AAC3B,wBAAgB,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAGhF;AAED,4BAA4B;AAC5B,wBAAgB,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAElF;AAED,mCAAmC;AACnC,wBAAgB,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAIvF"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * 状态机的公共类型。
3
+ *
4
+ * 状态机是**纯函数 reducer**:`(state, input) => { state, send, emit }`。
5
+ * 不碰网络、不碰 DOM、不碰计时器——所以它能被
6
+ * `im-rtc-server/docs/conformance/*_fsm.json` 的向量逐条驱动,
7
+ * 与另外三端跑**同一份**用例。
8
+ */
9
+ /** str 从线路数据里安全取一个字符串字段。 */
10
+ export function str(data, key) {
11
+ const value = data[key];
12
+ return typeof value === 'string' ? value : '';
13
+ }
14
+ /** num 从线路数据里安全取一个整数字段。 */
15
+ export function num(data, key) {
16
+ const value = data[key];
17
+ return typeof value === 'number' && Number.isFinite(value) ? value : 0;
18
+ }
19
+ /** bool 从线路数据里安全取一个布尔字段。 */
20
+ export function bool(data, key) {
21
+ return data[key] === true;
22
+ }
23
+ /** strArray 从线路数据里安全取一个字符串数组字段。 */
24
+ export function strArray(data, key) {
25
+ const value = data[key];
26
+ if (!Array.isArray(value))
27
+ return [];
28
+ return value.filter((item) => typeof item === 'string');
29
+ }
30
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/state/types.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AA8CH,4BAA4B;AAC5B,MAAM,UAAU,GAAG,CAAC,IAAuC,EAAE,GAAW;IACtE,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;IACxB,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;AAChD,CAAC;AAED,2BAA2B;AAC3B,MAAM,UAAU,GAAG,CAAC,IAAuC,EAAE,GAAW;IACtE,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;IACxB,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AACzE,CAAC;AAED,4BAA4B;AAC5B,MAAM,UAAU,IAAI,CAAC,IAAuC,EAAE,GAAW;IACvE,OAAO,IAAI,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC;AAC5B,CAAC;AAED,mCAAmC;AACnC,MAAM,UAAU,QAAQ,CAAC,IAAuC,EAAE,GAAW;IAC3E,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;IACxB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACrC,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAkB,EAAE,CAAC,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC;AAC1E,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * SDK_VERSION 是 im-rtc SDK 的版本号。
3
+ *
4
+ * **四端(iOS / Android / Web / 桌面)共用同一个版本号**,一起升。
5
+ * 它会拼进 `sys.hello` 的 `sdk` 字段(`web/<版本>`),只用于日志与灰度,不参与任何逻辑(协议 §1.2);
6
+ * 宿主也可以拿它显示在「关于」里。
7
+ *
8
+ * 升版本时要同步改 `packages/call-engine/package.json` 与 `packages/call-uikit-react/package.json`。
9
+ */
10
+ export declare const SDK_VERSION = "1.0.0";
11
+ //# sourceMappingURL=version.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,eAAO,MAAM,WAAW,UAAU,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * SDK_VERSION 是 im-rtc SDK 的版本号。
3
+ *
4
+ * **四端(iOS / Android / Web / 桌面)共用同一个版本号**,一起升。
5
+ * 它会拼进 `sys.hello` 的 `sdk` 字段(`web/<版本>`),只用于日志与灰度,不参与任何逻辑(协议 §1.2);
6
+ * 宿主也可以拿它显示在「关于」里。
7
+ *
8
+ * 升版本时要同步改 `packages/call-engine/package.json` 与 `packages/call-uikit-react/package.json`。
9
+ */
10
+ export const SDK_VERSION = '1.0.0';
11
+ //# sourceMappingURL=version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,OAAO,CAAC"}
package/package.json ADDED
@@ -0,0 +1,35 @@
1
+ {
2
+ "name": "im-rtc-call-engine",
3
+ "version": "1.0.0",
4
+ "description": "im-rtc 的无 UI 核心:信令、状态机、媒体、设备。框架无关,禁止依赖任何 UI 库。",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "import": "./dist/index.js"
12
+ }
13
+ },
14
+ "files": [
15
+ "dist"
16
+ ],
17
+ "scripts": {
18
+ "build": "tsc -b",
19
+ "test": "vitest run",
20
+ "prepublishOnly": "tsc -b"
21
+ },
22
+ "license": "MIT",
23
+ "repository": {
24
+ "type": "git",
25
+ "url": "git+https://github.com/BLiYing/im-rtc-web.git",
26
+ "directory": "packages/call-engine"
27
+ },
28
+ "sideEffects": false,
29
+ "engines": {
30
+ "node": ">=18"
31
+ },
32
+ "publishConfig": {
33
+ "access": "public"
34
+ }
35
+ }