Peerjs: рд╡рд┐рдпреЛрдЧ рдХреЗ рдмрд╛рдж рд╕рд╣рдХрд░реНрдореА рдПрдХ рд╣реА рд╕рд╣рдХрд░реНрдореА рд╕реЗ рдХреИрд╕реЗ рдЬреБрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ?

рдХреЛ рдирд┐рд░реНрдорд┐рдд 14 рдЕрдкреНрд░реИрд▓ 2020  ┬╖  7рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: peers/peerjs

рдореБрдЭреЗ рдпрд╣ рдЬрд╛рдирдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд╕рдВрджреЗрд╢ рдкреНрд░рд╛рдкреНрдд рд╣реЛрдиреЗ рдкрд░ 2 рдкреАрдпрд░ рдХреЙрд▓ рдкрд░ рдЬреБрдбрд╝реЗ рд╣реБрдП рд╣реИрдВ - рдмрд░реНрдл рдХрдиреЗрдХреНрд╢рди рд╕реНрдерд┐рддрд┐ рдХрд╛рдЯ рджреА рдЬрд╛рддреА рд╣реИ, рдпрд╣ рд╕рднреА рд╡рд┐рдВрдбреЛ рдмрдВрдж рдХрд░ рджреЗрддрд╛ рд╣реИ рдФрд░ 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);
        }
      });

рдФрд░ рдлрд┐рд░ рдХрдиреЗрдХреНрд╢рди рдХреЗ рд▓рд┐рдП (рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдореАрдбрд┐рдпрд╛ рдХрдиреЗрдХреНрд╢рди) рдореЗрд░реЗ рдкрд╛рд╕ рдпрд╣ рд╣реИред

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();
      }
    });

рдФрд░ aformentioned reconnectTimeout рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдЬреЛ рдкреВрд░реЗ рдХрдиреЗрдХреНрд╢рди рдХреЛ рдлрд┐рд░ рд╕реЗ рдЖрдЬрд╝рдорд╛рддрд╛ рд╣реИред

рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ рдпрд╣ рдкреБрд╕реНрддрдХрд╛рд▓рдп iceRestarts рдХреЛ рд╕рдВрднрд╛рд▓ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдмрд░реНрдл рдХреЗ рдбрд┐рд╕реНрдХрдиреЗрдХреНрдЯ рдкрд░ рдШрд╛рддрдХ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрдзрд┐рдХрд╛рдВрд╢ рдореБрджреНрджреЛрдВ рдХреЛ рд╣рд▓ рдХрд░реЗрдЧрд╛ред рдореЗрд░реЗ рдкрд╛рд╕ рдбрд┐рд╕реНрдХрдиреЗрдХреНрдЯ рдЪреАрдЬрд╝ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреАрдЖрд░ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрднреА рддрдХ рдкреБрдирд░рд╛рд░рдВрдн рдХреЗ рд▓рд┐рдП рдирд╣реАрдВред

рд╕рднреА 7 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдбрд┐рд╕реНрдХрдиреЗрдХреНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдмрд░реНрдл рд░рд╛рдЬреНрдп рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдпрд╣ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдкреВрд░реНрд╡-рдкрд░рд┐рдкрдХреНрд╡ рд░реВрдк рд╕реЗ рдХрдиреЗрдХреНрд╢рди рдмрдВрдж рдХрд░ рджреЗрддреА рд╣реИред рдЬрдм рддрдХ рдпрд╣ рд╕рдВрднрд╛рд▓рд╛ рдирд╣реАрдВ рдЬрд╛рддрд╛ рд╣реИ, рддрдм рддрдХ рдЖрдк рдЬреЛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рд╡рд╣ рддреНрд░реБрдЯрд┐ рдкрд░ рдПрдХ рдЯрд╛рдЗрдорд░ рд▓рдЧрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдлрд┐рд░ рд╕реЗ рдХрдиреЗрдХреНрдЯ рд╣реЛрддрд╛ рд╣реИред

