| 114 | } |
| 115 | |
| 116 | func initVideoCalls(jsconfig json.RawMessage) error { |
| 117 | var config callConfig |
| 118 | |
| 119 | if len(jsconfig) == 0 { |
| 120 | return nil |
| 121 | } |
| 122 | |
| 123 | if err := json.Unmarshal([]byte(jsconfig), &config); err != nil { |
| 124 | return fmt.Errorf("failed to parse config: %w", err) |
| 125 | } |
| 126 | |
| 127 | if !config.Enabled { |
| 128 | logs.Info.Println("Video calls disabled") |
| 129 | return nil |
| 130 | } |
| 131 | |
| 132 | if len(config.ICEServers) > 0 { |
| 133 | globals.iceServers = config.ICEServers |
| 134 | } else if config.ICEServersFile != "" { |
| 135 | var iceConfig []iceServer |
| 136 | file, err := os.Open(config.ICEServersFile) |
| 137 | if err != nil { |
| 138 | return fmt.Errorf("failed to read ICE config: %w", err) |
| 139 | } |
| 140 | |
| 141 | jr := jcr.New(file) |
| 142 | if err = json.NewDecoder(jr).Decode(&iceConfig); err != nil { |
| 143 | switch jerr := err.(type) { |
| 144 | case *json.UnmarshalTypeError: |
| 145 | lnum, cnum, _ := jr.LineAndChar(jerr.Offset) |
| 146 | return fmt.Errorf("unmarshall error in ICE config in %s at %d:%d (offset %d bytes): %w", |
| 147 | jerr.Field, lnum, cnum, jerr.Offset, jerr) |
| 148 | case *json.SyntaxError: |
| 149 | lnum, cnum, _ := jr.LineAndChar(jerr.Offset) |
| 150 | return fmt.Errorf("syntax error in config file at %d:%d (offset %d bytes): %w", |
| 151 | lnum, cnum, jerr.Offset, jerr) |
| 152 | default: |
| 153 | return fmt.Errorf("failed to parse config file: %w", err) |
| 154 | } |
| 155 | } |
| 156 | file.Close() |
| 157 | |
| 158 | globals.iceServers = iceConfig |
| 159 | } |
| 160 | |
| 161 | if len(globals.iceServers) == 0 { |
| 162 | return errors.New("no valid ICE cervers found") |
| 163 | } |
| 164 | |
| 165 | globals.callEstablishmentTimeout = config.CallEstablishmentTimeout |
| 166 | if globals.callEstablishmentTimeout <= 0 { |
| 167 | globals.callEstablishmentTimeout = defaultCallEstablishmentTimeout |
| 168 | } |
| 169 | |
| 170 | logs.Info.Println("Video calls enabled with", len(globals.iceServers), "ICE servers") |
| 171 | return nil |
| 172 | } |
| 173 | |