Предыстория:
Провёл рефакторинг кода который работал, изначально всё вызывалось в компоненте и это меня не устраивало т.к. он должен отвечать только за 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
Если вы хотя-бы дочитали, уже респект и спасибо!
Я уверен что я где-то ошибся, но из-за замыленного глаза за деревьями леса не вижу.