рдореИрдВ рдпрд╣ рдЬрд╛рдирдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдЬрдм рдЖрдИрдХреЛрдиреЗрдХреНрд╢рди рдбрд┐рд╕реНрдХрдиреЗрдХреНрдЯ рд╣реЛ рдЬрд╛рдП рддреЛ рдореИрдВ рдХреИрд╕реЗ рдлрд┐рд░ рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ? рдореИрдВ рдХрдИ рдХреЛрдб рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ

рдореИрдВ рдпрд╣ рдЬрд╛рдирдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдЬрдм рдЖрдИрдХреЛрдиреЗрдХреНрд╢рди рдбрд┐рд╕реНрдХрдиреЗрдХреНрдЯ рд╣реЛ рдЬрд╛рдП рддреЛ рдореИрдВ рдХреИрд╕реЗ рдлрд┐рд░ рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ? рдореИрдВ рдХрдИ рдХреЛрдб рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ

рдпрд╣ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдЖрдкрдХреЛ рдбрд┐рд╕реНрдХрдиреЗрдХреНрдЯ рдХрд┐рдП рдЧрдП рд░рд╛рдЬреНрдп рдХреА рдПрдХ рд╕реБрдВрджрд░ рд╡рд╕реВрд▓реА рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рддреБрд░рдВрдд рдХрдиреЗрдХреНрд╢рди рдХреЛ рдмрдВрдж рдХрд░ рджреЗрддрд╛ рд╣реИред рдХреЗрд╡рд▓ рдПрдХ рдЪреАрдЬ рдЬреЛ рдЖрдк рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рд╡рд╣ рд╣реИ 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);
        }
      });

рдФрд░ рдлрд┐рд░ рдХрдиреЗрдХреНрд╢рди рдХреЗ рд▓рд┐рдП (рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдореАрдбрд┐рдпрд╛ рдХрдиреЗрдХреНрд╢рди) рдореЗрд░реЗ рдкрд╛рд╕ рдпрд╣ рд╣реИред

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();
      }
    });

рдФрд░ aformentioned reconnectTimeout рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдЬреЛ рдкреВрд░реЗ рдХрдиреЗрдХреНрд╢рди рдХреЛ рдлрд┐рд░ рд╕реЗ рдЖрдЬрд╝рдорд╛рддрд╛ рд╣реИред

рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ рдпрд╣ рдкреБрд╕реНрддрдХрд╛рд▓рдп iceRestarts рдХреЛ рд╕рдВрднрд╛рд▓ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдмрд░реНрдл рдХреЗ рдбрд┐рд╕реНрдХрдиреЗрдХреНрдЯ рдкрд░ рдШрд╛рддрдХ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрдзрд┐рдХрд╛рдВрд╢ рдореБрджреНрджреЛрдВ рдХреЛ рд╣рд▓ рдХрд░реЗрдЧрд╛ред рдореЗрд░реЗ рдкрд╛рд╕ рдбрд┐рд╕реНрдХрдиреЗрдХреНрдЯ рдЪреАрдЬрд╝ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреАрдЖрд░ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрднреА рддрдХ рдкреБрдирд░рд╛рд░рдВрдн рдХреЗ рд▓рд┐рдП рдирд╣реАрдВред

рд╕рд░ рдореИрдВ рдкреВрд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд▓рд┐рдП peer.js рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдБ рдпрд╣рд╛рдБ peerjs рдлрд╝рд╛рдЗрд▓ рдХреЗ рд▓рд┐рдП рд▓рд┐рдВрдХ рд╣реИ
https://github.com/peers/peerjs/blob/master/dist/peerjs.js

рдЕрдм рдореБрдЭреЗ рдХреНрдпрд╛ рд╕рдорд╕реНрдпрд╛ рд╣реЛ рд░рд╣реА рд╣реИ рдЬрдм 2 рд╕рд╛рдерд┐рдпреЛрдВ рдиреЗ рдПрдХ-рджреВрд╕рд░реЗ рдХреЛ рд╡реАрдбрд┐рдпреЛ рдХреЙрд▓ рдХреЗ рд▓рд┐рдП рдХрдиреЗрдХреНрдЯ рдХрд┐рдпрд╛, рдЬрдм рдПрдХ рд╕рд╣рдХрд░реНрдореА рдХреЛ рдзреАрдорд╛ рдХрдиреЗрдХреНрд╢рди рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ рдЖрдЗрдХрдиреЗрдХреНрд╢рди рдбрд┐рд╕реНрдХрдиреЗрдХреНрдЯ рджреЛрдиреЛрдВ рд╕рд╣рдХрд░реНрдореА

