@@ -113,8 +113,13 @@ std::string describeDataTrackError(const Error& error) {
113113 return " code=" + std::to_string (static_cast <std::uint32_t >(error.code )) + " message=" + error.message ;
114114}
115115
116- std::shared_ptr<LocalDataTrack> requirePublishedTrack (LocalParticipant* participant, const std::string& name) {
117- auto result = participant->publishDataTrack (name);
116+ std::shared_ptr<LocalDataTrack> requirePublishedTrack (const std::weak_ptr<LocalParticipant>& participant,
117+ const std::string& name) {
118+ auto locked = participant.lock ();
119+ if (!locked) {
120+ throw std::runtime_error (" Local participant handle is expired" );
121+ }
122+ auto result = locked->publishDataTrack (name);
118123 if (!result) {
119124 throw std::runtime_error (" Failed to publish data track: " + describeDataTrackError (result.error ()));
120125 }
@@ -216,7 +221,7 @@ void runEncryptedDataTrackRoundTrip(KeyDerivationFunction key_derivation_functio
216221 EXPECT_EQ (publisher_room->e2eeManager ().lock ()->keyProvider ()->exportSharedKey (), e2eeSharedKey ());
217222 EXPECT_EQ (subscriber_room->e2eeManager ().lock ()->keyProvider ()->exportSharedKey (), e2eeSharedKey ());
218223
219- auto publish_result = publisher_room-> localParticipant (). lock ( )->publishDataTrack (track_name);
224+ auto publish_result = lockLocalParticipant (*publisher_room )->publishDataTrack (track_name);
220225 if (!publish_result) {
221226 FAIL () << describeDataTrackError (publish_result.error ());
222227 }
@@ -307,9 +312,9 @@ TEST_P(DataTrackTransportTest, PublishesAndReceivesFramesEndToEnd) {
307312
308313 auto rooms = testRooms (room_configs);
309314 auto & publisher_room = rooms[0 ];
310- const auto publisher_identity = publisher_room-> localParticipant (). lock ( )->identity ();
315+ const auto publisher_identity = lockLocalParticipant (*publisher_room )->identity ();
311316
312- auto local_track = requirePublishedTrack (publisher_room->localParticipant (). lock (). get () , track_name);
317+ auto local_track = requirePublishedTrack (publisher_room->localParticipant (), track_name);
313318 ASSERT_TRUE (local_track->isPublished ());
314319 EXPECT_FALSE (local_track->info ().uses_e2ee );
315320 EXPECT_EQ (local_track->info ().name , track_name);
@@ -372,7 +377,7 @@ TEST_F(DataTrackE2ETest, UnpublishUpdatesPublishedStateEndToEnd) {
372377 auto rooms = testRooms (room_configs);
373378 auto & publisher_room = rooms[0 ];
374379
375- auto publish_result = publisher_room-> localParticipant (). lock ( )->publishDataTrack (track_name);
380+ auto publish_result = lockLocalParticipant (*publisher_room )->publishDataTrack (track_name);
376381 if (!publish_result) {
377382 FAIL () << describeDataTrackError (publish_result.error ());
378383 }
@@ -401,7 +406,7 @@ TEST_F(DataTrackE2ETest, SubscribeAfterUnpublishReportsTerminalError) {
401406 auto rooms = testRooms (room_configs);
402407 auto & publisher_room = rooms[0 ];
403408
404- auto local_track = requirePublishedTrack (publisher_room->localParticipant (). lock (). get () , track_name);
409+ auto local_track = requirePublishedTrack (publisher_room->localParticipant (), track_name);
405410 ASSERT_TRUE (local_track->isPublished ());
406411
407412 auto remote_track = subscriber_delegate.waitForTrack (kTrackWaitTimeout );
@@ -455,7 +460,7 @@ TEST_F(DataTrackE2ETest, PublishManyTracks) {
455460 const auto start = std::chrono::steady_clock::now ();
456461 for (int index = 0 ; index < kPublishManyTrackCount ; ++index) {
457462 const auto track_name = " track_" + std::to_string (index);
458- auto publish_result = room-> localParticipant (). lock ( )->publishDataTrack (track_name);
463+ auto publish_result = lockLocalParticipant (*room )->publishDataTrack (track_name);
459464 if (!publish_result) {
460465 FAIL () << " Failed to publish track " << track_name << " : " << describeDataTrackError (publish_result.error ());
461466 }
@@ -496,14 +501,14 @@ TEST_F(DataTrackE2ETest, PublishDuplicateName) {
496501 auto rooms = testRooms (1 );
497502 auto & room = rooms[0 ];
498503
499- auto first_track_result = room-> localParticipant (). lock ( )->publishDataTrack (" first" );
504+ auto first_track_result = lockLocalParticipant (*room )->publishDataTrack (" first" );
500505 if (!first_track_result) {
501506 FAIL () << describeDataTrackError (first_track_result.error ());
502507 }
503508 auto first_track = first_track_result.value ();
504509 ASSERT_TRUE (first_track->isPublished ());
505510
506- auto duplicate_result = room-> localParticipant (). lock ( )->publishDataTrack (" first" );
511+ auto duplicate_result = lockLocalParticipant (*room )->publishDataTrack (" first" );
507512 ASSERT_FALSE (duplicate_result) << " Expected duplicate data-track name to be rejected" ;
508513 EXPECT_EQ (duplicate_result.error ().code , PublishDataTrackErrorCode::DUPLICATE_NAME);
509514 EXPECT_FALSE (duplicate_result.error ().message .empty ());
@@ -525,7 +530,7 @@ TEST_F(DataTrackE2ETest, CanResubscribeToRemoteDataTrack) {
525530 std::exception_ptr publish_error;
526531 std::thread publisher ([&]() {
527532 try {
528- auto track = requirePublishedTrack (publisher_room->localParticipant (). lock (). get () , track_name);
533+ auto track = requirePublishedTrack (publisher_room->localParticipant (), track_name);
529534 if (!track->isPublished ()) {
530535 throw std::runtime_error (" Publisher failed to publish data track" );
531536 }
@@ -582,7 +587,7 @@ TEST_F(DataTrackE2ETest, FfiClientSubscribeDataTrackReturnsSyncResult) {
582587
583588 for (std::size_t idx = 0 ; idx < kTopicCount ; ++idx) {
584589 const auto track_name = " test_" + std::to_string (idx);
585- auto publish_result = publisher_room-> localParticipant (). lock ( )->publishDataTrack (track_name);
590+ auto publish_result = lockLocalParticipant (*publisher_room )->publishDataTrack (track_name);
586591 if (!publish_result) {
587592 FAIL () << " Failed to publish " << track_name << " : " << describeDataTrackError (publish_result.error ());
588593 }
@@ -644,7 +649,7 @@ TEST_F(DataTrackE2ETest, PreservesUserTimestampEndToEnd) {
644649 auto rooms = testRooms (room_configs);
645650 auto & publisher_room = rooms[0 ];
646651
647- auto publish_result = publisher_room-> localParticipant (). lock ( )->publishDataTrack (track_name);
652+ auto publish_result = lockLocalParticipant (*publisher_room )->publishDataTrack (track_name);
648653 if (!publish_result) {
649654 FAIL () << describeDataTrackError (publish_result.error ());
650655 }
@@ -735,7 +740,7 @@ TEST_F(DataTrackE2ETest, PreservesUserTimestampOnEncryptedDataTrack) {
735740 publisher_room->e2eeManager ().lock ()->setEnabled (true );
736741 subscriber_room->e2eeManager ().lock ()->setEnabled (true );
737742
738- auto publish_result = publisher_room-> localParticipant (). lock ( )->publishDataTrack (track_name);
743+ auto publish_result = lockLocalParticipant (*publisher_room )->publishDataTrack (track_name);
739744 if (!publish_result) {
740745 FAIL () << describeDataTrackError (publish_result.error ());
741746 }
0 commit comments