Welcome to mirror list, hosted at ThFree Co, Russian Federation.

IceServers.ts « src - github.com/jsxc/jsxc.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: 726b24ee91e6cad63107fc2b7c464722fe0ff852 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
import Client from './Client';
import Log from './util/Log';
import { IRTCPeerConfig } from './OptionsDefault';

export interface ICEServer {
   urls: string | string[];
   username?: string;
   password?: string;
}

export default class IceServers {
   public static isExpiring(): boolean {
      let rtcPeerConfig = Client.getOption<IRTCPeerConfig>('RTCPeerConfig') || <IRTCPeerConfig>{};

      return !!rtcPeerConfig.url;
   }

   public static registerUpdateHook(hook: (iceServers: ICEServer[]) => void) {
      Client.getOptions().registerHook('RTCPeerConfig', (rtcPeerConfig: IRTCPeerConfig) => {
         hook(rtcPeerConfig.iceServers);
      });
   }

   public static get(): Promise<ICEServer[]> {
      let rtcPeerConfig = Client.getOption<IRTCPeerConfig>('RTCPeerConfig') || <IRTCPeerConfig>{};
      let storage = Client.getStorage();
      let url = rtcPeerConfig.url;

      let ttl = (storage.getItem('iceValidity') || 0) - new Date().getTime();

      if ((ttl > 0 || !rtcPeerConfig.url) && rtcPeerConfig.iceServers) {
         // credentials valid

         IceServers.startRenewalTimeout();

         return Promise.resolve(rtcPeerConfig.iceServers);
      } else if (url) {
         return IceServers.getFromUrl(url);
      } else {
         Promise.reject(null);
      }
   }

   private static getFromUrl(url: string): Promise<ICEServer[]> {
      return new Promise((resolve, reject) => {
         $.ajax(url, {
            async: true,
            dataType: 'json',
            xhrFields: {
               withCredentials: Client.getOption('RTCPeerConfig').withCredentials,
            },
         })
            .done((data: IRTCPeerConfig) => {
               let peerConfig: IRTCPeerConfig = Client.getOption('RTCPeerConfig');
               let ttl = data.ttl || peerConfig.ttl || 3600;
               let iceServers = data.iceServers;

               if (iceServers && iceServers.length > 0) {
                  let urls = iceServers[0].urls && iceServers[0].urls.length > 0;

                  if (urls) {
                     Log.debug('ice servers received');

                     peerConfig.iceServers = iceServers;
                     Client.setOption('RTCPeerConfig', peerConfig);

                     Client.getStorage().setItem('iceValidity', new Date().getTime() + 1000 * ttl);

                     IceServers.startRenewalTimeout();

                     resolve(iceServers);
                  }
               } else {
                  Log.warn('Found no valid ICE server');

                  reject('ice-servers-not-found');
               }
            })
            .fail((xhr, textStatus, error) => {
               Log.warn('RTC peer config request failed with status: ' + textStatus, error);

               reject('request-not-possible');
            });
      });
   }

   private static startRenewalTimeout() {
      let validity = Client.getStorage().getItem('iceValidity');

      if (!validity) {
         return;
      }

      let ttl = validity - new Date().getTime();

      setTimeout(() => {
         IceServers.get();
      }, ttl * 1000);
   }
}