рдФрд░ рдпрд╣ 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();**

`` `

рдпрд╣рд╛рдБ рдХрдиреЗрдХреНрд╢рди рдмрдВрдж рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдпрд╣рд╛рдБ рдореИрдВ рдмрд░реНрдл рдХрдиреЗрдХреНрд╢рди рдХреЛ рдлрд┐рд░ рд╕реЗ рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдБ

рдореЗрд░реЗ рдЬрд╡рд╛рдм рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрдврд╝рдирд╛ред рдореИрдВрдиреЗ рдЗрд╕реЗ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕рдордЭрд╛рдпрд╛ рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдХреИрд╕реЗред

рдпрд╣ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдЖрдкрдХреЛ рдбрд┐рд╕реНрдХрдиреЗрдХреНрдЯ рдХрд┐рдП рдЧрдП рд░рд╛рдЬреНрдп рдХреА рдПрдХ рд╕реБрдВрджрд░ рд╡рд╕реВрд▓реА рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рддреБрд░рдВрдд рдХрдиреЗрдХреНрд╢рди рдХреЛ рдмрдВрдж рдХрд░ рджреЗрддрд╛ рд╣реИред рдХреЗрд╡рд▓ рдПрдХ рдЪреАрдЬ рдЬреЛ рдЖрдк рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрд╕ рдкрд░ ('рддреНрд░реБрдЯрд┐') рд╕реБрдиреЗрдВ рдФрд░ рдлрд┐рд░ рдЕрдкрдиреЗ рдореВрд▓ рдХрдиреЗрдХреНрд╢рди рдХреЛ рд╕реЗрдЯ рдХрд░рддреЗ рд╕рдордп рдареАрдХ рдЙрд╕реА рддрд░рд╣ рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВ рдЬреИрд╕рд╛ рдЖрдкрдиреЗ рдХрд┐рдпрд╛ рдерд╛ред рдХрд╛рдлреА рджрд░реНрдж рд╣реЛ рд░рд╣рд╛ рд╣реИред

рдЖрдкрдХрд╛ рдПрдХрдорд╛рддреНрд░ рдЕрдиреНрдп рд╡рд┐рдХрд▓реНрдк рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдХрд╛рдВрдЯрд╛ рдЬрд╛рдП, рдпрд╛ рдпрд╣рд╛рдБ рдореЗрд░реЗ рдХрд╛рдВрдЯреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ: https://github.com/peers/peerjs/pull/655

рдХреЛрдИ рдЕрдиреНрдп рд╡рд┐рдХрд▓реНрдк? рдпрд╛ рдпрджрд┐ рдЖрдк рдореБрдЭреЗ рд╕рд╣рдХрд░реНрдореА рдЬреЗрдПрд╕ рдореЗрдВ рдорджрдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рддреЛ рдореБрдЭреЗ рдЧрд▓рддреА рдкрд░ рдХрд╣рд╛рдВ рдФрд░ рдХрд┐рд╕ рдХреЛрдб рдореЗрдВ рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП?
рдореИрдВ рд╕рдЪ рдореЗрдВ рдлрдВрд╕ рдЧрдпрд╛ рд╣реВрдБ рд╕рд░тАжред

@ рдЬреЙрдиреА рдПрдХ рдЬрд╛рдВрдЪ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рд╣рдо рдЗрд╕реЗ 1.3.0 рдореЗрдВ рд╢рд┐рдк рдХрд░реЗрдВрдЧреЗ

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

marcoippolito picture marcoippolito  ┬╖  9рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

fresheneesz picture fresheneesz  ┬╖  10рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

UnsungHero97 picture UnsungHero97  ┬╖  5рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

maxpavlov picture maxpavlov  ┬╖  6рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

Kitanga picture Kitanga  ┬╖  5рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