@historydev
Острая аллергия на анимешников

Почему при использовании сервиса в сервисе он работает некорректно?

Предыстория:

Провёл рефакторинг кода который работал, изначально всё вызывалось в компоненте и это меня не устраивало т.к. он должен отвечать только за view и вызывать события своего контроллера. Переписал с инкапсуляцией, чтобы всё было взаимозаменяемым и работало автономно при наличии корректных вводных. Работаю с webrtc, использую PeerConnection, вынесен он в отдельный сервис p2p-connector, его я использую в сервисе звонка call, а уже call соответственно внедряю в call-component. Пытаюсь разобраться дня 4 уже.

Суть проблемы:

При первом звонке всё хорошо. При последующих звонках я получаю ошибку из handle_connect о том, что мой _peer_connection существует! Хотя при disconnect я его явно привожу к undefined. Эффект который получается такой - если звонишь в любую из сторон у того кто звонит всё окей, у того кто принимает нет ничего.

Я пробовал:

example - provideIn: root

1. Injectable(root) - указывал что он внедряется везде в рамках AppModule
2. Injectable() - указывал что он внедряется только в call-component
3. Кучу раз переписывал disconnect_handler который будет приведён ниже.

Выдержка методов из сервисов и компонента:

p2p-connector.service

private async handle_connect(): Promise<void> {
		if (this._peer_connection) {
			this.Logger.error('p2p-connector', 'handle_connect: ', 'Already in call');
			return;
		}
		await this.initialize_connection();
	}
private handle_disconnect(): void {
		if (this._peer_connection?.signalingState !== 'closed') {
			this._peer_connection?.close();
		}
		this._peer_connection = undefined;
		this._local_media_stream?.getTracks().forEach(track => track.stop());
		this._local_media_stream = undefined;
		this._remote_media_stream = undefined;
		this.Logger.error('p2p-connector-service', 'handle_disconnect', this._peer_connection);
		this.router.navigate(['']).then();
	}


call.service
constructor(
		public user_media_p2p: P2pConnectorService,
	) {}

public start_outgoing_call(): void {

					this.user_media_p2p.sender_id = this._sender_id;
					this.user_media_p2p.receiver_id = this._receiver_id;
					this.user_media_p2p.local_media_stream = this.media_devices.user_media;
					this.user_media_p2p.connect();
	}
public cancel_outgoing_call(): void {
		this.user_media_p2p.disconnect();
	}


call.component

constructor(
		public call: CallService,
		private Logger: LoggerService
	) {}

	public ngOnInit(): void {
		this.call.start_outgoing_call();
	}

	public ngOnDestroy(): void {
		this.Logger.error('call-component', 'destroyed');
		this.call.cancel_outgoing_call();
	}


Полный код p2p-connector

Если вы хотя-бы дочитали, уже респект и спасибо!
Я уверен что я где-то ошибся, но из-за замыленного глаза за деревьями леса не вижу.
  • Вопрос задан
  • 27 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы