μ°λ¦¬κ° λ©μμ§λ₯Όλ°μ λ 2 κ°μ νΌμ΄κ° ν΅νμ μ°κ²°λμ΄ μλμ§ μμμΌν©λλ€. μμ΄μ€ μ°κ²° μνκ° μ°κ²° ν΄μ λλ©΄ λͺ¨λ μ°½κ³Ό dicsonnect 2 νΌμ΄κ° λ«νλλ€. μμ΄μ€ μλ² μ°κ²°μ΄ λκ²Όμ λ μ¬ μ°κ²°μ μ²λ¦¬ ν μ ββμμ΅λκΉ?
μ°κ²°μ΄ λμ΄μ§ μνλ 볡ꡬ ν μ μμ΄μΌνμ§λ§ νμ¬μ΄ λΌμ΄λΈλ¬λ¦¬λ μ°κ²°μ λ무 μΌμ° λ«μ΅λλ€. κ·Έκ²μ΄ μ²λ¦¬ λ λκΉμ§ μ΅μ μ λ°©λ²μ νμ΄λ¨Έλ₯Ό μ€λ₯μ λκ³ λ€μ μ°κ²°νλ κ²μ λλ€.
μμ΄μ€ 컀λ₯μ μ°κ²°μ΄ λμ΄μ‘μ λ μ΄λ»κ² λ€μ μ°κ²°ν μ μλμ§ μκ³ μΆμ΅λλ€. λ무 λ§μ μ½λλ₯Ό μλνμ§λ§ μλνμ§ μμ΅λλ€.
μμ΄μ€ 컀λ₯μ μ°κ²°μ΄ λμ΄μ‘μ λ μ΄λ»κ² λ€μ μ°κ²°ν μ μλμ§ μκ³ μΆμ΅λλ€. λ무 λ§μ μ½λλ₯Ό μλνμ§λ§ μλνμ§ μμ΅λλ€.
μ΄ λΌμ΄λΈλ¬λ¦¬λ μ°κ²°μ μ¦μ λ«κΈ° λλ¬Έμ μ°κ²°μ΄ λκΈ΄ μνμ μ μ 볡ꡬλ₯Ό μν ν μ μμ΅λλ€. ν μμλ μ μΌν λ°©λ²μ on('error')
μλ€μ λ€μ μλ μ°κ²°μ μ€μ ν λμ λκ°μ λ°©μμΌλ‘ μ°κ²°νλ κ²μ
λλ€. κ½€ κ³ ν΅ μ€λ½μ΅λλ€.
μ°Έκ³ : μ€λ₯λ₯Ό νμΈν μμλ λ κ³³μ΄ μμ΅λλ€. νΌμ΄ μ체 λ° μ°κ²° μ체. μ°κ²° μ, κ·Έλ€μμ΄ λΌμ΄λΈλ¬λ¦¬κ° μ§κΈκ³Ό κ°μ λ°©μμΌλ‘ κ±°μ λͺ¨λ μΉλͺ μ μ λλ€. νΌμ΄ μ체μμ λ§μ μ€λ₯κ° μΉλͺ μ μ΄μ§λ§ μ λΆλ μλλλ€.
νΌμ΄μ μμΌ μ€λ₯μ κ²½μ° λ€μκ³Ό κ°μ΅λλ€.
this.peer.on('disconnected', () => {
this.disconnectBackoff = 1;
this.retrySocketConnection();
});
μ¬κΈ°μ λ°± μ€νλ μ΅λ κ°μ λλ¬ ν λλ§λ€ μ¦κ°νλ μ΄ λ¨μμ κ°μ λλ€.
νΌμ΄ μ€λ₯μ κ²½μ° λ€μκ³Ό κ°μ΅λλ€.
// Non-Fatal error:
// 'peer-unavailable' = maybe they left?
// 'disconnected' = this means the Peering server disconnected, we have a seperate retry for that on('disconnect')
// pretty much all of the rest are fatal.
const FATAL_ERRORS = ['invalid-id', 'invalid-key', 'network', 'ssl-unavailable', 'server-error', 'socket-error', 'socket-closed', 'unavailable-id', 'webrtc'];
this.peer.on('error', (e) => {
if (FATAL_ERRORS.includes(e.type)) {
this.reconnectTimeout(e); // this function waits then tries the entire connection over again
} else {
console.log('Non fatal error: ', e.type);
}
});
κ·Έλ¦¬κ³ μ°κ²° (μ κ²½μ°μλ mediaConnection)μ λν΄ μ΄κ²μ κ°μ§κ³ μμ΅λλ€.
call.on('error', (e) => {
console.warn('error with stream', e);
if (initiator) { // initiator is a value I set myself
// Optionally this should call only the user that failed instead of the whole thing
this.reconnectTimeout();
}
});
κ·Έλ¦¬κ³ μμ μΈκΈ ν reconnectTimeout
λ μ 체 μ°κ²°μ λ€μ μλνλ κ°λ¨ν ν¨μμ
λλ€.
μ΄λ‘ μ μΌλ‘μ΄ λΌμ΄λΈλ¬λ¦¬λ iceRestarts
μ²λ¦¬ ν μ ββμμΌλ©° μμ΄μ€ λμ€ μ»€λ₯νΈμμ μΉλͺ
μ μ΄μ§ μμ μ μμ΅λλ€. μ΄κ²μ λλΆλΆμ λ¬Έμ λ₯Ό ν΄κ²°ν κ²μ΄λΌκ³ λ―Ώμ΅λλ€. μ°κ²° ν΄μ μ λν PRμ΄ μμ§λ§ μμ§ λ€μ μμνμ§λ μμ΅λλ€.
μ μλ μ λ μ¬κΈ° μ 체 νλ‘μ νΈμ peer.jsλ₯Ό μ¬μ©νκ³ μμ΅λλ€.
https://github.com/peers/peerjs/blob/master/dist/peerjs.js
μ΄μ λ νΌμ΄κ° νμ ν΅νλ₯Ό μν΄ μλ‘ μ°κ²°νμ λ λ¬Έμ κ° λ°μνκ³ , ν νΌμ΄κ° λλ¦° μ°κ²°μ μ»μ λ iceconnection λ νΌμ΄ μ°κ²°μ λμ΅λλ€.
κ·Έλ¦¬κ³ μ΄κ²μ λ νΌμ΄μ μ°κ²°μ λλ peerjs νμΌμ μ½λμ λλ€.
```
peerConnection.oniceconnectionstatechange = function () {
μ€μμΉ (peerConnection.iceConnectionState) {
μ¬λ‘ "μ€ν¨":
logger_1.default.log ( "iceConnectionStateκ° μ€ν¨νμ΅λλ€."+ peerIdμ λν μ°κ²°μ λ«μ΅λλ€);
_this.connection.emit(enums_1.ConnectionEventType.Error, new Error("Negotiation of connection to " + peerId + " failed."));
_this.connection.close();
break;
case "closed":
logger_1.default.log("iceConnectionState is closed, closing connections to " + peerId);
_this.connection.emit(enums_1.ConnectionEventType.Error, new Error("Connection to " + peerId + " closed."));
_this.connection.close();
break;
case "disconnected":
logger_1.default.log("iceConnectionState is disconnected, closing connections to " + peerId);
_this.connection.emit(enums_1.ConnectionEventType.Error, new Error("Connection to " + peerId + " disconnected."));
_this.connection.close();
break;
case "completed":
peerConnection.onicecandidate = util_1.util.noop;
break;
}
_this.connection.emit(enums_1.ConnectionEventType.IceStateChanged, peerConnection.iceConnectionState);
}; // DATACONNECTION.
please check this code
μΌμ΄μ€ "μ°κ²° λκΉ":
logger_1.default.log ( "iceConnectionStateκ° μ°κ²° ν΄μ λμ΄"+ peerIdμ λν μ°κ²°μ΄ λ«ν);
_this.connection.emit(enums_1.ConnectionEventType.Error, new Error("Connection to " + peerId + " disconnected."));
**_this.connection.close();**
```
μ¬κΈ° μ°κ²°μ΄ κ°κΉμμ§κ³ μ¬κΈ°μ μΌμ μ°κ²°μ λ€μ μ°κ²°νκ³ μΆμ΅λλ€
λ΄ λ΅μ₯μ λ€μ μ½μΌμμμ€. λλ λ΄κ° μλ ν λͺ ννκ² μ€λͺ νλ€.
μ΄ λΌμ΄λΈλ¬λ¦¬λ μ°κ²°μ μ¦μ λ«κΈ° λλ¬Έμ μ°κ²°μ΄ λκΈ΄ μνμ μ μ 볡ꡬλ₯Ό μν ν μ μμ΅λλ€. ν μμλ μ μΌν λ°©λ²μ on ( 'error')μ λ£κ³ μλ μ°κ²°μ μ€μ ν λμ λκ°μ λ°©μμΌλ‘ μ°κ²°νλ κ²μ λλ€. κ½€ κ³ ν΅ μ€λ½μ΅λλ€.
μ μΌν λ€λ₯Έ μ΅μ μ ν¬ν¬νκ±°λ μ¬κΈ°μμ λ΄ ν¬ν¬λ₯Ό μ¬μ©νλ κ²μ λλ€ : https://github.com/peers/peerjs/pull/655
λ€λ₯Έ μ΅μ
μ΄ μμ΅λκΉ? λλ νΌμ΄ jsμμ λλ₯Ό λμΈ μ μλ€λ©΄ μ΄λμμ μ΄λ€ μ½λλ₯Ό μμ±ν΄μΌν©λκΉ?
μ λ§ κΌΌμ§ λͺ»νμ΄μ ....
@jrowny μ‘°μ¬ν΄ μ£Όμ μ κ°μ¬ν©λλ€. 1.3.0μμ λ°°μ‘νκ² μ΅λλ€.
κ°μ₯ μ μ©ν λκΈ
μ΄ λΌμ΄λΈλ¬λ¦¬λ μ°κ²°μ μ¦μ λ«κΈ° λλ¬Έμ μ°κ²°μ΄ λκΈ΄ μνμ μ μ 볡ꡬλ₯Ό μν ν μ μμ΅λλ€. ν μμλ μ μΌν λ°©λ²μ
on('error')
μλ€μ λ€μ μλ μ°κ²°μ μ€μ ν λμ λκ°μ λ°©μμΌλ‘ μ°κ²°νλ κ²μ λλ€. κ½€ κ³ ν΅ μ€λ½μ΅λλ€.μ°Έκ³ : μ€λ₯λ₯Ό νμΈν μμλ λ κ³³μ΄ μμ΅λλ€. νΌμ΄ μ체 λ° μ°κ²° μ체. μ°κ²° μ, κ·Έλ€μμ΄ λΌμ΄λΈλ¬λ¦¬κ° μ§κΈκ³Ό κ°μ λ°©μμΌλ‘ κ±°μ λͺ¨λ μΉλͺ μ μ λλ€. νΌμ΄ μ체μμ λ§μ μ€λ₯κ° μΉλͺ μ μ΄μ§λ§ μ λΆλ μλλλ€.
νΌμ΄μ μμΌ μ€λ₯μ κ²½μ° λ€μκ³Ό κ°μ΅λλ€.
μ¬κΈ°μ λ°± μ€νλ μ΅λ κ°μ λλ¬ ν λλ§λ€ μ¦κ°νλ μ΄ λ¨μμ κ°μ λλ€.
νΌμ΄ μ€λ₯μ κ²½μ° λ€μκ³Ό κ°μ΅λλ€.
κ·Έλ¦¬κ³ μ°κ²° (μ κ²½μ°μλ mediaConnection)μ λν΄ μ΄κ²μ κ°μ§κ³ μμ΅λλ€.
κ·Έλ¦¬κ³ μμ μΈκΈ ν
reconnectTimeout
λ μ 체 μ°κ²°μ λ€μ μλνλ κ°λ¨ν ν¨μμ λλ€.μ΄λ‘ μ μΌλ‘μ΄ λΌμ΄λΈλ¬λ¦¬λ
iceRestarts
μ²λ¦¬ ν μ ββμμΌλ©° μμ΄μ€ λμ€ μ»€λ₯νΈμμ μΉλͺ μ μ΄μ§ μμ μ μμ΅λλ€. μ΄κ²μ λλΆλΆμ λ¬Έμ λ₯Ό ν΄κ²°ν κ²μ΄λΌκ³ λ―Ώμ΅λλ€. μ°κ²° ν΄μ μ λν PRμ΄ μμ§λ§ μμ§ λ€μ μμνμ§λ μμ΅λλ€.