@softtynet/zca-js 2.3.4 → 2.3.6

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 (129) hide show
  1. package/README.md +47 -11
  2. package/dist/apis/call/addUserGroupCall.d.ts +11 -0
  3. package/dist/apis/call/addUserGroupCall.js +48 -0
  4. package/dist/apis/call/answerAckVoiceCall.d.ts +5 -0
  5. package/dist/apis/call/answerAckVoiceCall.js +38 -0
  6. package/dist/apis/call/answerGroupCall.d.ts +10 -0
  7. package/dist/apis/call/answerGroupCall.js +45 -0
  8. package/dist/apis/call/answerVoiceCall.d.ts +11 -0
  9. package/dist/apis/call/answerVoiceCall.js +50 -0
  10. package/dist/apis/call/broadcastGroupCallState.d.ts +10 -0
  11. package/dist/apis/call/broadcastGroupCallState.js +45 -0
  12. package/dist/apis/call/cancelGroupCall.d.ts +10 -0
  13. package/dist/apis/call/cancelGroupCall.js +45 -0
  14. package/dist/apis/call/cancelVoiceCall.d.ts +1 -1
  15. package/dist/apis/call/cancelVoiceCall.js +5 -1
  16. package/dist/apis/call/createController.d.ts +7 -0
  17. package/dist/apis/call/createController.js +9 -0
  18. package/dist/apis/call/createRtcSession.d.ts +8 -0
  19. package/dist/apis/call/createRtcSession.js +10 -0
  20. package/dist/apis/call/endGroupCall.d.ts +10 -0
  21. package/dist/apis/call/endGroupCall.js +45 -0
  22. package/dist/apis/call/finishGroupCall.d.ts +12 -0
  23. package/dist/apis/call/finishGroupCall.js +47 -0
  24. package/dist/apis/call/getGroupCallState.d.ts +3 -0
  25. package/dist/apis/call/getGroupCallState.js +38 -0
  26. package/dist/apis/call/holdVoiceCall.d.ts +5 -0
  27. package/dist/apis/call/holdVoiceCall.js +34 -0
  28. package/dist/apis/call/joinGroupCall.d.ts +11 -0
  29. package/dist/apis/call/joinGroupCall.js +46 -0
  30. package/dist/apis/call/logEndVoiceCall.d.ts +8 -0
  31. package/dist/apis/call/logEndVoiceCall.js +46 -0
  32. package/dist/apis/call/notifyGroupCall.d.ts +9 -0
  33. package/dist/apis/call/notifyGroupCall.js +44 -0
  34. package/dist/apis/call/pingGroupCall.d.ts +10 -0
  35. package/dist/apis/call/pingGroupCall.js +45 -0
  36. package/dist/apis/call/requestAudioToVideoCall.d.ts +5 -0
  37. package/dist/apis/call/requestAudioToVideoCall.js +37 -0
  38. package/dist/apis/call/requestGroupCall.d.ts +9 -0
  39. package/dist/apis/call/requestGroupCall.js +46 -0
  40. package/dist/apis/call/requestShareScreenCall.d.ts +5 -0
  41. package/dist/apis/call/requestShareScreenCall.js +37 -0
  42. package/dist/apis/call/requestVoiceCall.d.ts +10 -0
  43. package/dist/apis/call/requestVoiceCall.js +47 -0
  44. package/dist/apis/call/ringRingGroupCall.d.ts +10 -0
  45. package/dist/apis/call/ringRingGroupCall.js +45 -0
  46. package/dist/apis/call/ringRingVoiceCall.d.ts +5 -0
  47. package/dist/apis/call/ringRingVoiceCall.js +38 -0
  48. package/dist/apis/call/sendRequestGroupCall.d.ts +11 -0
  49. package/dist/apis/call/sendRequestGroupCall.js +48 -0
  50. package/dist/apis/call/sendRequestVoiceCall.d.ts +11 -0
  51. package/dist/apis/call/sendRequestVoiceCall.js +51 -0
  52. package/dist/apis/call/sendVoiceCall.d.ts +8 -1
  53. package/dist/apis/call/sendVoiceCall.js +10 -8
  54. package/dist/apis/call/shareScreenGroupCall.d.ts +10 -0
  55. package/dist/apis/call/shareScreenGroupCall.js +45 -0
  56. package/dist/apis/call/unholdVoiceCall.d.ts +5 -0
  57. package/dist/apis/call/unholdVoiceCall.js +34 -0
  58. package/dist/apis/call/updateCallMediaState.d.ts +7 -0
  59. package/dist/apis/call/updateCallMediaState.js +61 -0
  60. package/dist/apis/sync/downloadTransferSync.js +19 -1
  61. package/dist/apis.d.ts +81 -0
  62. package/dist/apis.js +135 -0
  63. package/dist/call-engine/ZRTPPacketCodec.d.ts +262 -0
  64. package/dist/call-engine/ZRTPPacketCodec.js +506 -0
  65. package/dist/call-engine/ZaloCallController.d.ts +134 -0
  66. package/dist/call-engine/ZaloCallController.js +638 -0
  67. package/dist/call-engine/ZaloCallTransport.d.ts +83 -0
  68. package/dist/call-engine/ZaloCallTransport.js +259 -0
  69. package/dist/call-engine/ZaloRtcSession.d.ts +609 -0
  70. package/dist/call-engine/ZaloRtcSession.js +2939 -0
  71. package/dist/call-engine/ZaloSrtpSession.d.ts +80 -0
  72. package/dist/call-engine/ZaloSrtpSession.js +278 -0
  73. package/dist/call-engine/index.d.ts +18 -0
  74. package/dist/call-engine/index.js +24 -0
  75. package/dist/cjs/apis/call/addUserGroupCall.cjs +53 -0
  76. package/dist/cjs/apis/call/answerAckVoiceCall.cjs +43 -0
  77. package/dist/cjs/apis/call/answerGroupCall.cjs +50 -0
  78. package/dist/cjs/apis/call/answerVoiceCall.cjs +55 -0
  79. package/dist/cjs/apis/call/broadcastGroupCallState.cjs +50 -0
  80. package/dist/cjs/apis/call/cancelGroupCall.cjs +50 -0
  81. package/dist/cjs/apis/call/cancelVoiceCall.cjs +5 -1
  82. package/dist/cjs/apis/call/createController.cjs +14 -0
  83. package/dist/cjs/apis/call/createRtcSession.cjs +15 -0
  84. package/dist/cjs/apis/call/endGroupCall.cjs +50 -0
  85. package/dist/cjs/apis/call/finishGroupCall.cjs +52 -0
  86. package/dist/cjs/apis/call/getGroupCallState.cjs +43 -0
  87. package/dist/cjs/apis/call/holdVoiceCall.cjs +39 -0
  88. package/dist/cjs/apis/call/joinGroupCall.cjs +51 -0
  89. package/dist/cjs/apis/call/logEndVoiceCall.cjs +51 -0
  90. package/dist/cjs/apis/call/notifyGroupCall.cjs +49 -0
  91. package/dist/cjs/apis/call/pingGroupCall.cjs +50 -0
  92. package/dist/cjs/apis/call/requestAudioToVideoCall.cjs +42 -0
  93. package/dist/cjs/apis/call/requestGroupCall.cjs +51 -0
  94. package/dist/cjs/apis/call/requestShareScreenCall.cjs +42 -0
  95. package/dist/cjs/apis/call/requestVoiceCall.cjs +52 -0
  96. package/dist/cjs/apis/call/ringRingGroupCall.cjs +50 -0
  97. package/dist/cjs/apis/call/ringRingVoiceCall.cjs +43 -0
  98. package/dist/cjs/apis/call/sendRequestGroupCall.cjs +53 -0
  99. package/dist/cjs/apis/call/sendRequestVoiceCall.cjs +56 -0
  100. package/dist/cjs/apis/call/sendVoiceCall.cjs +10 -8
  101. package/dist/cjs/apis/call/shareScreenGroupCall.cjs +50 -0
  102. package/dist/cjs/apis/call/unholdVoiceCall.cjs +39 -0
  103. package/dist/cjs/apis/call/updateCallMediaState.cjs +66 -0
  104. package/dist/cjs/apis/sync/downloadTransferSync.cjs +19 -1
  105. package/dist/cjs/apis.cjs +135 -0
  106. package/dist/cjs/call-engine/ZRTPPacketCodec.cjs +525 -0
  107. package/dist/cjs/call-engine/ZaloCallController.cjs +643 -0
  108. package/dist/cjs/call-engine/ZaloCallTransport.cjs +265 -0
  109. package/dist/cjs/call-engine/ZaloRtcSession.cjs +2945 -0
  110. package/dist/cjs/call-engine/ZaloSrtpSession.cjs +287 -0
  111. package/dist/cjs/constants/protocol.cjs +1 -1
  112. package/dist/cjs/crypto/aes.cjs +3 -1
  113. package/dist/cjs/crypto/zdb-cipher.cjs +10 -3
  114. package/dist/cjs/index.cjs +61 -11
  115. package/dist/cjs/models/CallEvent.cjs +95 -1
  116. package/dist/cjs/realtime/handlers/control.handler.cjs +17 -3
  117. package/dist/cjs/realtime/listener.cjs +19 -0
  118. package/dist/constants/protocol.d.ts +1 -1
  119. package/dist/constants/protocol.js +1 -1
  120. package/dist/crypto/aes.js +3 -1
  121. package/dist/crypto/zdb-cipher.js +10 -3
  122. package/dist/index.d.ts +32 -4
  123. package/dist/index.js +2 -0
  124. package/dist/models/CallEvent.d.ts +15 -0
  125. package/dist/models/CallEvent.js +95 -1
  126. package/dist/realtime/handlers/control.handler.js +17 -3
  127. package/dist/realtime/listener.d.ts +5 -0
  128. package/dist/realtime/listener.js +19 -0
  129. package/package.json +2 -1
