4. Eşler arası bağlantılar
4.7 Oturum Müzakere Modeli
Bir RTCPeerConnection’ın durumunda yapılan birçok değişiklik, istenen etkiyi elde etmek için sinyal
kanalı üzerinden uzak tarafla iletişim kurulmasını gerektirir. Uygulama, sinyalizasyon yapması gerektiğinde
negotiationneeded olayını dinleyerek bilgilendirilebilir. Bu olay,
[[NegotiationNeeded]] adlı bir dahili yuva ile temsil edilen bağlantının
müzakere-gerekiyor bayrağının durumuna göre tetiklenir.
4.7.1 Müzakere-Gerekiyor Ayarlama
Bu bölüm normatif değildir.
Sinyalizasyon gerektiren bir işlem RTCPeerConnection üzerinde gerçekleştirildiğinde, bağlantı
müzakere gerektiriyor olarak işaretlenir. Bu tür işlemlere örnek olarak bir RTCRtpTransceiver
eklenmesi veya durdurulması ya da ilk RTCDataChannel’ın eklenmesi verilebilir.
Uygulama içindeki dahili değişiklikler de bağlantının müzakere gerektiriyor olarak işaretlenmesine yol açabilir.
Müzakere-gerekiyor bayrağının güncellenmesine ilişkin kesin prosedürlerin aşağıda belirtildiğini unutmayın.
4.7.2 Müzakere-Gerekiyor Temizleme
Bu bölüm normatif değildir.
Müzakere-gerekiyor bayrağı, "answer" türünde bir oturum tanımı başarıyla ayarlandığında ve sağlanan
tanım, RTCPeerConnection üzerinde mevcut olan RTCRtpTransceiver ve
RTCDataChannel’ların durumuyla eşleştiğinde temizlenir. Özellikle bu, durdurulmamış tüm
transceiver’ların yerel tanımda eşleşen özelliklere sahip ilişkili bir bölüme sahip olduğu ve herhangi bir veri
kanalı oluşturulmuşsa yerel tanımda bir veri bölümünün bulunduğu anlamına gelir.
Müzakere-gerekiyor bayrağının güncellenmesine ilişkin kesin prosedürlerin aşağıda belirtildiğini unutmayın.
4.7.3 Müzakere-Gerekiyor Bayrağını Güncelleme
Aşağıdaki süreç, bu belgede başka yerlerde başvurulduğunda gerçekleşir. Ayrıca, müzakereyi etkileyen uygulama içi dahili değişikliklerin bir sonucu olarak da gerçekleşebilir. Böyle değişiklikler meydana gelirse, kullanıcı aracısı müzakere-gerekiyor bayrağını MUST güncellemelidir.
connection için müzakere-gerekiyor bayrağını güncellemek üzere aşağıdaki adımları çalıştırın:
connection.[[Operations]]uzunluğu0değilse,connection.[[UpdateNegotiationNeededFlagOnEmptyChain]]değerinitrueolarak ayarlayın ve bu adımları sonlandırın.- Aşağıdaki adımları çalıştırmak üzere bir görev sıraya alın:
connection.[[IsClosed]]trueise, bu adımları sonlandırın.connection.[[Operations]]uzunluğu0değilse,connection.[[UpdateNegotiationNeededFlagOnEmptyChain]]değerinitrueolarak ayarlayın ve bu adımları sonlandırın.connection.[[SignalingState]]"stable" değilse, bu adımları sonlandırın.
stable" geçiş yaptığında güncellenecektir.
- Müzakere gerekip gerekmediğini denetlemenin sonucu
falseise,connection.[[NegotiationNeeded]]değerinifalseolarak ayarlayarak müzakere-gerekiyor bayrağını temizleyin ve bu adımları sonlandırın.
connection.[[NegotiationNeeded]] zaten true
ise, bu adımları sonlandırın.connection.[[NegotiationNeeded]] değerini
true olarak ayarlayın.
connection üzerinde negotiationneeded adlı bir olayı tetikleyin.connection üzerinde aynı anda birden fazla değişiklik
yapıldığı yaygın durumda negotiationneeded’ın erken tetiklenmesini önler.
Ayrıca, işlemler zinciri boşken negotiationneeded’ı yalnızca tetikleyerek müzakere
connection için müzakere gerekip gerekmediğini denetlemek üzere aşağıdaki kontrolleri
gerçekleştirin:
- Bu bölümün başında açıklandığı gibi, uygulamaya özgü herhangi bir müzakere gerekiyorsa,
truedöndürün. connection.[[LocalIceCredentialsToReplace]]boş değilse,truedöndürün.description,connection.[[CurrentLocalDescription]]olsun.connectionherhangi birRTCDataChanneloluşturmuşsa vedescriptioniçinde veri için henüz müzakere edilmiş bir m= bölümü yoksa,truedöndürün.connection’ın transceiver kümesindeki her birtransceiveriçin aşağıdaki kontrolleri gerçekleştirin:transceiver.[[Stopping]]truevetransceiver.[[Stopped]]falseise,truedöndürün.transceiverdurdurulmamışsa ve henüzdescriptioniçinde bir m= bölümüyle ilişkilendirilmemişse,truedöndürün.transceiverdurdurulmamışsa vedescriptioniçinde bir m= bölümüyle ilişkilendirilmişse, aşağıdaki kontrolleri gerçekleştirin:transceiver.[[Direction]]"sendrecv" veya "sendonly" ise vedescriptioniçindeki ilişkili m= bölümü ya tek bira=msidsatırı içermiyorsa ya da bum=bölümündekia=msidsatırlarından elde edilen MSID sayısı veya MSID değerlerinin kendisitransceiver.sender.[[AssociatedMediaStreamIds]]içindekilerden farklıysa,truedöndürün.descriptiontürü "offer" ise ve ilişkili m= bölümünün yönü neconnection.[[CurrentLocalDescription]]ne deconnection.[[CurrentRemoteDescription]]içindekilerden herhangi birindetransceiver.[[Direction]]ile eşleşmiyorsa,truedöndürün. Bu adımda, yön[[CurrentRemoteDescription]]içinde bulunan bir yön ile karşılaştırıldığında, açıklamanın yönü eşin bakış açısını temsil edecek şekilde tersine çevrilmelidir.descriptiontürü "answer" ise vedescriptioniçindeki ilişkili m= bölümünün yönü, sunulan yön ile kesiştirilmiştransceiver.[[Direction]]ile eşleşmiyorsa ([RFC9429]’da (bölüm 5.3.1.) açıklandığı gibi),truedöndürün.transceiverdurdurulmuşsa ve bir m= bölümüyle ilişkilendirilmişse, ancak ilişkili m= bölümüconnection.[[CurrentLocalDescription]]veyaconnection.[[CurrentRemoteDescription]]içinde henüz reddedilmemişse,truedöndürün.- Önceki kontrollerin tümü gerçekleştirildiyse ve
truedöndürülmediyse, müzakere edilecek bir şey kalmamıştır;falsedöndürün.