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 @@
|
|
|
1
|
+
{"version":3,"file":"engineWiring.d.ts","sourceRoot":"","sources":["../src/engineWiring.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAE5D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAC5D,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,kCAAkC,CAAC;AACjF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAE9D;;;;;;;GAOG;AAEH,iCAAiC;AACjC,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,SAAS,CAAC;IACf,MAAM,EAAE,WAAW,CAAC;IACpB,MAAM,EAAE,WAAW,CAAC;IACpB,IAAI,EAAE,SAAS,CAAC;IAChB;;OAEG;IACH,UAAU,EAAE,MAAM,UAAU,GAAG,IAAI,CAAC;CACrC;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAAE,YAAY,GAAG,cAAc,CAS/D;AAED;;;;;GAKG;AACH,wBAAgB,wBAAwB,CACtC,CAAC,EAAE,YAAY,EACf,gBAAgB,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,KAAK,IAAI,GACjD,wBAAwB,CAiC1B"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { renegotiateAfterResume } from './media/mediaPlane.js';
|
|
2
|
+
/**
|
|
3
|
+
* engineMediaDeps 是交给媒体接线的那一小把依赖(见 media/mediaPlane.ts)。
|
|
4
|
+
*
|
|
5
|
+
* `uidOf` 同样读的是状态机的**当前**快照,理由和 `connection` 那条一样。
|
|
6
|
+
*/
|
|
7
|
+
export function engineMediaDeps(w) {
|
|
8
|
+
return {
|
|
9
|
+
bridge: w.bridge,
|
|
10
|
+
bus: w.bus,
|
|
11
|
+
sender: w.sender,
|
|
12
|
+
connection: w.connection,
|
|
13
|
+
uidOf: (trackId) => w.loop.state.room.remoteTracks[trackId]?.uid ?? '',
|
|
14
|
+
dispatch: (input) => w.loop.dispatch(input),
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* engineConnectionHandlers 把连接层的回调接到状态机与事件总线上。
|
|
19
|
+
*
|
|
20
|
+
* `noteHelloApplied` 是回给门面的那条线:`login()` 要 await「hello.ok 已经喂进状态机」,
|
|
21
|
+
* 而握手结果**每一次**都从这里进来(包括自动重连那些),所以 promise 只能由这里产出。
|
|
22
|
+
*/
|
|
23
|
+
export function engineConnectionHandlers(w, noteHelloApplied) {
|
|
24
|
+
return {
|
|
25
|
+
// **握手结果一律从这里进状态机**,`login()` 不再自己喂一遍。
|
|
26
|
+
// 为什么(连同那次实测症状)写在 `EngineConnectionHandlers.onConnected` 上。
|
|
27
|
+
onConnected: (hello) => {
|
|
28
|
+
const applied = w.loop
|
|
29
|
+
.dispatch({
|
|
30
|
+
kind: 'recv',
|
|
31
|
+
type: 'sys.hello.ok',
|
|
32
|
+
data: { session_id: hello.sessionId, resumed: hello.resumed },
|
|
33
|
+
})
|
|
34
|
+
.then(async () => {
|
|
35
|
+
// 恢复之后要重新协商上行(§1.4)。**为什么触发点在这里**见 renegotiateAfterResume。
|
|
36
|
+
if (hello.resumed)
|
|
37
|
+
await renegotiateAfterResume(engineMediaDeps(w));
|
|
38
|
+
});
|
|
39
|
+
noteHelloApplied(applied);
|
|
40
|
+
void applied.catch((err) => w.bus.emitError(err));
|
|
41
|
+
},
|
|
42
|
+
onEvent: (type, data) => void w.loop.handleIncoming(type, data),
|
|
43
|
+
onDisconnected: (info) => {
|
|
44
|
+
void w.loop.dispatch({ kind: 'internal', name: 'disconnected' });
|
|
45
|
+
w.bus.emit('disconnected', info);
|
|
46
|
+
},
|
|
47
|
+
onSessionUnrecoverable: () => void w.loop.dispatch({ kind: 'internal', name: 'session_unrecoverable' }),
|
|
48
|
+
onKickedOut: (info) => {
|
|
49
|
+
// 状态机只认「被踢了」这一件事,原因是给宿主做处置判断的,两者分开走。
|
|
50
|
+
void w.loop.dispatch({ kind: 'internal', name: 'ws_closed_4403' });
|
|
51
|
+
w.bus.emit('kickedOut', info);
|
|
52
|
+
},
|
|
53
|
+
onTokenWillExpire: (info) => w.bus.emit('tokenWillExpire', info),
|
|
54
|
+
onError: (error) => w.bus.emitError(error),
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=engineWiring.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engineWiring.js","sourceRoot":"","sources":["../src/engineWiring.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AA0B/D;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,CAAe;IAC7C,OAAO;QACL,MAAM,EAAE,CAAC,CAAC,MAAM;QAChB,GAAG,EAAE,CAAC,CAAC,GAAG;QACV,MAAM,EAAE,CAAC,CAAC,MAAM;QAChB,UAAU,EAAE,CAAC,CAAC,UAAU;QACxB,KAAK,EAAE,CAAC,OAAO,EAAU,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE,GAAG,IAAI,EAAE;QAC9E,QAAQ,EAAE,CAAC,KAAK,EAAiB,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;KAC3D,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,wBAAwB,CACtC,CAAe,EACf,gBAAkD;IAElD,OAAO;QACL,uCAAuC;QACvC,4DAA4D;QAC5D,WAAW,EAAE,CAAC,KAAK,EAAQ,EAAE;YAC3B,MAAM,OAAO,GAAG,CAAC,CAAC,IAAI;iBACnB,QAAQ,CAAC;gBACR,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,cAAc;gBACpB,IAAI,EAAE,EAAE,UAAU,EAAE,KAAK,CAAC,SAAS,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE;aAC9D,CAAC;iBACD,IAAI,CAAC,KAAK,IAAI,EAAE;gBACf,2DAA2D;gBAC3D,IAAI,KAAK,CAAC,OAAO;oBAAE,MAAM,sBAAsB,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC;YACtE,CAAC,CAAC,CAAC;YACL,gBAAgB,CAAC,OAAO,CAAC,CAAC;YAC1B,KAAK,OAAO,CAAC,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;QAC7D,CAAC;QACD,OAAO,EAAE,CAAC,IAAI,EAAE,IAAI,EAAQ,EAAE,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,IAAI,CAAC;QACrE,cAAc,EAAE,CAAC,IAAI,EAAQ,EAAE;YAC7B,KAAK,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,CAAC;YACjE,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC;QACnC,CAAC;QACD,sBAAsB,EAAE,GAAS,EAAE,CACjC,KAAK,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,uBAAuB,EAAE,CAAC;QAC3E,WAAW,EAAE,CAAC,IAAI,EAAQ,EAAE;YAC1B,qCAAqC;YACrC,KAAK,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,gBAAgB,EAAE,CAAC,CAAC;YACnE,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;QAChC,CAAC;QACD,iBAAiB,EAAE,CAAC,IAAI,EAAQ,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,iBAAiB,EAAE,IAAI,CAAC;QACtE,OAAO,EAAE,CAAC,KAAK,EAAQ,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,KAAK,CAAC;KACjD,CAAC;AACJ,CAAC"}
|
package/dist/errors.d.ts
ADDED
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 错误码:**四仓共用同一份定义**,单一真相源是
|
|
3
|
+
* `im-rtc-server/docs/conformance/error_codes.json`(由 RTC_PROTOCOL.md §7 定稿)。
|
|
4
|
+
*
|
|
5
|
+
* 本文件的表由那份 JSON 手工同步而来,`test/conformance.test.ts` 逐条断言两者相等——
|
|
6
|
+
* 加了码却忘了同步,测试立刻挂。
|
|
7
|
+
*
|
|
8
|
+
* 两条硬约束:
|
|
9
|
+
* - `msg` 是**英文固定短语**,四端必须完全一致;它给开发者看,
|
|
10
|
+
* **禁止直接显示给用户**,UI 文案由各端按 code 查自己的本地化表。
|
|
11
|
+
* - 2xxx 段是**客户端本地错误码**,永远不会出现在线路上。
|
|
12
|
+
*/
|
|
13
|
+
/** ErrorCode 是稳定的错误码。**只增不改不删**。 */
|
|
14
|
+
export declare const ErrorCode: {
|
|
15
|
+
/** 信封字段缺失/类型错/data 为 null */
|
|
16
|
+
readonly badEnvelope: 1001;
|
|
17
|
+
/** 未知 type */
|
|
18
|
+
readonly unknownType: 1002;
|
|
19
|
+
/** 会议层留位帧,v1 未实现 */
|
|
20
|
+
readonly notImplemented: 1003;
|
|
21
|
+
/** data 字段非法:超长、枚举越界、数组含自己 */
|
|
22
|
+
readonly badParams: 1004;
|
|
23
|
+
/** 单帧超过 64 KiB */
|
|
24
|
+
readonly frameTooLarge: 1005;
|
|
25
|
+
/** sys.hello.protocol_version 不受支持 */
|
|
26
|
+
readonly protocolVersionUnsupported: 1006;
|
|
27
|
+
/** 上行频率超限 */
|
|
28
|
+
readonly rateLimited: 1007;
|
|
29
|
+
/** token 签名/受众/绑定关系错 */
|
|
30
|
+
readonly tokenInvalid: 1101;
|
|
31
|
+
/** token 过期,换新的重试 */
|
|
32
|
+
readonly tokenExpired: 1102;
|
|
33
|
+
/** 未发 sys.hello 就发别的帧 */
|
|
34
|
+
readonly notAuthenticated: 1103;
|
|
35
|
+
/** 同 uid 同 device_id 在别处登录 */
|
|
36
|
+
readonly kickedOut: 1104;
|
|
37
|
+
/** session_id 无效或超出 30s 恢复窗口 */
|
|
38
|
+
readonly sessionNotResumable: 1105;
|
|
39
|
+
/** 票据合法,但该 app_id 已被控制台停用 */
|
|
40
|
+
readonly appDisabled: 1106;
|
|
41
|
+
/** 房间不存在或已关闭 */
|
|
42
|
+
readonly roomNotFound: 1201;
|
|
43
|
+
/** 超出 max_participants */
|
|
44
|
+
readonly roomFull: 1202;
|
|
45
|
+
/** 未 join 就发房间帧 */
|
|
46
|
+
readonly notInRoom: 1203;
|
|
47
|
+
/** 重复 join 同一房间 */
|
|
48
|
+
readonly alreadyInRoom: 1204;
|
|
49
|
+
/** 房间已被解散 */
|
|
50
|
+
readonly roomClosed: 1205;
|
|
51
|
+
/** 无该操作权限 */
|
|
52
|
+
readonly permissionDenied: 1206;
|
|
53
|
+
/** 目标 participant 不在房 */
|
|
54
|
+
readonly participantNotFound: 1207;
|
|
55
|
+
/** 订阅/退订不存在的 track */
|
|
56
|
+
readonly trackNotFound: 1301;
|
|
57
|
+
/** 同 source 重复发布或房间策略禁止 */
|
|
58
|
+
readonly publishDenied: 1302;
|
|
59
|
+
/** 订阅自己的 track 或无订阅权限 */
|
|
60
|
+
readonly subscribeDenied: 1303;
|
|
61
|
+
/** SDP 解析失败/超长/cid 认不回来/在非 offerer 侧发 offer */
|
|
62
|
+
readonly sdpInvalid: 1304;
|
|
63
|
+
/** pc 对应的 PeerConnection 不存在 */
|
|
64
|
+
readonly pcNotFound: 1305;
|
|
65
|
+
/** max_layer 取值非法 */
|
|
66
|
+
readonly layerUnavailable: 1306;
|
|
67
|
+
/** SDP 里没有共同编码 */
|
|
68
|
+
readonly codecUnsupported: 1307;
|
|
69
|
+
/** call_id 不存在 */
|
|
70
|
+
readonly callNotFound: 1401;
|
|
71
|
+
/** 通话已结束,客户端必须静默吞掉 */
|
|
72
|
+
readonly callEnded: 1402;
|
|
73
|
+
/** 保留:v1 走 call.ended{offline} 而非报错 */
|
|
74
|
+
readonly calleeOffline: 1403;
|
|
75
|
+
/** 保留:v1 走 call.ended{busy} 而非报错 */
|
|
76
|
+
readonly calleeBusy: 1404;
|
|
77
|
+
/** 在错误状态下 accept/reject/cancel/hangup */
|
|
78
|
+
readonly invalidCallState: 1405;
|
|
79
|
+
/** callee_ids 超上限 */
|
|
80
|
+
readonly tooManyCallees: 1406;
|
|
81
|
+
/** 非主叫发 call.cancel;不在通话里的人发 call.invite_more */
|
|
82
|
+
readonly notCallOwner: 1407;
|
|
83
|
+
/** 自己已在别的通话中 */
|
|
84
|
+
readonly alreadyInCall: 1408;
|
|
85
|
+
/** 宿主的邀请鉴权回调拒绝了 call.invite / call.invite_more / call.join(或回调失败且应用配成拒绝) */
|
|
86
|
+
readonly inviteDenied: 1409;
|
|
87
|
+
/** 内部错误兜底 */
|
|
88
|
+
readonly internal: 1501;
|
|
89
|
+
/** 无可用 SFU 节点 */
|
|
90
|
+
readonly sfuUnavailable: 1502;
|
|
91
|
+
/** 服务端正在优雅关闭 */
|
|
92
|
+
readonly shuttingDown: 1503;
|
|
93
|
+
/** 持久化失败 */
|
|
94
|
+
readonly storeError: 1504;
|
|
95
|
+
/** 用户拒绝麦克风/摄像头权限 */
|
|
96
|
+
readonly devicePermissionDenied: 2001;
|
|
97
|
+
/** 没有可用的采集设备 */
|
|
98
|
+
readonly deviceNotFound: 2002;
|
|
99
|
+
/** 信令连不上、DNS/TLS 失败 */
|
|
100
|
+
readonly networkUnreachable: 2003;
|
|
101
|
+
/** 请求 10 秒无应答 */
|
|
102
|
+
readonly signalingTimeout: 2004;
|
|
103
|
+
/** 宿主在错误状态下调 Engine 方法 */
|
|
104
|
+
readonly invalidState: 2005;
|
|
105
|
+
/** PeerConnection 协商失败 / ICE failed */
|
|
106
|
+
readonly mediaNegotiationFailed: 2006;
|
|
107
|
+
/** 未 login 就调业务方法 */
|
|
108
|
+
readonly notLoggedIn: 2007;
|
|
109
|
+
};
|
|
110
|
+
/** ErrorCodeName 是错误码的键名联合。 */
|
|
111
|
+
export type ErrorCodeName = keyof typeof ErrorCode;
|
|
112
|
+
/** ErrorCodeValue 是错误码的数值联合。 */
|
|
113
|
+
export type ErrorCodeValue = (typeof ErrorCode)[ErrorCodeName];
|
|
114
|
+
/** ErrorDefinition 是一个错误码的全部契约面。 */
|
|
115
|
+
export interface ErrorDefinition {
|
|
116
|
+
readonly code: number;
|
|
117
|
+
/** 稳定机读名,与 code 一一对应。 */
|
|
118
|
+
readonly name: string;
|
|
119
|
+
/** 英文固定短语,四端必须完全一致。 */
|
|
120
|
+
readonly msg: string;
|
|
121
|
+
/** true = 原样重试可能成功。 */
|
|
122
|
+
readonly retryable: boolean;
|
|
123
|
+
/** true = 客户端本地错误码(2xxx),永不上线路。 */
|
|
124
|
+
readonly local: boolean;
|
|
125
|
+
}
|
|
126
|
+
/** ERROR_DEFINITIONS 的顺序与 error_codes.json 一致,便于对读。 */
|
|
127
|
+
export declare const ERROR_DEFINITIONS: readonly ErrorDefinition[];
|
|
128
|
+
/** lookupError 按 code 查定义;未知码返回 undefined。 */
|
|
129
|
+
export declare function lookupError(code: number): ErrorDefinition | undefined;
|
|
130
|
+
/** errorName 返回错误码的机读名;未知码返回 'unknown'。 */
|
|
131
|
+
export declare function errorName(code: number): string;
|
|
132
|
+
/** isRetryable 报告这个码是否值得原样重试;未知码保守地按不可重试处理。 */
|
|
133
|
+
export declare function isRetryable(code: number): boolean;
|
|
134
|
+
/** isLocalError 报告这个码是不是客户端本地码(永不上线路)。 */
|
|
135
|
+
export declare function isLocalError(code: number): boolean;
|
|
136
|
+
/**
|
|
137
|
+
* RtcError 是 engine 对外抛的统一错误。
|
|
138
|
+
*
|
|
139
|
+
* `cause` 只用于日志,**不参与任何面向用户的展示**——这是「不把内部错误
|
|
140
|
+
* 透传给用户」那条规矩在 TS 侧的落点。
|
|
141
|
+
*/
|
|
142
|
+
export declare class RtcError extends Error {
|
|
143
|
+
readonly code: number;
|
|
144
|
+
readonly name_: string;
|
|
145
|
+
readonly retryable: boolean;
|
|
146
|
+
/** 出错的请求 type;无对应请求时为 ''。 */
|
|
147
|
+
readonly forType: string;
|
|
148
|
+
/**
|
|
149
|
+
* 本端不认识线路上那个码时,帧上自带的 `retryable`;认识就是 `undefined`。
|
|
150
|
+
*
|
|
151
|
+
* 为什么要单独留这一手:未知码在下面会被折成 `internal`(1501,而它
|
|
152
|
+
* `retryable === true`),于是**服务端新加的终局码在本端一律长成「可重试」**,
|
|
153
|
+
* 握手被拒也会退回无限重连。本端这张表只是上次同步时的快照,服务端比我们新是常态——
|
|
154
|
+
* 所以未知码一概以帧上带的那一位为准,不信折算后的码。
|
|
155
|
+
* Android 侧漏过 1106 一次,症状正是这个形状。
|
|
156
|
+
*/
|
|
157
|
+
readonly unknownCodeRetryable: boolean | undefined;
|
|
158
|
+
constructor(code: number, options?: {
|
|
159
|
+
forType?: string;
|
|
160
|
+
cause?: unknown;
|
|
161
|
+
wireRetryable?: boolean;
|
|
162
|
+
});
|
|
163
|
+
/** wireShape 返回可以放进 sys.error 的 data —— 注意**不含** cause。 */
|
|
164
|
+
wireShape(): {
|
|
165
|
+
code: number;
|
|
166
|
+
name: string;
|
|
167
|
+
msg: string;
|
|
168
|
+
for_type: string;
|
|
169
|
+
retryable: boolean;
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* rtcErrorFromWire 把一帧 `sys.error` 的 data 翻成 `RtcError`。
|
|
174
|
+
*
|
|
175
|
+
* **同一条不变量只该有一份实现。** 过去两个调用点(在途请求的结算、无主的错误帧)
|
|
176
|
+
* 各写了一遍这段构造,于是「未知码要留住帧上的 `retryable`」这条只在其中一处成立——
|
|
177
|
+
* 而握手恰恰走的是另一处,未知的终局码照样退回无限重连。
|
|
178
|
+
*
|
|
179
|
+
* `fallbackForType` 是 `for_type` 缺失时的兜底:结算在途请求时用那个请求自己的 type,
|
|
180
|
+
* 无主错误帧则没什么可兜的。
|
|
181
|
+
*/
|
|
182
|
+
export declare function rtcErrorFromWire(data: Record<string, unknown>, fallbackForType?: string): RtcError;
|
|
183
|
+
/** isRtcError 是 RtcError 的类型守卫。 */
|
|
184
|
+
export declare function isRtcError(err: unknown): err is RtcError;
|
|
185
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"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"}
|
package/dist/errors.js
ADDED
|
@@ -0,0 +1,253 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 错误码:**四仓共用同一份定义**,单一真相源是
|
|
3
|
+
* `im-rtc-server/docs/conformance/error_codes.json`(由 RTC_PROTOCOL.md §7 定稿)。
|
|
4
|
+
*
|
|
5
|
+
* 本文件的表由那份 JSON 手工同步而来,`test/conformance.test.ts` 逐条断言两者相等——
|
|
6
|
+
* 加了码却忘了同步,测试立刻挂。
|
|
7
|
+
*
|
|
8
|
+
* 两条硬约束:
|
|
9
|
+
* - `msg` 是**英文固定短语**,四端必须完全一致;它给开发者看,
|
|
10
|
+
* **禁止直接显示给用户**,UI 文案由各端按 code 查自己的本地化表。
|
|
11
|
+
* - 2xxx 段是**客户端本地错误码**,永远不会出现在线路上。
|
|
12
|
+
*/
|
|
13
|
+
/** ErrorCode 是稳定的错误码。**只增不改不删**。 */
|
|
14
|
+
export const ErrorCode = {
|
|
15
|
+
/** 信封字段缺失/类型错/data 为 null */
|
|
16
|
+
badEnvelope: 1001,
|
|
17
|
+
/** 未知 type */
|
|
18
|
+
unknownType: 1002,
|
|
19
|
+
/** 会议层留位帧,v1 未实现 */
|
|
20
|
+
notImplemented: 1003,
|
|
21
|
+
/** data 字段非法:超长、枚举越界、数组含自己 */
|
|
22
|
+
badParams: 1004,
|
|
23
|
+
/** 单帧超过 64 KiB */
|
|
24
|
+
frameTooLarge: 1005,
|
|
25
|
+
/** sys.hello.protocol_version 不受支持 */
|
|
26
|
+
protocolVersionUnsupported: 1006,
|
|
27
|
+
/** 上行频率超限 */
|
|
28
|
+
rateLimited: 1007,
|
|
29
|
+
/** token 签名/受众/绑定关系错 */
|
|
30
|
+
tokenInvalid: 1101,
|
|
31
|
+
/** token 过期,换新的重试 */
|
|
32
|
+
tokenExpired: 1102,
|
|
33
|
+
/** 未发 sys.hello 就发别的帧 */
|
|
34
|
+
notAuthenticated: 1103,
|
|
35
|
+
/** 同 uid 同 device_id 在别处登录 */
|
|
36
|
+
kickedOut: 1104,
|
|
37
|
+
/** session_id 无效或超出 30s 恢复窗口 */
|
|
38
|
+
sessionNotResumable: 1105,
|
|
39
|
+
/** 票据合法,但该 app_id 已被控制台停用 */
|
|
40
|
+
appDisabled: 1106,
|
|
41
|
+
/** 房间不存在或已关闭 */
|
|
42
|
+
roomNotFound: 1201,
|
|
43
|
+
/** 超出 max_participants */
|
|
44
|
+
roomFull: 1202,
|
|
45
|
+
/** 未 join 就发房间帧 */
|
|
46
|
+
notInRoom: 1203,
|
|
47
|
+
/** 重复 join 同一房间 */
|
|
48
|
+
alreadyInRoom: 1204,
|
|
49
|
+
/** 房间已被解散 */
|
|
50
|
+
roomClosed: 1205,
|
|
51
|
+
/** 无该操作权限 */
|
|
52
|
+
permissionDenied: 1206,
|
|
53
|
+
/** 目标 participant 不在房 */
|
|
54
|
+
participantNotFound: 1207,
|
|
55
|
+
/** 订阅/退订不存在的 track */
|
|
56
|
+
trackNotFound: 1301,
|
|
57
|
+
/** 同 source 重复发布或房间策略禁止 */
|
|
58
|
+
publishDenied: 1302,
|
|
59
|
+
/** 订阅自己的 track 或无订阅权限 */
|
|
60
|
+
subscribeDenied: 1303,
|
|
61
|
+
/** SDP 解析失败/超长/cid 认不回来/在非 offerer 侧发 offer */
|
|
62
|
+
sdpInvalid: 1304,
|
|
63
|
+
/** pc 对应的 PeerConnection 不存在 */
|
|
64
|
+
pcNotFound: 1305,
|
|
65
|
+
/** max_layer 取值非法 */
|
|
66
|
+
layerUnavailable: 1306,
|
|
67
|
+
/** SDP 里没有共同编码 */
|
|
68
|
+
codecUnsupported: 1307,
|
|
69
|
+
/** call_id 不存在 */
|
|
70
|
+
callNotFound: 1401,
|
|
71
|
+
/** 通话已结束,客户端必须静默吞掉 */
|
|
72
|
+
callEnded: 1402,
|
|
73
|
+
/** 保留:v1 走 call.ended{offline} 而非报错 */
|
|
74
|
+
calleeOffline: 1403,
|
|
75
|
+
/** 保留:v1 走 call.ended{busy} 而非报错 */
|
|
76
|
+
calleeBusy: 1404,
|
|
77
|
+
/** 在错误状态下 accept/reject/cancel/hangup */
|
|
78
|
+
invalidCallState: 1405,
|
|
79
|
+
/** callee_ids 超上限 */
|
|
80
|
+
tooManyCallees: 1406,
|
|
81
|
+
/** 非主叫发 call.cancel;不在通话里的人发 call.invite_more */
|
|
82
|
+
notCallOwner: 1407,
|
|
83
|
+
/** 自己已在别的通话中 */
|
|
84
|
+
alreadyInCall: 1408,
|
|
85
|
+
/** 宿主的邀请鉴权回调拒绝了 call.invite / call.invite_more / call.join(或回调失败且应用配成拒绝) */
|
|
86
|
+
inviteDenied: 1409,
|
|
87
|
+
/** 内部错误兜底 */
|
|
88
|
+
internal: 1501,
|
|
89
|
+
/** 无可用 SFU 节点 */
|
|
90
|
+
sfuUnavailable: 1502,
|
|
91
|
+
/** 服务端正在优雅关闭 */
|
|
92
|
+
shuttingDown: 1503,
|
|
93
|
+
/** 持久化失败 */
|
|
94
|
+
storeError: 1504,
|
|
95
|
+
/** 用户拒绝麦克风/摄像头权限 */
|
|
96
|
+
devicePermissionDenied: 2001,
|
|
97
|
+
/** 没有可用的采集设备 */
|
|
98
|
+
deviceNotFound: 2002,
|
|
99
|
+
/** 信令连不上、DNS/TLS 失败 */
|
|
100
|
+
networkUnreachable: 2003,
|
|
101
|
+
/** 请求 10 秒无应答 */
|
|
102
|
+
signalingTimeout: 2004,
|
|
103
|
+
/** 宿主在错误状态下调 Engine 方法 */
|
|
104
|
+
invalidState: 2005,
|
|
105
|
+
/** PeerConnection 协商失败 / ICE failed */
|
|
106
|
+
mediaNegotiationFailed: 2006,
|
|
107
|
+
/** 未 login 就调业务方法 */
|
|
108
|
+
notLoggedIn: 2007,
|
|
109
|
+
};
|
|
110
|
+
/** ERROR_DEFINITIONS 的顺序与 error_codes.json 一致,便于对读。 */
|
|
111
|
+
export const ERROR_DEFINITIONS = [
|
|
112
|
+
{ code: 1001, name: 'bad_envelope', msg: 'malformed envelope', retryable: false, local: false },
|
|
113
|
+
{ code: 1002, name: 'unknown_type', msg: 'unknown frame type', retryable: false, local: false },
|
|
114
|
+
{ code: 1003, name: 'not_implemented', msg: 'frame not implemented', retryable: false, local: false },
|
|
115
|
+
{ code: 1004, name: 'bad_params', msg: 'invalid frame parameters', retryable: false, local: false },
|
|
116
|
+
{ code: 1005, name: 'frame_too_large', msg: 'frame too large', retryable: false, local: false },
|
|
117
|
+
{ code: 1006, name: 'protocol_version_unsupported', msg: 'protocol version unsupported', retryable: false, local: false },
|
|
118
|
+
{ code: 1007, name: 'rate_limited', msg: 'rate limited', retryable: true, local: false },
|
|
119
|
+
{ code: 1101, name: 'token_invalid', msg: 'token invalid', retryable: false, local: false },
|
|
120
|
+
{ code: 1102, name: 'token_expired', msg: 'token expired', retryable: true, local: false },
|
|
121
|
+
{ code: 1103, name: 'not_authenticated', msg: 'not authenticated', retryable: false, local: false },
|
|
122
|
+
{ code: 1104, name: 'kicked_out', msg: 'kicked out', retryable: false, local: false },
|
|
123
|
+
{ code: 1105, name: 'session_not_resumable', msg: 'session not resumable', retryable: false, local: false },
|
|
124
|
+
// 票据合法但该 app_id 已被停用(宿主在控制台停用了整个应用)。
|
|
125
|
+
// 与 1101/1102 不同:那两个是「换张票再来」,这个是「这个应用被停了」。
|
|
126
|
+
{ code: 1106, name: 'app_disabled', msg: 'application disabled', retryable: false, local: false },
|
|
127
|
+
{ code: 1201, name: 'room_not_found', msg: 'room not found', retryable: false, local: false },
|
|
128
|
+
{ code: 1202, name: 'room_full', msg: 'room is full', retryable: false, local: false },
|
|
129
|
+
{ code: 1203, name: 'not_in_room', msg: 'not in room', retryable: false, local: false },
|
|
130
|
+
{ code: 1204, name: 'already_in_room', msg: 'already in room', retryable: false, local: false },
|
|
131
|
+
{ code: 1205, name: 'room_closed', msg: 'room closed', retryable: false, local: false },
|
|
132
|
+
{ code: 1206, name: 'permission_denied', msg: 'permission denied', retryable: false, local: false },
|
|
133
|
+
{ code: 1207, name: 'participant_not_found', msg: 'participant not found', retryable: false, local: false },
|
|
134
|
+
{ code: 1301, name: 'track_not_found', msg: 'track not found', retryable: false, local: false },
|
|
135
|
+
{ code: 1302, name: 'publish_denied', msg: 'publish denied', retryable: false, local: false },
|
|
136
|
+
{ code: 1303, name: 'subscribe_denied', msg: 'subscribe denied', retryable: false, local: false },
|
|
137
|
+
{ code: 1304, name: 'sdp_invalid', msg: 'sdp invalid', retryable: false, local: false },
|
|
138
|
+
{ code: 1305, name: 'pc_not_found', msg: 'peer connection not found', retryable: false, local: false },
|
|
139
|
+
{ code: 1306, name: 'layer_unavailable', msg: 'layer unavailable', retryable: false, local: false },
|
|
140
|
+
{ code: 1307, name: 'codec_unsupported', msg: 'codec unsupported', retryable: false, local: false },
|
|
141
|
+
{ code: 1401, name: 'call_not_found', msg: 'call not found', retryable: false, local: false },
|
|
142
|
+
{ code: 1402, name: 'call_ended', msg: 'call already ended', retryable: false, local: false },
|
|
143
|
+
{ code: 1403, name: 'callee_offline', msg: 'callee offline', retryable: false, local: false },
|
|
144
|
+
{ code: 1404, name: 'callee_busy', msg: 'callee busy', retryable: false, local: false },
|
|
145
|
+
{ code: 1405, name: 'invalid_call_state', msg: 'invalid call state', retryable: false, local: false },
|
|
146
|
+
{ code: 1406, name: 'too_many_callees', msg: 'too many callees', retryable: false, local: false },
|
|
147
|
+
{ code: 1407, name: 'not_call_owner', msg: 'not call owner', retryable: false, local: false },
|
|
148
|
+
{ code: 1408, name: 'already_in_call', msg: 'already in call', retryable: false, local: false },
|
|
149
|
+
{ code: 1409, name: 'invite_denied', msg: 'invite denied by host', retryable: false, local: false },
|
|
150
|
+
{ code: 1501, name: 'internal', msg: 'internal error', retryable: true, local: false },
|
|
151
|
+
{ code: 1502, name: 'sfu_unavailable', msg: 'sfu unavailable', retryable: true, local: false },
|
|
152
|
+
{ code: 1503, name: 'shutting_down', msg: 'server shutting down', retryable: true, local: false },
|
|
153
|
+
{ code: 1504, name: 'store_error', msg: 'store error', retryable: true, local: false },
|
|
154
|
+
{ code: 2001, name: 'device_permission_denied', msg: 'device permission denied', retryable: false, local: true },
|
|
155
|
+
{ code: 2002, name: 'device_not_found', msg: 'device not found', retryable: false, local: true },
|
|
156
|
+
{ code: 2003, name: 'network_unreachable', msg: 'network unreachable', retryable: true, local: true },
|
|
157
|
+
{ code: 2004, name: 'signaling_timeout', msg: 'signaling timeout', retryable: true, local: true },
|
|
158
|
+
{ code: 2005, name: 'invalid_state', msg: 'invalid state', retryable: false, local: true },
|
|
159
|
+
{ code: 2006, name: 'media_negotiation_failed', msg: 'media negotiation failed', retryable: false, local: true },
|
|
160
|
+
{ code: 2007, name: 'not_logged_in', msg: 'not logged in', retryable: false, local: true },
|
|
161
|
+
];
|
|
162
|
+
const byCode = new Map(ERROR_DEFINITIONS.map((d) => [d.code, d]));
|
|
163
|
+
/** lookupError 按 code 查定义;未知码返回 undefined。 */
|
|
164
|
+
export function lookupError(code) {
|
|
165
|
+
return byCode.get(code);
|
|
166
|
+
}
|
|
167
|
+
/** errorName 返回错误码的机读名;未知码返回 'unknown'。 */
|
|
168
|
+
export function errorName(code) {
|
|
169
|
+
return byCode.get(code)?.name ?? 'unknown';
|
|
170
|
+
}
|
|
171
|
+
/** isRetryable 报告这个码是否值得原样重试;未知码保守地按不可重试处理。 */
|
|
172
|
+
export function isRetryable(code) {
|
|
173
|
+
return byCode.get(code)?.retryable ?? false;
|
|
174
|
+
}
|
|
175
|
+
/** isLocalError 报告这个码是不是客户端本地码(永不上线路)。 */
|
|
176
|
+
export function isLocalError(code) {
|
|
177
|
+
return byCode.get(code)?.local ?? false;
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* RtcError 是 engine 对外抛的统一错误。
|
|
181
|
+
*
|
|
182
|
+
* `cause` 只用于日志,**不参与任何面向用户的展示**——这是「不把内部错误
|
|
183
|
+
* 透传给用户」那条规矩在 TS 侧的落点。
|
|
184
|
+
*/
|
|
185
|
+
export class RtcError extends Error {
|
|
186
|
+
code;
|
|
187
|
+
name_;
|
|
188
|
+
retryable;
|
|
189
|
+
/** 出错的请求 type;无对应请求时为 ''。 */
|
|
190
|
+
forType;
|
|
191
|
+
/**
|
|
192
|
+
* 本端不认识线路上那个码时,帧上自带的 `retryable`;认识就是 `undefined`。
|
|
193
|
+
*
|
|
194
|
+
* 为什么要单独留这一手:未知码在下面会被折成 `internal`(1501,而它
|
|
195
|
+
* `retryable === true`),于是**服务端新加的终局码在本端一律长成「可重试」**,
|
|
196
|
+
* 握手被拒也会退回无限重连。本端这张表只是上次同步时的快照,服务端比我们新是常态——
|
|
197
|
+
* 所以未知码一概以帧上带的那一位为准,不信折算后的码。
|
|
198
|
+
* Android 侧漏过 1106 一次,症状正是这个形状。
|
|
199
|
+
*/
|
|
200
|
+
unknownCodeRetryable;
|
|
201
|
+
constructor(code, options = {}) {
|
|
202
|
+
const def = byCode.get(code);
|
|
203
|
+
// 兜底的 internal 一定存在:它是表里的固定项。
|
|
204
|
+
const resolved = (def ?? byCode.get(ErrorCode.internal));
|
|
205
|
+
super(`${resolved.name}(${resolved.code}): ${resolved.msg}`, { cause: options.cause });
|
|
206
|
+
this.name = 'RtcError';
|
|
207
|
+
this.code = resolved.code;
|
|
208
|
+
this.name_ = resolved.name;
|
|
209
|
+
this.retryable = resolved.retryable;
|
|
210
|
+
this.forType = options.forType ?? '';
|
|
211
|
+
// 「只有本端不认识才留」这条规矩收在这一处:认识的码不许被线路上的一位盖掉
|
|
212
|
+
// 一致性向量里的定义。
|
|
213
|
+
this.unknownCodeRetryable = def === undefined ? options.wireRetryable : undefined;
|
|
214
|
+
}
|
|
215
|
+
/** wireShape 返回可以放进 sys.error 的 data —— 注意**不含** cause。 */
|
|
216
|
+
wireShape() {
|
|
217
|
+
const def = byCode.get(this.code) ?? byCode.get(ErrorCode.internal);
|
|
218
|
+
const resolved = def;
|
|
219
|
+
return {
|
|
220
|
+
code: resolved.code,
|
|
221
|
+
name: resolved.name,
|
|
222
|
+
msg: resolved.msg,
|
|
223
|
+
for_type: this.forType,
|
|
224
|
+
retryable: resolved.retryable,
|
|
225
|
+
};
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* rtcErrorFromWire 把一帧 `sys.error` 的 data 翻成 `RtcError`。
|
|
230
|
+
*
|
|
231
|
+
* **同一条不变量只该有一份实现。** 过去两个调用点(在途请求的结算、无主的错误帧)
|
|
232
|
+
* 各写了一遍这段构造,于是「未知码要留住帧上的 `retryable`」这条只在其中一处成立——
|
|
233
|
+
* 而握手恰恰走的是另一处,未知的终局码照样退回无限重连。
|
|
234
|
+
*
|
|
235
|
+
* `fallbackForType` 是 `for_type` 缺失时的兜底:结算在途请求时用那个请求自己的 type,
|
|
236
|
+
* 无主错误帧则没什么可兜的。
|
|
237
|
+
*/
|
|
238
|
+
export function rtcErrorFromWire(data, fallbackForType = '') {
|
|
239
|
+
const code = data['code'];
|
|
240
|
+
const forType = data['for_type'];
|
|
241
|
+
const retryable = data['retryable'];
|
|
242
|
+
return new RtcError(typeof code === 'number' ? code : ErrorCode.internal, {
|
|
243
|
+
forType: typeof forType === 'string' ? forType : fallbackForType,
|
|
244
|
+
// 帧上没带就整个不传这个键:本仓开着 exactOptionalPropertyTypes,
|
|
245
|
+
// 显式传 undefined 与「没有这个键」不是一回事。
|
|
246
|
+
...(typeof retryable === 'boolean' ? { wireRetryable: retryable } : {}),
|
|
247
|
+
});
|
|
248
|
+
}
|
|
249
|
+
/** isRtcError 是 RtcError 的类型守卫。 */
|
|
250
|
+
export function isRtcError(err) {
|
|
251
|
+
return err instanceof RtcError;
|
|
252
|
+
}
|
|
253
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { EngineEventHandler, EngineEventName, EngineEvents } from './events.js';
|
|
2
|
+
/**
|
|
3
|
+
* 类型安全的事件总线。
|
|
4
|
+
*
|
|
5
|
+
* 不引第三方 emitter:SDK 要轻,宿主的技术栈不该被我们绑架(CONVENTIONS §11)。
|
|
6
|
+
* 逻辑就这几十行。
|
|
7
|
+
*/
|
|
8
|
+
export declare class EventBus {
|
|
9
|
+
private readonly handlers;
|
|
10
|
+
/** on 订阅一个事件,返回退订函数。 */
|
|
11
|
+
on<K extends EngineEventName>(name: K, handler: EngineEventHandler<K>): () => void;
|
|
12
|
+
/** off 退订。 */
|
|
13
|
+
off<K extends EngineEventName>(name: K, handler: EngineEventHandler<K>): void;
|
|
14
|
+
/**
|
|
15
|
+
* emit 派发一个事件。
|
|
16
|
+
*
|
|
17
|
+
* **单个订阅者抛异常不能影响其他订阅者**——宿主的某个 UI 组件写崩了,
|
|
18
|
+
* 不该让整个通话的事件流断掉。
|
|
19
|
+
*/
|
|
20
|
+
emit<K extends EngineEventName>(name: K, payload: EngineEvents[K]): void;
|
|
21
|
+
/** clear 清空全部订阅(engine 销毁时)。 */
|
|
22
|
+
clear(): void;
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=eventBus.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eventBus.d.ts","sourceRoot":"","sources":["../src/eventBus.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAGrF;;;;;GAKG;AACH,qBAAa,QAAQ;IACnB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA6D;IAEtF,wBAAwB;IACxB,EAAE,CAAC,CAAC,SAAS,eAAe,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,kBAAkB,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI;IAYlF,cAAc;IACd,GAAG,CAAC,CAAC,SAAS,eAAe,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,kBAAkB,CAAC,CAAC,CAAC,GAAG,IAAI;IAI7E;;;;;OAKG;IACH,IAAI,CAAC,CAAC,SAAS,eAAe,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC,GAAG,IAAI;IAYxE,gCAAgC;IAChC,KAAK,IAAI,IAAI;CAGd"}
|
package/dist/eventBus.js
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { logger } from './logger.js';
|
|
2
|
+
/**
|
|
3
|
+
* 类型安全的事件总线。
|
|
4
|
+
*
|
|
5
|
+
* 不引第三方 emitter:SDK 要轻,宿主的技术栈不该被我们绑架(CONVENTIONS §11)。
|
|
6
|
+
* 逻辑就这几十行。
|
|
7
|
+
*/
|
|
8
|
+
export class EventBus {
|
|
9
|
+
handlers = new Map();
|
|
10
|
+
/** on 订阅一个事件,返回退订函数。 */
|
|
11
|
+
on(name, handler) {
|
|
12
|
+
let set = this.handlers.get(name);
|
|
13
|
+
if (set === undefined) {
|
|
14
|
+
set = new Set();
|
|
15
|
+
this.handlers.set(name, set);
|
|
16
|
+
}
|
|
17
|
+
set.add(handler);
|
|
18
|
+
return () => {
|
|
19
|
+
set?.delete(handler);
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
/** off 退订。 */
|
|
23
|
+
off(name, handler) {
|
|
24
|
+
this.handlers.get(name)?.delete(handler);
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* emit 派发一个事件。
|
|
28
|
+
*
|
|
29
|
+
* **单个订阅者抛异常不能影响其他订阅者**——宿主的某个 UI 组件写崩了,
|
|
30
|
+
* 不该让整个通话的事件流断掉。
|
|
31
|
+
*/
|
|
32
|
+
emit(name, payload) {
|
|
33
|
+
const set = this.handlers.get(name);
|
|
34
|
+
if (set === undefined)
|
|
35
|
+
return;
|
|
36
|
+
for (const handler of [...set]) {
|
|
37
|
+
try {
|
|
38
|
+
handler(payload);
|
|
39
|
+
}
|
|
40
|
+
catch (cause) {
|
|
41
|
+
logger.error('事件订阅者抛异常', { event: name, cause: String(cause) });
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
/** clear 清空全部订阅(engine 销毁时)。 */
|
|
46
|
+
clear() {
|
|
47
|
+
this.handlers.clear();
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=eventBus.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eventBus.js","sourceRoot":"","sources":["../src/eventBus.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC;;;;;GAKG;AACH,MAAM,OAAO,QAAQ;IACF,QAAQ,GAAG,IAAI,GAAG,EAAkD,CAAC;IAEtF,wBAAwB;IACxB,EAAE,CAA4B,IAAO,EAAE,OAA8B;QACnE,IAAI,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAClC,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;YACtB,GAAG,GAAG,IAAI,GAAG,EAAE,CAAC;YAChB,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QAC/B,CAAC;QACD,GAAG,CAAC,GAAG,CAAC,OAAmC,CAAC,CAAC;QAC7C,OAAO,GAAG,EAAE;YACV,GAAG,EAAE,MAAM,CAAC,OAAmC,CAAC,CAAC;QACnD,CAAC,CAAC;IACJ,CAAC;IAED,cAAc;IACd,GAAG,CAA4B,IAAO,EAAE,OAA8B;QACpE,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,OAAmC,CAAC,CAAC;IACvE,CAAC;IAED;;;;;OAKG;IACH,IAAI,CAA4B,IAAO,EAAE,OAAwB;QAC/D,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACpC,IAAI,GAAG,KAAK,SAAS;YAAE,OAAO;QAC9B,KAAK,MAAM,OAAO,IAAI,CAAC,GAAG,GAAG,CAAC,EAAE,CAAC;YAC/B,IAAI,CAAC;gBACF,OAAiC,CAAC,OAAO,CAAC,CAAC;YAC9C,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,CAAC,KAAK,CAAC,UAAU,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAClE,CAAC;QACH,CAAC;IACH,CAAC;IAED,gCAAgC;IAChC,KAAK;QACH,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;IACxB,CAAC;CACF"}
|