11#include <promeki/config.h>
12#if PROMEKI_ENABLE_NETWORK
22PROMEKI_NAMESPACE_BEGIN
94class RtmpHandshake :
public ObjectBase {
95 PROMEKI_OBJECT(RtmpHandshake, ObjectBase)
118 static constexpr uint8_t Version = 0x03;
127 static constexpr int ChunkSize = 1536;
139 explicit RtmpHandshake(RtmpRole role, ObjectBase *parent =
nullptr);
142 ~RtmpHandshake()
override;
151 Error setMode(RtmpHandshakeMode mode);
154 RtmpHandshakeMode mode()
const {
return _mode; }
165 RtmpHandshakeMode negotiatedMode()
const {
return _negotiatedMode; }
175 Buffer pendingOutput();
194 Error feed(
const BufferView &data);
204 void markPeerClosed();
207 State state()
const {
return _state; }
210 Error lastError()
const {
return _lastError; }
215 RtmpRole role()
const {
return _role; }
225 uint32_t peerEpoch()
const {
return _peerEpoch; }
236 uint32_t localEpoch()
const {
return _localEpoch; }
244 void setLocalEpoch(uint32_t epoch);
259 Error setLocalNonce(
const BufferView &nonce);
264 PROMEKI_SIGNAL(complete);
270 PROMEKI_SIGNAL(failed, Error);
286 void fail(Error err);
287 Error produceClientC1();
288 Error produceClientC2();
289 Error produceServerS0S1S2();
290 Error consumePeerC0C1();
291 Error consumePeerS0S1();
292 Error consumePeerC2();
293 Error consumePeerS2();
296 RtmpHandshakeMode _mode = RtmpHandshakeMode::Auto;
297 RtmpHandshakeMode _negotiatedMode = RtmpHandshakeMode::Auto;
298 State _state = NotStarted;
299 InternalStep _step = StepSendC0C1;
300 Error _lastError = Error::Ok;
302 uint32_t _localEpoch = 0;
303 uint32_t _peerEpoch = 0;
305 bool _outEmittedFirst =
false;
306 bool _hasOverrideNonce =
false;
307 List<uint8_t> _overrideNonce;
309 List<uint8_t> _outBuffer;
310 List<uint8_t> _inBuffer;
313 int _localScheme = 1;
314 int _peerScheme = -1;
315 List<uint8_t> _localC1S1;
316 List<uint8_t> _peerC1S1;
317 uint8_t _localDigest[32] = {};
318 uint8_t _peerDigest[32] = {};