@@ -0,0 +1,609 @@
1
+ import EventEmitter from "node:events";
2
+ import { Buffer } from "node:buffer";
3
+ import type { API } from "../apis.js";
4
+ import { CallType, type RequestCallServerInfo } from "../apis/call/sendVoiceCall.js";
5
+ import { type CallEvent } from "../models/CallEvent.js";
6
+ import { type ParsedZRTPPacket, type ZRTPControlPacket } from "./ZRTPPacketCodec.js";
7
+ import { ZaloSrtpSession, type ParsedRtpPacket, type SrtpCryptoSuite } from "./ZaloSrtpSession.js";
8
+ export type ZaloRtcSessionState = "idle" | "allocating" | "handshaking_udp" | "ringing" | "active" | "ended" | "error";
9
+ export type ZaloMobileDirectHandoffBundle = {
10
+ callId: number;
11
+ sessId: string;
12
+ isCaller: boolean;
13
+ partnerId: string;
14
+ fromUid32: number;
15
+ toUid32: number;
16
+ callType: CallType;
17
+ rtpHost: string;
18
+ rtpPort: number;
19
+ rtcpHost: string;
20
+ rtcpPort: number;
21
+ packetMode: 1 | 2;
22
+ routingToken: number;
23
+ codec: string;
24
+ srtpMasterKeyBase64?: string;
25
+ zrtpKey?: string;
26
+ /**
27
+ * Gói UDP `InitCall` (`0x01 0x7e`, `cmd=11` cho Caller hoặc `cmd=12` cho Callee) mã hoá sẵn dạng hex.
28
+ * Mobile gửi gói này đầu tiên tới `rtpHost:rtpPort` để đăng ký NAT trực tiếp với Relay Server
29
+ * và nhận phản hồi `0x02 0x7e` (chứa `routingToken` Int32LE tại byte `17..20`).
30
+ */
31
+ initCallPacketHex: string;
32
+ /**
33
+ * Gói UDP `RelayPing` (`0x01 0x7e`, `cmd=2`) kèm `sessId` mã hoá sẵn dạng hex (Mobile gửi mỗi 1000ms tới `rtpHost:rtpPort`).
34
+ */
35
+ relayPingPacketHex: string;
36
+ /**
37
+ * Gói UDP `Ping` (`0x01 0x7e`, `cmd=5`) giữ NAT mã hoá sẵn dạng hex (Mobile gửi mỗi 1000ms tới `rtpHost:rtpPort`).
38
+ */
39
+ pingPacketHex: string;
40
+ /**
41
+ * Gói UDP `RequestForward ManualControl` (`0x01 0x7e`, `cmd=32, subCmd=10`, 20-byte payload) báo FPS/PacketRate định kỳ mỗi 1000ms.
42
+ */
43
+ manualControlPacketHex: string;
44
+ /**
45
+ * Gói UDP `RequestForward OnCamera` (`0x01 0x7e`, `cmd=32, subCmd=7`) báo bật Camera.
46
+ */
47
+ cameraOnPacketHex: string;
48
+ /**
49
+ * Gói UDP `RequestForward OffCamera` (`0x01 0x7e`, `cmd=32, subCmd=8`) báo tắt Camera.
50
+ */
51
+ cameraOffPacketHex: string;
52
+ /**
53
+ * Gói UDP `RequestEndCall` (`0x01 0x7e`, `cmd=3`, 25 bytes) gửi 3 lần khi kết thúc cuộc gọi.
54
+ */
55
+ endCallPacketHex: string;
56
+ /**
57
+ * Tiền tố 5-byte (Relay mode `1`: `[type(1B)][routingToken(4B LE)]`) hoặc 9-byte (P2P mode `2`)
58
+ * để Mobile ghép trực tiếp vào trước mỗi gói RTP/RTCP khi gửi/nhận qua UDP.
59
+ */
60
+ audioRtpPrefixHex: string;
61
+ audioRtcpPrefixHex: string;
62
+ videoRtpPrefixHex: string;
63
+ videoRtcpPrefixHex: string;
64
+ };
65
+ export type ParsedIncomingCallInfo = {
66
+ callId: number;
67
+ callerId: string;
68
+ callerName: string;
69
+ callerAvatar: string;
70
+ fromUid32: number;
71
+ toUid32: number;
72
+ sessId: string;
73
+ callType: CallType;
74
+ isVideo: boolean;
75
+ isGroupCall: boolean;
76
+ groupId: string;
77
+ groupName: string;
78
+ groupAvatar: string;
79
+ hostCall: string;
80
+ partners: string[];
81
+ rtpAddress: string;
82
+ rtpHost: string;
83
+ rtpPort: number;
84
+ rtcpAddress: string;
85
+ rtcpHost: string;
86
+ rtcpPort: number;
87
+ codec: string;
88
+ srtpKey?: string;
89
+ srtpMode?: number;
90
+ zrtpKey?: string;
91
+ extendData: Record<string, unknown>;
92
+ rawEvent: CallEvent | Record<string, unknown>;
93
+ };
94
+ export type ZaloCallConnectionParams = {
95
+ callId: number;
96
+ sessId: string;
97
+ isCaller: boolean;
98
+ partnerId: string;
99
+ fromId: number;
100
+ toId: number;
101
+ callType: CallType;
102
+ rtpAddress: string;
103
+ rtpHost: string;
104
+ rtpPort: number;
105
+ rtcpAddress: string;
106
+ rtcpHost: string;
107
+ rtcpPort: number;
108
+ routingToken: number;
109
+ udpHandshakeVerified: boolean;
110
+ localUdpPort: number;
111
+ packetMode: 1 | 2;
112
+ codec: string;
113
+ extendData: Record<string, unknown>;
114
+ zrtpKey?: string;
115
+ srtpMasterKeyBase64?: string;
116
+ audioZrtcHeaderHex: string;
117
+ videoZrtcHeaderHex: string;
118
+ serverInfo?: RequestCallServerInfo;
119
+ mobileDirectHandoff: ZaloMobileDirectHandoffBundle;
120
+ };
121
+ export type ZaloRtcSessionOptions = {
122
+ /**
123
+ * Chế độ đóng gói gói tin Media UDP:
124
+ * - `1` (Mặc định cho Relay Server): 5-byte Relay header (`0x03` Audio RTP, `0x05` Audio RTCP, `0x0d` Video RTP, `0x0f` Video RTCP)
125
+ * - `2` (Dành riêng cho kết nối P2P trực tiếp): ZRTC Multiplexed 9-byte header (`0x7f 0x00 ...`)
126
+ */
127
+ packetMode?: 1 | 2;
128
+ /**
129
+ * Tự động gửi gói âm thanh Opus im lặng 20ms (khi không có audio ngoài) và báo cáo RTCP SR/RR định kỳ
130
+ * để duy trì luồng RTP/RTCP ổn định (tránh cảnh báo "Kết nối không ổn định" sau 3-4 giây). Mặc định `true`.
131
+ */
132
+ autoKeepaliveMedia?: boolean;
133
+ /**
134
+ * Chế độ chỉ xử lý Signaling trên Worker (`true` = KHÔNG mở socket UDP và KHÔNG gửi Ping/Media từ Worker,
135
+ * để ứng dụng Mobile tự kết nối UDP trực tiếp tới `rtpHost:rtpPort` bằng `mobileDirectHandoff`). Mặc định `false`.
136
+ */
137
+ signalingOnly?: boolean;
138
+ /**
139
+ * Bật mã hoá SRTP (RFC 3711 `AES_CM_128_HMAC_SHA1_80`) cho luồng RTP/RTCP.
140
+ */
141
+ enableSrtp?: boolean;
142
+ srtpSuite?: SrtpCryptoSuite;
143
+ srtpMasterKeyBase64?: string;
144
+ /**
145
+ * Thời gian chờ phản hồi UDP `0x02 0x7e` tối đa (mặc định `1500` ms).
146
+ * Nếu server UDP chưa phản hồi kịp hoặc chạy trong môi trường test giả lập HTTP,
147
+ * phiên sẽ tự động tiếp tục với `routingToken` dự phòng từ `callId`.
148
+ */
149
+ udpHandshakeTimeoutMs?: number;
150
+ /**
151
+ * Chu kỳ gửi gói tin UDP `Ping` (`cmd=2`, `cmd=5`, `cmd=32`) giữ kết nối NAT/Relay (mặc định `1000` ms).
152
+ */
153
+ pingIntervalMs?: number;
154
+ /**
155
+ * Tự động lắng nghe sự kiện `call_event` từ `api.listener` để cập nhật trạng thái cuộc gọi.
156
+ */
157
+ autoAttachListener?: boolean;
158
+ /**
159
+ * Cổng UDP nội bộ muốn bind (mặc định `0` để OS tự cấp phát).
160
+ */
161
+ localUdpPort?: number;
162
+ /**
163
+ * Thời gian chờ đổ chuông tối đa cho cuộc gọi đi trước khi tự động huỷ (`cancelVoiceCall`)
164
+ * để giải phóng tài nguyên UDP socket (mặc định `60000` ms = 60 giây, đặt `0` để tắt).
165
+ */
166
+ ringingTimeoutMs?: number;
167
+ };
168
+ export type StartOutgoingCallOptions = {
169
+ callType?: CallType;
170
+ callId?: number;
171
+ codec?: string;
172
+ skipUdpHandshake?: boolean;
173
+ /**
174
+ * Chỉ thực hiện Signaling HTTP/WebSocket trên Worker mà không mở UDP socket tại Worker,
175
+ * trả về `mobileDirectHandoff` để Mobile App tự kết nối UDP trực tiếp tới Relay Server.
176
+ */
177
+ signalingOnly?: boolean;
178
+ /**
179
+ * Bắt đầu cuộc gọi với Camera tắt (`offCameraAtStart`), nhưng vẫn khởi tạo sẵn kênh Video RTP/RTCP
180
+ * để có thể bật Camera / chuyển lên Video tức thì giữa cuộc gọi.
181
+ */
182
+ offCameraAtStart?: boolean;
183
+ /**
184
+ * Khởi tạo sẵn đường truyền Video RTP/RTCP (`extendData.callType = 1` + `OffCamera` ban đầu)
185
+ * ngay cả khi gọi Thoại (`CallType.Audio = 1`) để cho phép nâng cấp Thoại ➔ Video mượt mà giữa cuộc gọi
186
+ * trên ứng dụng Zalo Mobile (`zrtc::Peer::initialize` @ `0x100199de0`). Mặc định `true`.
187
+ */
188
+ allowVideoUpgrade?: boolean;
189
+ };
190
+ export type AcceptIncomingCallOptions = {
191
+ codec?: string;
192
+ skipUdpHandshake?: boolean;
193
+ signalingOnly?: boolean;
194
+ allowVideoUpgrade?: boolean;
195
+ offCameraAtStart?: boolean;
196
+ /**
197
+ * Nếu `true`, bỏ qua bước gọi lại `ringRingVoiceCall` (khi trước đó đã gọi `ringIncomingCall`).
198
+ */
199
+ skipRingRing?: boolean;
200
+ /**
201
+ * Nếu `true`, bỏ qua bước gửi tín hiệu HTTP `answerVoiceCall` / `answerGroupCall` (dùng khi đã gửi riêng hoặc khi giả lập local).
202
+ */
203
+ skipAnswerSignal?: boolean;
204
+ };
205
+ export type RejectIncomingCallOptions = {
206
+ status?: number;
207
+ };
208
+ export type StartGroupCallOptions = {
209
+ partners: string[];
210
+ callType?: CallType;
211
+ callId?: number;
212
+ codec?: string;
213
+ skipUdpHandshake?: boolean;
214
+ signalingOnly?: boolean;
215
+ offCameraAtStart?: boolean;
216
+ };
217
+ export type JoinGroupCallSessionOptions = {
218
+ hostCall: string;
219
+ groupId?: string;
220
+ partners?: string[];
221
+ callType?: CallType;
222
+ rtpAddress?: string;
223
+ rtcpAddress?: string;
224
+ session?: string;
225
+ skipUdpHandshake?: boolean;
226
+ signalingOnly?: boolean;
227
+ };
228
+ export type ZaloCallMediaStateEvent = {
229
+ isLocal: boolean;
230
+ isCameraOn?: boolean;
231
+ isMicMuted?: boolean;
232
+ isHold?: boolean;
233
+ isScreenSharing?: boolean;
234
+ callType?: CallType;
235
+ rawAct?: string;
236
+ reason?: number;
237
+ };
238
+ export type IncomingRtpEvent = {
239
+ isVideo: boolean;
240
+ isFec: boolean;
241
+ rtpPacket: Buffer;
242
+ parsedRtp: ParsedRtpPacket;
243
+ zrtpPacket: ParsedZRTPPacket;
244
+ };
245
+ export type IncomingAudioFrameEvent = {
246
+ payload: Buffer;
247
+ sequenceNumber: number;
248
+ timestamp: number;
249
+ ssrc: number;
250
+ payloadType: number;
251
+ marker: boolean;
252
+ };
253
+ export type IncomingVideoFrameEvent = {
254
+ payload: Buffer;
255
+ sequenceNumber: number;
256
+ timestamp: number;
257
+ ssrc: number;
258
+ payloadType: number;
259
+ marker: boolean;
260
+ };
261
+ export type IncomingVideoAnnexBFrameEvent = {
262
+ annexB: Buffer;
263
+ isKeyframe: boolean;
264
+ timestamp: number;
265
+ ssrc: number;
266
+ sps?: Buffer;
267
+ pps?: Buffer;
268
+ nalTypes?: number[];
269
+ };
270
+ export type IncomingRtcpEvent = {
271
+ isVideo: boolean;
272
+ rtcpPacket: Buffer;
273
+ zrtpPacket: ParsedZRTPPacket;
274
+ };
275
+ export interface ZaloRtcSessionEvents {
276
+ state: [state: ZaloRtcSessionState];
277
+ connection_params: [params: ZaloCallConnectionParams];
278
+ active: [params: ZaloCallConnectionParams];
279
+ incoming_call: [info: ParsedIncomingCallInfo];
280
+ media_state_change: [state: ZaloCallMediaStateEvent];
281
+ zrtp_control: [packet: ZRTPControlPacket];
282
+ zrtp_packet: [packet: ParsedZRTPPacket];
283
+ rtp_packet: [event: IncomingRtpEvent];
284
+ audio_frame: [frame: IncomingAudioFrameEvent];
285
+ video_frame: [frame: IncomingVideoFrameEvent];
286
+ video_annexb_frame: [frame: IncomingVideoAnnexBFrameEvent];
287
+ rtcp_packet: [event: IncomingRtcpEvent];
288
+ call_event: [event: CallEvent];
289
+ ended: [reason: string];
290
+ error: [error: unknown];
291
+ }
292
+ /**
293
+ * Giải mã chuẩn xác sự kiện cuộc gọi đến (`act: "request"` 1-1 hoặc `act: "group_request"` Nhóm)
294
+ * khớp 100% với `zrtc_call::ZMessageDeserializer::_parseActRequest` (`0x10001c824`),
295
+ * `_parseActRequestDetail` (`0x10001dfa0`), `_parseActRequestGroup` (`0x10001ffc4`) và
296
+ * `ZCallInfo::_prepareCallConfig` (`0x1000cd588`).
297
+ */
298
+ export declare function parseIncomingCallEvent(callEvent: CallEvent | Record<string, unknown>, localUid?: string | number): ParsedIncomingCallInfo;
299
+ /**
300
+ * Bộ máy xử lý phiên gọi Thoại & Video thuần TypeScript / Node.js (`node:dgram` UDP + `ZRTPPacket` + `SRTP`).
301
+ *
302
+ * Hoạt động độc lập 100% trên Worker, Linux Server, Docker, hoặc Desktop mà **không cần cài đặt Zalo PC**:
303
+ * - Thực hiện trọn vẹn luồng Signaling 401 -> Bắt tay UDP `0x01 0x7e` (`cmd=11/12`) -> Nhận `routingToken` -> Signaling 416 / 402 -> Duy trì UDP Ping (`cmd=2/5/32`) & RTCP SR/RR.
304
+ * - Hỗ trợ chế độ **Direct Mobile Media Handoff** (`signalingOnly: true` / `handoffUdpToExternal()`): Worker chỉ tạo/nhận cuộc gọi qua HTTPS/WebSocket rồi trả gói `mobileDirectHandoff` cho Mobile App tự kết nối UDP trực tiếp tới máy chủ Relay của Zalo mà không cần đi qua trung gian.
305
+ * - Hỗ trợ đầy đủ cả **Chiều gọi đi (Outgoing)** lẫn **Chiều gọi đến (Incoming 1-1 & Nhóm)**: giải mã chuẩn `act: "request"` / `"group_request"`, báo đổ chuông (`ringIncomingCall`), bắt máy (`acceptIncomingCall` / `acceptIncomingGroupCall`), và từ chối (`rejectIncomingCall`).
306
+ */
307
+ export declare class ZaloRtcSession extends EventEmitter<ZaloRtcSessionEvents> {
308
+ private readonly api;
309
+ private state;
310
+ private udpSocket;
311
+ private pingTimer;
312
+ private groupPingTimer;
313
+ private audioKeepaliveTimer;
314
+ private videoKeepaliveTimer;
315
+ private rtcpTimer;
316
+ private ringingTimeoutTimer;
317
+ private startedAtMs;
318
+ private activeStartedAtMs;
319
+ private callId;
320
+ private sessId;
321
+ private isCaller;
322
+ private partnerId;
323
+ private groupId;
324
+ private groupPartners;
325
+ private fromUid32;
326
+ private toUid32;
327
+ private callType;
328
+ private isCameraOn;
329
+ private isMicMuted;
330
+ private isHold;
331
+ private isScreenSharing;
332
+ private rtpEndpoint;
333
+ private rtcpEndpoint;
334
+ private routingToken;
335
+ private udpHandshakeVerified;
336
+ private hasReceivedPartnerMedia;
337
+ private hasSentAnswerAck;
338
+ private localUdpPort;
339
+ private zrtpKey?;
340
+ private codec;
341
+ private extendData;
342
+ private serverInfo?;
343
+ private controlSeq;
344
+ private forwardPingSeq;
345
+ private manualControlSeq;
346
+ private audioSeq;
347
+ private audioTimestamp;
348
+ private readonly audioSsrc;
349
+ private audioPacketCount;
350
+ private audioOctetCount;
351
+ private lastExternalAudioSentAtMs;
352
+ private videoSeq;
353
+ private videoTimestamp;
354
+ private readonly videoSsrc;
355
+ private videoPacketCount;
356
+ private videoOctetCount;
357
+ private lastExternalVideoSentAtMs;
358
+ private remoteAudioSsrc;
359
+ private remoteAudioMaxSeq;
360
+ private remoteAudioSeqCycles;
361
+ private lastRemoteAudioSrMiddleNtp;
362
+ private lastRemoteAudioSrReceivedAtMs;
363
+ private remoteVideoSsrc;
364
+ private remoteVideoMaxSeq;
365
+ private remoteVideoSeqCycles;
366
+ private lastRemoteVideoSrMiddleNtp;
367
+ private lastRemoteVideoSrReceivedAtMs;
368
+ private localSpsNal;
369
+ private localPpsNal;
370
+ private remoteSpsNal;
371
+ private remotePpsNal;
372
+ private fuaFragments;
373
+ private currentAccessUnitNals;
374
+ private currentAccessUnitTs;
375
+ private currentAccessUnitHasIdr;
376
+ private srtpSession;
377
+ private readonly options;
378
+ private boundCallEventListener?;
379
+ constructor(api: API, options?: ZaloRtcSessionOptions);
380
+ getState(): ZaloRtcSessionState;
381
+ getSrtpSession(): ZaloSrtpSession | null;
382
+ getCallDurationSeconds(): number;
383
+ getMediaState(): {
384
+ callId: number;
385
+ callType: CallType;
386
+ isCameraOn: boolean;
387
+ isMicMuted: boolean;
388
+ isHold: boolean;
389
+ isScreenSharing: boolean;
390
+ durationSeconds: number;
391
+ groupId: string;
392
+ groupPartners: string[];
393
+ };
394
+ private getLocalAudioSsrc;
395
+ private getLocalVideoSsrc;
396
+ /**
397
+ * Tạo bộ thông số + các gói tin nhị phân `ZRTPPacket` đã đóng gói sẵn dạng hex
398
+ * để ứng dụng Mobile có thể mở socket UDP kết nối **trực tiếp** tới máy chủ Relay của Zalo (`rtpHost:rtpPort`)
399
+ * mà không cần đẩy luồng dữ liệu âm thanh/hình ảnh qua Worker trung gian.
400
+ */
401
+ getMobileDirectHandoffBundle(routingTokenOverride?: number): ZaloMobileDirectHandoffBundle;
402
+ /**
403
+ * Đặt lại toàn bộ trạng thái định tuyến UDP, bộ đếm RTP/RTCP, bộ đệm giải mã H.264 FU-A/SPS/PPS
404
+ * và khóa SRTP trước khi bắt đầu hoặc chấp nhận một cuộc gọi mới trên cùng một instance `ZaloRtcSession`.
405
+ */
406
+ private resetSessionStateForNewCall;
407
+ private clearIncomingVideoAssemblyBuffers;
408
+ /**
409
+ * Tái kích hoạt (Re-activate / Re-bind) kết nối UDP và luồng Media/RTCP cho phiên gọi hiện tại:
410
+ * - Dùng khi chuyển vùng mạng (Wi-Fi <-> 4G/5G), khi socket UDP bị gián đoạn, hoặc khi muốn thu hồi lại
411
+ * quyền xử lý UDP từ Mobile về lại Worker/Desktop sau khi đã gọi `signalingOnly` / `handoffUdpToExternal()`.
412
+ * - Tự động mở cổng UDP mới, gửi lại gói bắt tay `0x01 0x7e` (`cmd=11` Caller hoặc `cmd=12` Callee),
413
+ * khởi động lại vòng lặp UDP Ping + Media Keepalive + RTCP SR/RR, đồng bộ lại trạng thái Mic/Camera
414
+ * và bắn `RTCP PLI` để khôi phục hình ảnh H.264 ngay lập tức.
415
+ */
416
+ reconnectUdp(options?: {
417
+ skipUdpHandshake?: boolean;
418
+ }): Promise<ZaloCallConnectionParams>;
419
+ /**
420
+ * Ngắt toàn bộ socket UDP và các vòng lặp Ping/Media cục bộ trên Worker
421
+ * (nhưng vẫn giữ nguyên kết nối Signaling WebSocket để lắng nghe `answer`, `end`, `cancel`, `audio_to_video`),
422
+ * nhằm bàn giao hoàn toàn kênh UDP cho ứng dụng Mobile kết nối trực tiếp tới máy chủ Relay Zalo
423
+ * mà không bị xung đột NAT (NAT flip-flopping).
424
+ */
425
+ handoffUdpToExternal(routingTokenOverride?: number): ZaloMobileDirectHandoffBundle;
426
+ /**
427
+ * Xuất toàn bộ thông số kết nối cuộc gọi & UDP `ZRTPPacket` sau khi thương lượng xong
428
+ * để truyền về Mobile App hoặc Media Bridge.
429
+ */
430
+ getConnectionParams(): ZaloCallConnectionParams;
431
+ /**
432
+ * Khởi tạo cuộc gọi đi (Caller) 1-1 hoàn chỉnh:
433
+ * 1. Gọi `/api/voicecall/requestcall` (401) lấy `sessId`, `rtpaddr`, `rtcpaddr`, `zrtpKey`
434
+ * 2. Mở socket UDP và gửi gói bắt tay `0x01 0x7e` (`cmd=11`) tới `rtpaddr` để nhận `routingToken` (bỏ qua nếu `signalingOnly: true`)
435
+ * 3. Gọi `/api/voicecall/request` (416) kèm codec Opus chuẩn và `extendData` để máy đối phương đổ chuông
436
+ * 4. Duy trì nhịp tim UDP Ping (`0x01 0x7e`, `cmd=2/5/32`) và sẵn sàng truyền/nhận RTP/SRTP (nếu không bật `signalingOnly`)
437
+ */
438
+ startOutgoingCall(calleeId: string, options?: StartOutgoingCallOptions): Promise<ZaloCallConnectionParams>;
439
+ /**
440
+ * Giải mã sự kiện cuộc gọi đến (`act: "request"` hoặc `"group_request"`) và gửi ngay tín hiệu
441
+ * báo máy đang đổ chuông (`ringRingVoiceCall` `11302` / `ringRingGroupCall` `12439`) tới phía người gọi,
442
+ * đồng thời chuyển phiên sang trạng thái `"ringing"` trong khi chờ người dùng bấm Nghe máy hoặc Từ chối.
443
+ * Khớp với `zrtc_call::ZCallInfo::receiveIncomingCall` (`0x1000ccbbc`).
444
+ */
445
+ ringIncomingCall(callEvent: CallEvent | Record<string, unknown>): Promise<ParsedIncomingCallInfo>;
446
+ /**
447
+ * Chấp nhận cuộc gọi đến (Callee) từ sự kiện `call_event` (`act: "request"` hoặc `"group_request"`):
448
+ * - Tự động giải mã chuẩn xác `params.id` (`callId`), `uidN` (`callerId`), `uidFrom` (`toUid32`), `uidTo` (`fromUid32`), `rtpIP`/`rtcpIP`/`servers`
449
+ * - Nếu là cuộc gọi Nhóm (`isGroupCall`), tự động uỷ quyền sang `acceptIncomingGroupCall`
450
+ * - Với cuộc gọi 1-1:
451
+ * 1. Gửi `/api/voicecall/ringring` (407) (nếu chưa gửi)
452
+ * 2. Nếu sự kiện thiếu địa chỉ Relay UDP, tự động gọi dự phòng `requestVoiceCall` (401) như `_trySendAcceptSignal` (`0x1000c2c9c`)
453
+ * 3. Mở socket UDP và gửi gói bắt tay `0x01 0x7e` (`cmd=12`) tới `rtpaddr` (bỏ qua nếu `signalingOnly: true`)
454
+ * 4. Gửi `/api/voicecall/answer` (402) để kết nối âm thanh/hình ảnh 2 chiều
455
+ */
456
+ acceptIncomingCall(callEvent: CallEvent | Record<string, unknown>, options?: AcceptIncomingCallOptions): Promise<ZaloCallConnectionParams>;
457
+ /**
458
+ * Từ chối cuộc gọi đến (1-1 hoặc Nhóm) từ sự kiện `call_event` (`act: "request"` / `"group_request"`):
459
+ * - Với 1-1: gọi `/api/voicecall/cancel` (`11305`) và `/api/voicecall/endcall` (`11306`)
460
+ * - Với Nhóm: gọi `/api/voicecall/group/cancel` (`12437`) và `/api/voicecall/group/endcall` (`12438`)
461
+ */
462
+ rejectIncomingCall(callEvent: CallEvent | Record<string, unknown>, options?: RejectIncomingCallOptions): Promise<void>;
463
+ /**
464
+ * Chấp nhận lời mời gọi Nhóm đến từ sự kiện `call_event` (`act: "group_request"`):
465
+ * 1. Gửi `/api/voicecall/group/ringring` (`12439`, signal `506`)
466
+ * 2. Mở socket UDP và bắt tay `InitCallCallee` (`0x01 0x7e`, `cmd=12`) (bỏ qua nếu `signalingOnly: true`)
467
+ * 3. Gửi `/api/voicecall/group/answer` (`12436`, signal `503`)
468
+ */
469
+ acceptIncomingGroupCall(callEvent: CallEvent | Record<string, unknown>, options?: AcceptIncomingCallOptions): Promise<ZaloCallConnectionParams>;
470
+ /**
471
+ * Khởi tạo cuộc gọi nhóm (Group Audio `CallType.GroupAudio = 5` hoặc Group Video `CallType.GroupVideo = 6`):
472
+ * 1. Gọi `/api/voicecall/group/requestcall` (501) xin cấp phát máy chủ Relay UDP
473
+ * 2. Mở socket UDP và bắt tay `0x01 0x7e` (`cmd=11`) (bỏ qua nếu `signalingOnly: true`)
474
+ * 3. Gọi `/api/voicecall/group/request` (513) mời danh sách `partners` tham gia
475
+ * 4. Duy trì nhịp tim UDP + `/api/voicecall/group/ping` (509) và luồng RTP/RTCP
476
+ */
477
+ startGroupCall(groupId: string, options: StartGroupCallOptions): Promise<ZaloCallConnectionParams>;
478
+ /**
479
+ * Tham gia cuộc gọi nhóm đang diễn ra (`/api/voicecall/group/join`, command `12043`).
480
+ */
481
+ joinActiveGroupCall(callId: number, options: JoinGroupCallSessionOptions): Promise<ZaloCallConnectionParams>;
482
+ /**
483
+ * Mời thêm thành viên vào cuộc gọi nhóm đang diễn ra (`/api/voicecall/group/adduser`, command `12435`).
484
+ */
485
+ addMembersToGroupCall(partners: string[]): Promise<Record<string, unknown>>;
486
+ /**
487
+ * Bật / tắt Camera trong cuộc gọi Video (đồng bộ cả gói UDP `cmd=32, subCmd=7/8` và HTTP `/api/voicecall/conf` hoặc `/api/voicecall/group/broadcast`).
488
+ */
489
+ setCameraEnabled(enabled: boolean): Promise<void>;
490
+ /**
491
+ * Bật / tắt Microphone trong cuộc gọi (đồng bộ cả gói UDP `cmd=32, subCmd=5/6` và HTTP `/api/voicecall/conf` hoặc `/api/voicecall/group/broadcast`).
492
+ */
493
+ setMicMuted(muted: boolean): Promise<void>;
494
+ /**
495
+ * Tạm giữ (`hold`) hoặc tiếp tục (`unhold`) cuộc gọi 1-1 (`/api/voicecall/holdreq` & `/api/voicecall/unholdreq`).
496
+ */
497
+ setHoldState(isHold: boolean, isResponse?: boolean): Promise<void>;
498
+ /**
499
+ * Bật / tắt chia sẻ màn hình trong cuộc gọi 1-1 (`/api/voicecall/requestsharescreen`, command `12064`)
500
+ * hoặc cuộc gọi Nhóm (`/api/voicecall/group/sharescreen`, command `12044`).
501
+ */
502
+ setScreenShareEnabled(enabled: boolean): Promise<void>;
503
+ /**
504
+ * Chuyển đổi cuộc gọi Thoại (Audio) đang diễn ra lên cuộc gọi Video (`/api/voicecall/requestaudio2video`, command `12056`):
505
+ * - `status = 1`: Gửi yêu cầu bật Video
506
+ * - `status = 2`: Đồng ý yêu cầu bật Video từ đối phương
507
+ * Tự động kích hoạt luồng Video RTP/RTCP, tín hiệu UDP `OnCamera` (`cmd=32, subCmd=7`) & HTTP `/api/voicecall/conf` (`isOnCam=1, isOnMic=-1`) ngay lập tức.
508
+ */
509
+ upgradeAudioToVideoCall(status?: 1 | 2): Promise<void>;
510
+ /**
511
+ * Gửi trực tiếp một khung âm thanh Opus (mặc định 20ms @ 16kHz = 320 samples)
512
+ * qua đường truyền UDP của cuộc gọi.
513
+ * Tự động đóng gói RTP 12-byte header -> (Tuỳ chọn) Mã hoá SRTP -> Bọc `ZRTPPacket` header.
514
+ */
515
+ sendAudioFrame(opusPayload: Buffer, options?: {
516
+ payloadType?: number;
517
+ samples?: number;
518
+ marker?: boolean;
519
+ sequenceNumber?: number;
520
+ timestamp?: number;
521
+ ssrc?: number;
522
+ isKeepalive?: boolean;
523
+ }): Promise<void>;
524
+ /**
525
+ * Gửi một gói tin chuẩn WebRTC RTP (Audio) qua đường truyền UDP Zalo.
526
+ */
527
+ sendAudioRtp(rtpPacket: Buffer): Promise<void>;
528
+ /**
529
+ * Gửi trực tiếp một khung hình ảnh H.264 NAL / RTP payload (mặc định 90kHz clock, payloadType=97)
530
+ * qua đường truyền UDP của cuộc gọi Video.
531
+ */
532
+ sendVideoFrame(h264Payload: Buffer, options?: {
533
+ payloadType?: number;
534
+ timestampStep?: number;
535
+ marker?: boolean;
536
+ sequenceNumber?: number;
537
+ timestamp?: number;
538
+ ssrc?: number;
539
+ isKeepalive?: boolean;
540
+ }): Promise<void>;
541
+ /**
542
+ * Đóng gói một khung hình H.264 dạng Annex-B (`00 00 00 01 <NAL>`) theo chuẩn RFC 6184:
543
+ * - Tự động tách các NAL unit, lưu cache SPS (`type=7`) / PPS (`type=8`) và đóng gói STAP-A (`0x78`) trước IDR (`type=5`)
544
+ * - Không cho phép khung keepalive 16x16 ghi đè `localSpsNal` / `localPpsNal` của camera thực
545
+ * - Tự động phân mảnh các NAL lớn (> 1150 bytes) thành các gói RTP **FU-A (`type=28`)** cùng `timestamp` 90kHz
546
+ * - Đặt cờ `marker = true` ở gói RTP cuối cùng của khung hình để bộ giải mã đối phương hiển thị ngay.
547
+ */
548
+ sendH264AnnexBFrame(annexB: Buffer, options?: {
549
+ payloadType?: number;
550
+ timestampStep?: number;
551
+ timestamp?: number;
552
+ ssrc?: number;
553
+ isKeepalive?: boolean;
554
+ }): Promise<void>;
555
+ /**
556
+ * Gửi tín hiệu bật/tắt Camera (`cmd = 32, subCmd = 7` `OnCamera` / `subCmd = 8` `OffCamera`)
557
+ * khớp với `CallController::vidSendSignalOffCamera` (`0x10016fbe4`).
558
+ * Phát lặp 3 lần (0ms, 60ms, 150ms) để chống mất gói UDP.
559
+ */
560
+ sendCameraState(isCameraOn: boolean, reason?: number): Promise<void>;
561
+ /**
562
+ * Gửi tín hiệu bật/tắt Microphone (`cmd = 32, subCmd = 5` `OnMic` / `subCmd = 6` `OffMic`)
563
+ * qua máy chủ Relay UDP.
564
+ */
565
+ sendMicState(isMicOn: boolean): Promise<void>;
566
+ /**
567
+ * Gửi gói RTCP PLI (Picture Loss Indication — `PT=206, FMT=1`) yêu cầu máy đối phương
568
+ * gửi ngay khung hình khoá H.264 IDR kèm SPS/PPS.
569
+ */
570
+ sendRtcpPli(): Promise<void>;
571
+ /**
572
+ * Gửi một gói tin chuẩn WebRTC RTP (Video H.264) qua đường truyền UDP Zalo.
573
+ */
574
+ sendVideoRtp(rtpPacket: Buffer): Promise<void>;
575
+ /**
576
+ * Gửi gói tin điều khiển chất lượng RTCP (Audio hoặc Video) qua đường truyền UDP Zalo.
577
+ */
578
+ sendRtcp(rtcpPacket: Buffer, isVideo?: boolean): Promise<void>;
579
+ /**
580
+ * Kết thúc cuộc gọi hiện tại:
581
+ * 1. Gửi gói UDP `RequestEndCall` (`0x01 0x7e`, `cmd=3`, 25 bytes) 3 lần tới máy chủ Relay (`_sendRequestZRTPEndCall` @ `0x10016a880`)
582
+ * 2. Giải phóng toàn bộ tài nguyên UDP socket & bộ định thời
583
+ * 3. Gửi tín hiệu HTTP `/api/voicecall/cancel` (`11305`) và `/api/voicecall/endcall` (`11306`) hoặc `/api/voicecall/group/end` (`12046`)
584
+ * cho mọi thao tác ngắt máy từ phía local (`local_end`, `user_hangup`, `new_call`, ...).
585
+ */
586
+ endCall(reason?: string): Promise<void>;
587
+ /**
588
+ * Xử lý sự kiện `call_event` từ WebSocket (hoặc truyền thủ công).
589
+ */
590
+ handleCallEvent(event: CallEvent): Promise<void>;
591
+ private setState;
592
+ private applyServerInfo;
593
+ private ensureUdpSocket;
594
+ private performUdpInitHandshake;
595
+ private startUdpPingLoop;
596
+ private startGroupPingLoop;
597
+ private startMediaKeepaliveLoop;
598
+ private stopMediaKeepaliveLoop;
599
+ private buildCompoundRtcpReport;
600
+ private markCallActiveFromPartnerTraffic;
601
+ private handleIncomingUdpPacket;
602
+ private handleIncomingVideoRtpPayload;
603
+ private recordIncomingNal;
604
+ private flushIncomingAccessUnit;
605
+ private attachCallEventListener;
606
+ private detachCallEventListener;
607
+ private cleanupResources;
608
+ private sendRawUdp;
609
+ }