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,57 @@
|
|
|
1
|
+
import { toFrameProps } from './caseMapping.js';
|
|
2
|
+
import { lookupFrame } from './registry.js';
|
|
3
|
+
/**
|
|
4
|
+
* FrameSender 把状态机产出的**意图**变成线路上的一帧。
|
|
5
|
+
*
|
|
6
|
+
* # 为什么这一层要单独存在
|
|
7
|
+
*
|
|
8
|
+
* 状态机是纯函数,产不出 SDP——它给的协商帧 `sdp` 字段是空的。
|
|
9
|
+
* 「取真值填进去」这件事既要碰媒体层又要碰连接,放在状态机里会毁掉它的可测性,
|
|
10
|
+
* 放在门面里则让门面同时管路由、填 SDP 和事件三件事。所以单独一层:
|
|
11
|
+
* **门面只管把帧交给它,它只管把帧变成真的**。
|
|
12
|
+
*/
|
|
13
|
+
export class FrameSender {
|
|
14
|
+
media;
|
|
15
|
+
/** 服务端最近一次下发的 sub offer,答复时要用。 */
|
|
16
|
+
lastSubOfferSdp = '';
|
|
17
|
+
constructor(media) {
|
|
18
|
+
this.media = media;
|
|
19
|
+
}
|
|
20
|
+
/** noteSubOffer 记下服务端下发的 sub offer。**答复它时才有得可答**。 */
|
|
21
|
+
noteSubOffer(sdp) {
|
|
22
|
+
this.lastSubOfferSdp = sdp;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* send 发一帧并返回应答(`{type, data}`)。
|
|
26
|
+
*
|
|
27
|
+
* 返回应答而不是直接消化掉:**`.ok` 也要喂回状态机**——join.ok / publish.ok
|
|
28
|
+
* 都是状态推进的关键一步,漏掉那一半会让房间永远停在 `joining`。
|
|
29
|
+
*/
|
|
30
|
+
async send(connection, type, data) {
|
|
31
|
+
const fields = lookupFrame(type);
|
|
32
|
+
if (fields === undefined)
|
|
33
|
+
return null;
|
|
34
|
+
const filled = { ...data };
|
|
35
|
+
if (type === 'room.offer' && filled['pc'] === 'pub') {
|
|
36
|
+
filled['sdp'] = await this.media.createPubOffer();
|
|
37
|
+
}
|
|
38
|
+
else if (type === 'room.answer' && filled['pc'] === 'sub') {
|
|
39
|
+
filled['sdp'] = await this.media.answerSubOffer(this.lastSubOfferSdp);
|
|
40
|
+
}
|
|
41
|
+
const reply = await connection.request(type, fields, toFrameProps(fields, filled));
|
|
42
|
+
return { type: reply.envelope.type, data: reply.data };
|
|
43
|
+
}
|
|
44
|
+
/** sendCandidate 发一个本端候选。候选是尽力而为的,失败由调用方转成 error 事件。 */
|
|
45
|
+
async sendCandidate(connection, pc, candidate) {
|
|
46
|
+
const fields = lookupFrame('room.ice_candidate');
|
|
47
|
+
if (fields === undefined)
|
|
48
|
+
return;
|
|
49
|
+
await connection.request('room.ice_candidate', fields, {
|
|
50
|
+
pc,
|
|
51
|
+
candidate: candidate.candidate ?? '',
|
|
52
|
+
sdpMid: candidate.sdpMid ?? '',
|
|
53
|
+
sdpMLineIndex: candidate.sdpMLineIndex ?? 0,
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=frameSender.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"frameSender.js","sourceRoot":"","sources":["../../src/signaling/frameSender.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAGhD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C;;;;;;;;;GASG;AACH,MAAM,OAAO,WAAW;IACL,KAAK,CAAe;IACrC,kCAAkC;IAC1B,eAAe,GAAG,EAAE,CAAC;IAE7B,YAAY,KAAmB;QAC7B,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;IAED,qDAAqD;IACrD,YAAY,CAAC,GAAW;QACtB,IAAI,CAAC,eAAe,GAAG,GAAG,CAAC;IAC7B,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,IAAI,CACR,UAAsB,EACtB,IAAY,EACZ,IAAuC;QAEvC,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;QACjC,IAAI,MAAM,KAAK,SAAS;YAAE,OAAO,IAAI,CAAC;QAEtC,MAAM,MAAM,GAA4B,EAAE,GAAG,IAAI,EAAE,CAAC;QACpD,IAAI,IAAI,KAAK,YAAY,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,KAAK,EAAE,CAAC;YACpD,MAAM,CAAC,KAAK,CAAC,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC;QACpD,CAAC;aAAM,IAAI,IAAI,KAAK,aAAa,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,KAAK,EAAE,CAAC;YAC5D,MAAM,CAAC,KAAK,CAAC,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QACxE,CAAC;QACD,MAAM,KAAK,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;QACnF,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC;IACzD,CAAC;IAED,wDAAwD;IACxD,KAAK,CAAC,aAAa,CACjB,UAAsB,EACtB,EAAU,EACV,SAA8B;QAE9B,MAAM,MAAM,GAAG,WAAW,CAAC,oBAAoB,CAAC,CAAC;QACjD,IAAI,MAAM,KAAK,SAAS;YAAE,OAAO;QACjC,MAAM,UAAU,CAAC,OAAO,CAAC,oBAAoB,EAAE,MAAM,EAAE;YACrD,EAAE;YACF,SAAS,EAAE,SAAS,CAAC,SAAS,IAAI,EAAE;YACpC,MAAM,EAAE,SAAS,CAAC,MAAM,IAAI,EAAE;YAC9B,aAAa,EAAE,SAAS,CAAC,aAAa,IAAI,CAAC;SAC5C,CAAC,CAAC;IACL,CAAC;CACF"}
|
|
@@ -0,0 +1,299 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* call 域:振铃流程。见 RTC_PROTOCOL.md §4。
|
|
3
|
+
* Call 层**不碰媒体**——接通后一切走 room 帧。所以这里没有一个 SDP 字段。
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* INVITE_FIELDS:发起通话。
|
|
7
|
+
*
|
|
8
|
+
* user_data 是 opaque **字符串**不是对象——宿主要塞任意结构自己序列化。
|
|
9
|
+
* 这条是为了 C++ 端不必处理任意嵌套(§2.4 规则 5)。服务端原样透传,不解析。
|
|
10
|
+
*/
|
|
11
|
+
export declare const INVITE_FIELDS: {
|
|
12
|
+
/** 1v1 恰好 1 个;群 ≤8(房内含主叫共 9 人)。 */
|
|
13
|
+
readonly calleeIds: {
|
|
14
|
+
readonly kind: "stringArray";
|
|
15
|
+
readonly wire: "callee_ids";
|
|
16
|
+
};
|
|
17
|
+
readonly mediaType: {
|
|
18
|
+
readonly kind: "enum";
|
|
19
|
+
readonly wire: "media_type";
|
|
20
|
+
readonly values: readonly ["audio", "video"];
|
|
21
|
+
readonly fallback: "audio";
|
|
22
|
+
};
|
|
23
|
+
readonly isGroup: {
|
|
24
|
+
readonly kind: "bool";
|
|
25
|
+
readonly wire: "is_group";
|
|
26
|
+
};
|
|
27
|
+
/** '' = 服务端建房。 */
|
|
28
|
+
readonly roomId: {
|
|
29
|
+
readonly kind: "string";
|
|
30
|
+
readonly wire: "room_id";
|
|
31
|
+
};
|
|
32
|
+
readonly timeoutSec: {
|
|
33
|
+
readonly kind: "int";
|
|
34
|
+
readonly wire: "timeout_sec";
|
|
35
|
+
readonly default: 30;
|
|
36
|
+
readonly min: 5;
|
|
37
|
+
readonly max: 120;
|
|
38
|
+
};
|
|
39
|
+
readonly userData: {
|
|
40
|
+
readonly kind: "string";
|
|
41
|
+
readonly wire: "user_data";
|
|
42
|
+
};
|
|
43
|
+
/**
|
|
44
|
+
* 宿主自己的群号,opaque,≤64 字节,禁止空白与换行(服务端校验,本端也在 engine.ts 拦一道)。
|
|
45
|
+
* 通话期间不可改;服务端不解析、不校验群成员关系,只原样带出去(§3.2)。
|
|
46
|
+
*/
|
|
47
|
+
readonly chatGroupId: {
|
|
48
|
+
readonly kind: "string";
|
|
49
|
+
readonly wire: "chat_group_id";
|
|
50
|
+
};
|
|
51
|
+
};
|
|
52
|
+
/** INVITE_OK_FIELDS:**主叫此时禁止 room.join**——接听前不进 SFU(§4.1)。 */
|
|
53
|
+
export declare const INVITE_OK_FIELDS: {
|
|
54
|
+
readonly callId: {
|
|
55
|
+
readonly kind: "string";
|
|
56
|
+
readonly wire: "call_id";
|
|
57
|
+
};
|
|
58
|
+
readonly roomId: {
|
|
59
|
+
readonly kind: "string";
|
|
60
|
+
readonly wire: "room_id";
|
|
61
|
+
};
|
|
62
|
+
readonly invitedAtMs: {
|
|
63
|
+
readonly kind: "int";
|
|
64
|
+
readonly wire: "invited_at_ms";
|
|
65
|
+
};
|
|
66
|
+
};
|
|
67
|
+
/**
|
|
68
|
+
* CALL_ID_FIELDS:只带 call_id 的上行帧共用
|
|
69
|
+
* (accept / reject / cancel / hangup / join)。
|
|
70
|
+
*
|
|
71
|
+
* 接通后主叫也用 hangup,**不用 cancel**——两个词不共用一条路径,
|
|
72
|
+
* 避免「取消一通已接通的电话」这种歧义。
|
|
73
|
+
*/
|
|
74
|
+
export declare const CALL_ID_FIELDS: {
|
|
75
|
+
readonly callId: {
|
|
76
|
+
readonly kind: "string";
|
|
77
|
+
readonly wire: "call_id";
|
|
78
|
+
};
|
|
79
|
+
};
|
|
80
|
+
/** INVITE_MORE_FIELDS:群通话中途加邀(P4)。通话里的任何人都能发。 */
|
|
81
|
+
export declare const INVITE_MORE_FIELDS: {
|
|
82
|
+
readonly callId: {
|
|
83
|
+
readonly kind: "string";
|
|
84
|
+
readonly wire: "call_id";
|
|
85
|
+
};
|
|
86
|
+
readonly calleeIds: {
|
|
87
|
+
readonly kind: "stringArray";
|
|
88
|
+
readonly wire: "callee_ids";
|
|
89
|
+
};
|
|
90
|
+
};
|
|
91
|
+
/** INCOMING_FIELDS:被叫收到的邀请,对应 onCallReceived。 */
|
|
92
|
+
export declare const INCOMING_FIELDS: {
|
|
93
|
+
readonly callId: {
|
|
94
|
+
readonly kind: "string";
|
|
95
|
+
readonly wire: "call_id";
|
|
96
|
+
};
|
|
97
|
+
readonly roomId: {
|
|
98
|
+
readonly kind: "string";
|
|
99
|
+
readonly wire: "room_id";
|
|
100
|
+
};
|
|
101
|
+
readonly caller: {
|
|
102
|
+
readonly kind: "string";
|
|
103
|
+
readonly wire: "caller";
|
|
104
|
+
};
|
|
105
|
+
readonly calleeIds: {
|
|
106
|
+
readonly kind: "stringArray";
|
|
107
|
+
readonly wire: "callee_ids";
|
|
108
|
+
};
|
|
109
|
+
readonly mediaType: {
|
|
110
|
+
readonly kind: "enum";
|
|
111
|
+
readonly wire: "media_type";
|
|
112
|
+
readonly values: readonly ["audio", "video"];
|
|
113
|
+
readonly fallback: "audio";
|
|
114
|
+
};
|
|
115
|
+
readonly isGroup: {
|
|
116
|
+
readonly kind: "bool";
|
|
117
|
+
readonly wire: "is_group";
|
|
118
|
+
};
|
|
119
|
+
readonly timeoutSec: {
|
|
120
|
+
readonly kind: "int";
|
|
121
|
+
readonly wire: "timeout_sec";
|
|
122
|
+
readonly default: 30;
|
|
123
|
+
readonly min: 5;
|
|
124
|
+
readonly max: 120;
|
|
125
|
+
};
|
|
126
|
+
readonly invitedAtMs: {
|
|
127
|
+
readonly kind: "int";
|
|
128
|
+
readonly wire: "invited_at_ms";
|
|
129
|
+
};
|
|
130
|
+
readonly userData: {
|
|
131
|
+
readonly kind: "string";
|
|
132
|
+
readonly wire: "user_data";
|
|
133
|
+
};
|
|
134
|
+
/** 群号,Kit 靠它决定「添加成员」列谁(§3.2)。 */
|
|
135
|
+
readonly chatGroupId: {
|
|
136
|
+
readonly kind: "string";
|
|
137
|
+
readonly wire: "chat_group_id";
|
|
138
|
+
};
|
|
139
|
+
};
|
|
140
|
+
/**
|
|
141
|
+
* RINGING_FIELDS:告诉主叫「对方设备开始响铃了」,每个被叫 uid 只发一次。
|
|
142
|
+
* UI 据此把「正在呼叫…」改成「等待对方接听…」。它**不对应任何回调**。
|
|
143
|
+
*/
|
|
144
|
+
export declare const RINGING_FIELDS: {
|
|
145
|
+
readonly callId: {
|
|
146
|
+
readonly kind: "string";
|
|
147
|
+
readonly wire: "call_id";
|
|
148
|
+
};
|
|
149
|
+
readonly uid: {
|
|
150
|
+
readonly kind: "string";
|
|
151
|
+
readonly wire: "uid";
|
|
152
|
+
};
|
|
153
|
+
readonly deviceCount: {
|
|
154
|
+
readonly kind: "int";
|
|
155
|
+
readonly wire: "device_count";
|
|
156
|
+
};
|
|
157
|
+
};
|
|
158
|
+
/**
|
|
159
|
+
* MEMBER_OUTCOME_FIELDS:某成员的裁决,四个帧共用
|
|
160
|
+
* (call.accepted / rejected / busy / no_answer)。
|
|
161
|
+
*/
|
|
162
|
+
export declare const MEMBER_OUTCOME_FIELDS: {
|
|
163
|
+
readonly callId: {
|
|
164
|
+
readonly kind: "string";
|
|
165
|
+
readonly wire: "call_id";
|
|
166
|
+
};
|
|
167
|
+
readonly uid: {
|
|
168
|
+
readonly kind: "string";
|
|
169
|
+
readonly wire: "uid";
|
|
170
|
+
};
|
|
171
|
+
};
|
|
172
|
+
/** CANCELLED_FIELDS:主叫取消,发给全部被叫设备。 */
|
|
173
|
+
export declare const CANCELLED_FIELDS: {
|
|
174
|
+
readonly callId: {
|
|
175
|
+
readonly kind: "string";
|
|
176
|
+
readonly wire: "call_id";
|
|
177
|
+
};
|
|
178
|
+
readonly by: {
|
|
179
|
+
readonly kind: "string";
|
|
180
|
+
readonly wire: "by";
|
|
181
|
+
};
|
|
182
|
+
};
|
|
183
|
+
/**
|
|
184
|
+
* CONNECTED_FIELDS:「可以进房了」,对应 onCallBegin。
|
|
185
|
+
*
|
|
186
|
+
* call.accept.ok 是纯 ack,房间信息只在这一条帧里——一个东西一条路径。
|
|
187
|
+
*/
|
|
188
|
+
export declare const CONNECTED_FIELDS: {
|
|
189
|
+
readonly callId: {
|
|
190
|
+
readonly kind: "string";
|
|
191
|
+
readonly wire: "call_id";
|
|
192
|
+
};
|
|
193
|
+
readonly roomId: {
|
|
194
|
+
readonly kind: "string";
|
|
195
|
+
readonly wire: "room_id";
|
|
196
|
+
};
|
|
197
|
+
/** 绑定 (room_id, uid, device_id),TTL 5 分钟、一次性。**不要整条打日志**。 */
|
|
198
|
+
readonly roomToken: {
|
|
199
|
+
readonly kind: "string";
|
|
200
|
+
readonly wire: "room_token";
|
|
201
|
+
};
|
|
202
|
+
readonly mediaType: {
|
|
203
|
+
readonly kind: "enum";
|
|
204
|
+
readonly wire: "media_type";
|
|
205
|
+
readonly values: readonly ["audio", "video"];
|
|
206
|
+
readonly fallback: "audio";
|
|
207
|
+
};
|
|
208
|
+
readonly isGroup: {
|
|
209
|
+
readonly kind: "bool";
|
|
210
|
+
readonly wire: "is_group";
|
|
211
|
+
};
|
|
212
|
+
/** 通话时长的起点,服务端时钟。 */
|
|
213
|
+
readonly connectedAtMs: {
|
|
214
|
+
readonly kind: "int";
|
|
215
|
+
readonly wire: "connected_at_ms";
|
|
216
|
+
};
|
|
217
|
+
readonly acceptedBy: {
|
|
218
|
+
readonly kind: "string";
|
|
219
|
+
readonly wire: "accepted_by";
|
|
220
|
+
};
|
|
221
|
+
/**
|
|
222
|
+
* 发起人。`call.join` 进来的人没收过 `call.incoming`,只能从这里知道是谁打的(§3.2)。
|
|
223
|
+
*/
|
|
224
|
+
readonly caller: {
|
|
225
|
+
readonly kind: "string";
|
|
226
|
+
readonly wire: "caller";
|
|
227
|
+
};
|
|
228
|
+
/** 同 call.invite,中途加入与断线恢复后也拿得到群号。 */
|
|
229
|
+
readonly chatGroupId: {
|
|
230
|
+
readonly kind: "string";
|
|
231
|
+
readonly wire: "chat_group_id";
|
|
232
|
+
};
|
|
233
|
+
/** 同 call.invite,原样回显。 */
|
|
234
|
+
readonly userData: {
|
|
235
|
+
readonly kind: "string";
|
|
236
|
+
readonly wire: "user_data";
|
|
237
|
+
};
|
|
238
|
+
};
|
|
239
|
+
/** HANDLED_ELSEWHERE_FIELDS:本账号另一台设备处理了这通电话。 */
|
|
240
|
+
export declare const HANDLED_ELSEWHERE_FIELDS: {
|
|
241
|
+
readonly callId: {
|
|
242
|
+
readonly kind: "string";
|
|
243
|
+
readonly wire: "call_id";
|
|
244
|
+
};
|
|
245
|
+
readonly action: {
|
|
246
|
+
readonly kind: "enum";
|
|
247
|
+
readonly wire: "action";
|
|
248
|
+
readonly values: readonly ["accept", "reject"];
|
|
249
|
+
readonly fallback: "accept";
|
|
250
|
+
};
|
|
251
|
+
readonly deviceId: {
|
|
252
|
+
readonly kind: "string";
|
|
253
|
+
readonly wire: "device_id";
|
|
254
|
+
};
|
|
255
|
+
};
|
|
256
|
+
/**
|
|
257
|
+
* ENDED_FIELDS:**唯一终态帧**。
|
|
258
|
+
*
|
|
259
|
+
* 铁律:每个成员设备收到且仅收到一条;所有结局都走它;
|
|
260
|
+
* 宿主只监听它也必须能完整记录一通电话。
|
|
261
|
+
*/
|
|
262
|
+
export declare const ENDED_FIELDS: {
|
|
263
|
+
readonly callId: {
|
|
264
|
+
readonly kind: "string";
|
|
265
|
+
readonly wire: "call_id";
|
|
266
|
+
};
|
|
267
|
+
readonly roomId: {
|
|
268
|
+
readonly kind: "string";
|
|
269
|
+
readonly wire: "room_id";
|
|
270
|
+
};
|
|
271
|
+
readonly reason: {
|
|
272
|
+
readonly kind: "enum";
|
|
273
|
+
readonly wire: "reason";
|
|
274
|
+
readonly values: readonly ["hangup", "cancel", "reject", "no_answer", "busy", "offline", "answered_elsewhere", "rejected_elsewhere", "kicked", "room_closed", "network", "error"];
|
|
275
|
+
readonly fallback: "error";
|
|
276
|
+
};
|
|
277
|
+
/** 未接通恒为 0。**四端禁止自己算时长**(时钟偏移),一律用这个值。 */
|
|
278
|
+
readonly durationSec: {
|
|
279
|
+
readonly kind: "int";
|
|
280
|
+
readonly wire: "duration_sec";
|
|
281
|
+
};
|
|
282
|
+
/** 动作发起人 uid;服务端自行判定时为 ''。 */
|
|
283
|
+
readonly endedBy: {
|
|
284
|
+
readonly kind: "string";
|
|
285
|
+
readonly wire: "ended_by";
|
|
286
|
+
};
|
|
287
|
+
/**
|
|
288
|
+
* 这通电话是谁打的。
|
|
289
|
+
*
|
|
290
|
+
* **忙线那条不振铃**,被叫拿到的第一帧也是最后一帧就是它——没有这个字段就说不出
|
|
291
|
+
* 「谁来过电话」(协议 §4.2)。字段没登记在这里的话解码器会把它丢掉,
|
|
292
|
+
* `onCallMissed` 拿到的 caller 就是空串。
|
|
293
|
+
*/
|
|
294
|
+
readonly caller: {
|
|
295
|
+
readonly kind: "string";
|
|
296
|
+
readonly wire: "caller";
|
|
297
|
+
};
|
|
298
|
+
};
|
|
299
|
+
//# sourceMappingURL=frames.call.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"frames.call.d.ts","sourceRoot":"","sources":["../../src/signaling/frames.call.ts"],"names":[],"mappings":"AAUA;;;GAGG;AAEH;;;;;GAKG;AACH,eAAO,MAAM,aAAa;IACxB,mCAAmC;;;;;;;;;;;;;;;IAInC,kBAAkB;;;;;;;;;;;;;;;;IAUlB;;;OAGG;;;;;CAE2B,CAAC;AAEjC,8DAA8D;AAC9D,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;CAIG,CAAC;AAEjC;;;;;;GAMG;AACH,eAAO,MAAM,cAAc;;;;;CAEK,CAAC;AAEjC,iDAAiD;AACjD,eAAO,MAAM,kBAAkB;;;;;;;;;CAGC,CAAC;AAEjC,iDAAiD;AACjD,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAgB1B,iCAAiC;;;;;CAEH,CAAC;AAEjC;;;GAGG;AACH,eAAO,MAAM,cAAc;;;;;;;;;;;;;CAIK,CAAC;AAEjC;;;GAGG;AACH,eAAO,MAAM,qBAAqB;;;;;;;;;CAGF,CAAC;AAEjC,sCAAsC;AACtC,eAAO,MAAM,gBAAgB;;;;;;;;;CAGG,CAAC;AAEjC;;;;GAIG;AACH,eAAO,MAAM,gBAAgB;;;;;;;;;IAG3B,6DAA6D;;;;;;;;;;;;;;;IAI7D,qBAAqB;;;;;;;;;IAGrB;;OAEG;;;;;IAEH,sCAAsC;;;;;IAEtC,0BAA0B;;;;;CAEI,CAAC;AAEjC,gDAAgD;AAChD,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;;;CAIL,CAAC;AAEjC;;;;;GAKG;AACH,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;IAIvB,0CAA0C;;;;;IAE1C,8BAA8B;;;;;IAE9B;;;;;;OAMG;;;;;CAE2B,CAAC"}
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
import { DEFAULT_TIMEOUT_SEC, HANDLED_ACTIONS, MAX_TIMEOUT_SEC, MEDIA_TYPES, MIN_TIMEOUT_SEC, REASONS, } from './enums.js';
|
|
2
|
+
/**
|
|
3
|
+
* call 域:振铃流程。见 RTC_PROTOCOL.md §4。
|
|
4
|
+
* Call 层**不碰媒体**——接通后一切走 room 帧。所以这里没有一个 SDP 字段。
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* INVITE_FIELDS:发起通话。
|
|
8
|
+
*
|
|
9
|
+
* user_data 是 opaque **字符串**不是对象——宿主要塞任意结构自己序列化。
|
|
10
|
+
* 这条是为了 C++ 端不必处理任意嵌套(§2.4 规则 5)。服务端原样透传,不解析。
|
|
11
|
+
*/
|
|
12
|
+
export const INVITE_FIELDS = {
|
|
13
|
+
/** 1v1 恰好 1 个;群 ≤8(房内含主叫共 9 人)。 */
|
|
14
|
+
calleeIds: { kind: 'stringArray', wire: 'callee_ids' },
|
|
15
|
+
mediaType: { kind: 'enum', wire: 'media_type', values: MEDIA_TYPES, fallback: 'audio' },
|
|
16
|
+
isGroup: { kind: 'bool', wire: 'is_group' },
|
|
17
|
+
/** '' = 服务端建房。 */
|
|
18
|
+
roomId: { kind: 'string', wire: 'room_id' },
|
|
19
|
+
timeoutSec: {
|
|
20
|
+
kind: 'int',
|
|
21
|
+
wire: 'timeout_sec',
|
|
22
|
+
default: DEFAULT_TIMEOUT_SEC,
|
|
23
|
+
min: MIN_TIMEOUT_SEC,
|
|
24
|
+
max: MAX_TIMEOUT_SEC,
|
|
25
|
+
},
|
|
26
|
+
userData: { kind: 'string', wire: 'user_data' },
|
|
27
|
+
/**
|
|
28
|
+
* 宿主自己的群号,opaque,≤64 字节,禁止空白与换行(服务端校验,本端也在 engine.ts 拦一道)。
|
|
29
|
+
* 通话期间不可改;服务端不解析、不校验群成员关系,只原样带出去(§3.2)。
|
|
30
|
+
*/
|
|
31
|
+
chatGroupId: { kind: 'string', wire: 'chat_group_id' },
|
|
32
|
+
};
|
|
33
|
+
/** INVITE_OK_FIELDS:**主叫此时禁止 room.join**——接听前不进 SFU(§4.1)。 */
|
|
34
|
+
export const INVITE_OK_FIELDS = {
|
|
35
|
+
callId: { kind: 'string', wire: 'call_id' },
|
|
36
|
+
roomId: { kind: 'string', wire: 'room_id' },
|
|
37
|
+
invitedAtMs: { kind: 'int', wire: 'invited_at_ms' },
|
|
38
|
+
};
|
|
39
|
+
/**
|
|
40
|
+
* CALL_ID_FIELDS:只带 call_id 的上行帧共用
|
|
41
|
+
* (accept / reject / cancel / hangup / join)。
|
|
42
|
+
*
|
|
43
|
+
* 接通后主叫也用 hangup,**不用 cancel**——两个词不共用一条路径,
|
|
44
|
+
* 避免「取消一通已接通的电话」这种歧义。
|
|
45
|
+
*/
|
|
46
|
+
export const CALL_ID_FIELDS = {
|
|
47
|
+
callId: { kind: 'string', wire: 'call_id' },
|
|
48
|
+
};
|
|
49
|
+
/** INVITE_MORE_FIELDS:群通话中途加邀(P4)。通话里的任何人都能发。 */
|
|
50
|
+
export const INVITE_MORE_FIELDS = {
|
|
51
|
+
callId: { kind: 'string', wire: 'call_id' },
|
|
52
|
+
calleeIds: { kind: 'stringArray', wire: 'callee_ids' },
|
|
53
|
+
};
|
|
54
|
+
/** INCOMING_FIELDS:被叫收到的邀请,对应 onCallReceived。 */
|
|
55
|
+
export const INCOMING_FIELDS = {
|
|
56
|
+
callId: { kind: 'string', wire: 'call_id' },
|
|
57
|
+
roomId: { kind: 'string', wire: 'room_id' },
|
|
58
|
+
caller: { kind: 'string', wire: 'caller' },
|
|
59
|
+
calleeIds: { kind: 'stringArray', wire: 'callee_ids' },
|
|
60
|
+
mediaType: { kind: 'enum', wire: 'media_type', values: MEDIA_TYPES, fallback: 'audio' },
|
|
61
|
+
isGroup: { kind: 'bool', wire: 'is_group' },
|
|
62
|
+
timeoutSec: {
|
|
63
|
+
kind: 'int',
|
|
64
|
+
wire: 'timeout_sec',
|
|
65
|
+
default: DEFAULT_TIMEOUT_SEC,
|
|
66
|
+
min: MIN_TIMEOUT_SEC,
|
|
67
|
+
max: MAX_TIMEOUT_SEC,
|
|
68
|
+
},
|
|
69
|
+
invitedAtMs: { kind: 'int', wire: 'invited_at_ms' },
|
|
70
|
+
userData: { kind: 'string', wire: 'user_data' },
|
|
71
|
+
/** 群号,Kit 靠它决定「添加成员」列谁(§3.2)。 */
|
|
72
|
+
chatGroupId: { kind: 'string', wire: 'chat_group_id' },
|
|
73
|
+
};
|
|
74
|
+
/**
|
|
75
|
+
* RINGING_FIELDS:告诉主叫「对方设备开始响铃了」,每个被叫 uid 只发一次。
|
|
76
|
+
* UI 据此把「正在呼叫…」改成「等待对方接听…」。它**不对应任何回调**。
|
|
77
|
+
*/
|
|
78
|
+
export const RINGING_FIELDS = {
|
|
79
|
+
callId: { kind: 'string', wire: 'call_id' },
|
|
80
|
+
uid: { kind: 'string', wire: 'uid' },
|
|
81
|
+
deviceCount: { kind: 'int', wire: 'device_count' },
|
|
82
|
+
};
|
|
83
|
+
/**
|
|
84
|
+
* MEMBER_OUTCOME_FIELDS:某成员的裁决,四个帧共用
|
|
85
|
+
* (call.accepted / rejected / busy / no_answer)。
|
|
86
|
+
*/
|
|
87
|
+
export const MEMBER_OUTCOME_FIELDS = {
|
|
88
|
+
callId: { kind: 'string', wire: 'call_id' },
|
|
89
|
+
uid: { kind: 'string', wire: 'uid' },
|
|
90
|
+
};
|
|
91
|
+
/** CANCELLED_FIELDS:主叫取消,发给全部被叫设备。 */
|
|
92
|
+
export const CANCELLED_FIELDS = {
|
|
93
|
+
callId: { kind: 'string', wire: 'call_id' },
|
|
94
|
+
by: { kind: 'string', wire: 'by' },
|
|
95
|
+
};
|
|
96
|
+
/**
|
|
97
|
+
* CONNECTED_FIELDS:「可以进房了」,对应 onCallBegin。
|
|
98
|
+
*
|
|
99
|
+
* call.accept.ok 是纯 ack,房间信息只在这一条帧里——一个东西一条路径。
|
|
100
|
+
*/
|
|
101
|
+
export const CONNECTED_FIELDS = {
|
|
102
|
+
callId: { kind: 'string', wire: 'call_id' },
|
|
103
|
+
roomId: { kind: 'string', wire: 'room_id' },
|
|
104
|
+
/** 绑定 (room_id, uid, device_id),TTL 5 分钟、一次性。**不要整条打日志**。 */
|
|
105
|
+
roomToken: { kind: 'string', wire: 'room_token' },
|
|
106
|
+
mediaType: { kind: 'enum', wire: 'media_type', values: MEDIA_TYPES, fallback: 'audio' },
|
|
107
|
+
isGroup: { kind: 'bool', wire: 'is_group' },
|
|
108
|
+
/** 通话时长的起点,服务端时钟。 */
|
|
109
|
+
connectedAtMs: { kind: 'int', wire: 'connected_at_ms' },
|
|
110
|
+
acceptedBy: { kind: 'string', wire: 'accepted_by' },
|
|
111
|
+
/**
|
|
112
|
+
* 发起人。`call.join` 进来的人没收过 `call.incoming`,只能从这里知道是谁打的(§3.2)。
|
|
113
|
+
*/
|
|
114
|
+
caller: { kind: 'string', wire: 'caller' },
|
|
115
|
+
/** 同 call.invite,中途加入与断线恢复后也拿得到群号。 */
|
|
116
|
+
chatGroupId: { kind: 'string', wire: 'chat_group_id' },
|
|
117
|
+
/** 同 call.invite,原样回显。 */
|
|
118
|
+
userData: { kind: 'string', wire: 'user_data' },
|
|
119
|
+
};
|
|
120
|
+
/** HANDLED_ELSEWHERE_FIELDS:本账号另一台设备处理了这通电话。 */
|
|
121
|
+
export const HANDLED_ELSEWHERE_FIELDS = {
|
|
122
|
+
callId: { kind: 'string', wire: 'call_id' },
|
|
123
|
+
action: { kind: 'enum', wire: 'action', values: HANDLED_ACTIONS, fallback: 'accept' },
|
|
124
|
+
deviceId: { kind: 'string', wire: 'device_id' },
|
|
125
|
+
};
|
|
126
|
+
/**
|
|
127
|
+
* ENDED_FIELDS:**唯一终态帧**。
|
|
128
|
+
*
|
|
129
|
+
* 铁律:每个成员设备收到且仅收到一条;所有结局都走它;
|
|
130
|
+
* 宿主只监听它也必须能完整记录一通电话。
|
|
131
|
+
*/
|
|
132
|
+
export const ENDED_FIELDS = {
|
|
133
|
+
callId: { kind: 'string', wire: 'call_id' },
|
|
134
|
+
roomId: { kind: 'string', wire: 'room_id' },
|
|
135
|
+
reason: { kind: 'enum', wire: 'reason', values: REASONS, fallback: 'error' },
|
|
136
|
+
/** 未接通恒为 0。**四端禁止自己算时长**(时钟偏移),一律用这个值。 */
|
|
137
|
+
durationSec: { kind: 'int', wire: 'duration_sec' },
|
|
138
|
+
/** 动作发起人 uid;服务端自行判定时为 ''。 */
|
|
139
|
+
endedBy: { kind: 'string', wire: 'ended_by' },
|
|
140
|
+
/**
|
|
141
|
+
* 这通电话是谁打的。
|
|
142
|
+
*
|
|
143
|
+
* **忙线那条不振铃**,被叫拿到的第一帧也是最后一帧就是它——没有这个字段就说不出
|
|
144
|
+
* 「谁来过电话」(协议 §4.2)。字段没登记在这里的话解码器会把它丢掉,
|
|
145
|
+
* `onCallMissed` 拿到的 caller 就是空串。
|
|
146
|
+
*/
|
|
147
|
+
caller: { kind: 'string', wire: 'caller' },
|
|
148
|
+
};
|
|
149
|
+
//# sourceMappingURL=frames.call.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"frames.call.js","sourceRoot":"","sources":["../../src/signaling/frames.call.ts"],"names":[],"mappings":"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"}
|