Пример #1
0
        private static void LoadCDNConfig()
        {
            string cdnKey          = BuildInfo["CDN Key"];
            string cdnCfgPath      = Path.Combine(Settings.SystemFilesPath, cdnKey);
            string cdnCfgLocalPath = Path.Combine(BasePath, "Data", "config", cdnKey.Substring(0, 2), cdnKey.Substring(2, 2), cdnKey);

            if (File.Exists(cdnCfgLocalPath))
            {
                CDNConfig = new MultiConfig(cdnCfgLocalPath);
            }
            else
            {
                cdnCfgPath = Helper.FixOutputPath(cdnCfgPath, "config");

                if (!File.Exists(cdnCfgPath))
                {
                    string url = "/config/" + cdnKey.Substring(0, 2) + "/" + cdnKey.Substring(2, 2) + "/" + cdnKey;
                    if (!DataHandler.Download(url, cdnCfgPath))
                    {
                        Logger.LogCritical($"Unable to download CDN Config {cdnKey}.");
                    }
                }

                CDNConfig = new MultiConfig(cdnCfgPath);
            }
        }
Пример #2
0
    public async Task MultipleNamespaceTest()
    {
        var repositoryFactories = new[]
        {
            new FakeConfigRepository(ConfigConsts.NamespaceApplication,
                                     new Properties(new Dictionary <string, string> {
                ["A"] = "3", ["B"] = "3"
            })),
            new FakeConfigRepository(ConfigConsts.NamespaceApplication,
                                     new Properties(new Dictionary <string, string> {
                ["B"] = "4"
            })),
        };

        var config = new MultiConfig(await Task.WhenAll(repositoryFactories.Select(CreateConfig).Reverse()).ConfigureAwait(false));

        Assert.Equal("3", config.GetProperty("A", ""));
        Assert.Equal("4", config.GetProperty("B", ""));

        ConfigChangeEventArgs?args = null;

        config.ConfigChanged += (sender, e) => args = e;

        repositoryFactories[1].Change(new Properties(new Dictionary <string, string>()));

        await Task.Delay(100).ConfigureAwait(false);

        Assert.NotNull(args);

        args = null;

        repositoryFactories[1].Change(new Properties(new Dictionary <string, string> {
            ["B"] = "3"
        }));

        await Task.Delay(100).ConfigureAwait(false);

        Assert.Null(args);
    }
Пример #3
0
        public IEnumerator Multi()
        {
            // Create the peer connections
            var pc1_go = new GameObject("pc1");

            pc1_go.SetActive(false); // prevent auto-activation of components
            var pc1 = pc1_go.AddComponent <PeerConnection>();

            pc1.AutoInitializeOnStart = false;
            var pc2_go = new GameObject("pc2");

            pc2_go.SetActive(false); // prevent auto-activation of components
            var pc2 = pc2_go.AddComponent <PeerConnection>();

            pc2.AutoInitializeOnStart = false;

            // Batch changes manually
            pc1.AutoCreateOfferOnRenegotiationNeeded = false;
            pc2.AutoCreateOfferOnRenegotiationNeeded = false;

            // Create the signaler
            var sig_go = new GameObject("signaler");
            var sig    = sig_go.AddComponent <LocalOnlySignaler>();

            sig.Peer1 = pc1;
            sig.Peer2 = pc2;

            // Create the senders and receivers
            //     P1     P2
            // 0 : S   =>  R
            // 1 : SR <=> SR
            // 2 : S   => SR
            // 3 :  R <=  SR
            // 4 : S   =>  R

            const int NumTransceivers = 5;

            // P1 has 4 senders added to it
            int numLocal1 = 4;

            // P1 receives 2 tracks from the 3 P2 senders (one is refused)
            int numRemote1 = 2;

            // P2 has 3 senders added to it
            int numLocal2 = 3;

            // P2 receives 4 tracks from the 4 P1 senders
            int numRemote2 = 4;

            var cfgs = new MultiConfig[NumTransceivers]
            {
                new MultiConfig {
                    peer1 = new PeerConfig {
                        desiredDirection = Transceiver.Direction.SendOnly,
                        expectSender     = true,
                        expectReceiver   = false,
                    },
                    peer2 = new PeerConfig {
                        desiredDirection = Transceiver.Direction.ReceiveOnly,
                        expectSender     = false,
                        expectReceiver   = true,
                    }
                },
                new MultiConfig {
                    peer1 = new PeerConfig {
                        desiredDirection = Transceiver.Direction.SendReceive,
                        expectSender     = true,
                        expectReceiver   = true,
                    },
                    peer2 = new PeerConfig {
                        desiredDirection = Transceiver.Direction.SendReceive,
                        expectSender     = true,
                        expectReceiver   = true,
                    },
                },
                new MultiConfig {
                    peer1 = new PeerConfig {
                        desiredDirection = Transceiver.Direction.SendOnly,
                        expectSender     = true,
                        expectReceiver   = false,
                    },
                    peer2 = new PeerConfig {
                        desiredDirection = Transceiver.Direction.SendReceive,
                        expectSender     = true,
                        expectReceiver   = true,
                    },
                },
                new MultiConfig {
                    peer1 = new PeerConfig {
                        desiredDirection = Transceiver.Direction.ReceiveOnly,
                        expectSender     = false,
                        expectReceiver   = true,
                    },
                    peer2 = new PeerConfig {
                        desiredDirection = Transceiver.Direction.SendReceive,
                        expectSender     = true,
                        expectReceiver   = false,
                    },
                },
                new MultiConfig {
                    peer1 = new PeerConfig {
                        desiredDirection = Transceiver.Direction.SendOnly,
                        expectSender     = true,
                        expectReceiver   = false,
                    },
                    peer2 = new PeerConfig {
                        desiredDirection = Transceiver.Direction.ReceiveOnly,
                        expectSender     = false,
                        expectReceiver   = true,
                    },
                },
            };

            for (int i = 0; i < NumTransceivers; ++i)
            {
                var cfg = cfgs[i];

                {
                    MediaLine ml1  = pc1.AddMediaLine(MediaKind.Video);
                    var       peer = cfg.peer1;
                    peer.mediaLine = ml1;
                    if (Transceiver.HasSend(peer.desiredDirection))
                    {
                        var source1 = pc1_go.AddComponent <UniformColorVideoSource>();
                        peer.source         = source1;
                        ml1.Source          = source1;
                        ml1.SenderTrackName = $"track{i}";
                    }
                    if (Transceiver.HasRecv(peer.desiredDirection))
                    {
                        var receiver1 = pc1_go.AddComponent <VideoReceiver>();
                        peer.receiver = receiver1;
                        ml1.Receiver  = receiver1;
                    }
                }

                {
                    MediaLine ml2  = pc2.AddMediaLine(MediaKind.Video);
                    var       peer = cfg.peer2;
                    peer.mediaLine = ml2;
                    if (Transceiver.HasSend(peer.desiredDirection))
                    {
                        var source2 = pc2_go.AddComponent <UniformColorVideoSource>();
                        peer.source         = source2;
                        ml2.Source          = source2;
                        ml2.SenderTrackName = $"track{i}";
                    }
                    if (Transceiver.HasRecv(peer.desiredDirection))
                    {
                        var receiver2 = pc2_go.AddComponent <VideoReceiver>();
                        peer.receiver = receiver2;
                        ml2.Receiver  = receiver2;
                    }
                }
            }

            // Activate
            pc1_go.SetActive(true);
            pc2_go.SetActive(true);

            // Initialize
            var initializedEvent1 = new ManualResetEventSlim(initialState: false);

            pc1.OnInitialized.AddListener(() => initializedEvent1.Set());
            Assert.IsNull(pc1.Peer);
            pc1.InitializeAsync().Wait(millisecondsTimeout: 50000);
            var initializedEvent2 = new ManualResetEventSlim(initialState: false);

            pc2.OnInitialized.AddListener(() => initializedEvent2.Set());
            Assert.IsNull(pc2.Peer);
            pc2.InitializeAsync().Wait(millisecondsTimeout: 50000);

            // Wait a frame so that the Unity event OnInitialized can propagate
            yield return(null);

            // Check the event was raised
            Assert.IsTrue(initializedEvent1.Wait(millisecondsTimeout: 50000));
            Assert.IsNotNull(pc1.Peer);
            Assert.IsTrue(initializedEvent2.Wait(millisecondsTimeout: 50000));
            Assert.IsNotNull(pc2.Peer);

            // Confirm the sources are ready
            for (int i = 0; i < NumTransceivers; ++i)
            {
                var cfg = cfgs[i];
                if (cfg.peer1.expectSender)
                {
                    Assert.IsNotNull(cfg.peer1.source, $"Missing source #{i} on Peer #1");
                    Assert.IsNotNull(cfg.peer1.source.IsStreaming, $"Source #{i} is not ready on Peer #1");
                    Assert.IsNull(cfg.peer1.mediaLine.SenderTrack); // created during connection
                }
                if (cfg.peer2.expectSender)
                {
                    Assert.IsNotNull(cfg.peer2.source, $"Missing source #{i} on Peer #2");
                    Assert.IsNotNull(cfg.peer2.source.IsStreaming, $"Source #{i} is not ready on Peer #2");
                    Assert.IsNull(cfg.peer2.mediaLine.SenderTrack); // created during connection
                }
            }

            // Connect
            Assert.IsTrue(sig.StartConnection());
            yield return(sig.WaitForConnection(millisecondsTimeout: 60000));

            Assert.IsTrue(sig.IsConnected);

            // Wait a frame so that the Unity events for streams started can propagate
            yield return(null);

            // Check pairing
            Assert.AreEqual(numLocal1, pc1.Peer.LocalVideoTracks.Count());
            Assert.AreEqual(numRemote1, pc1.Peer.RemoteVideoTracks.Count());
            Assert.AreEqual(numLocal2, pc2.Peer.LocalVideoTracks.Count());
            Assert.AreEqual(numRemote2, pc2.Peer.RemoteVideoTracks.Count());
            for (int i = 0; i < NumTransceivers; ++i)
            {
                var cfg = cfgs[i];
                if (cfg.peer1.expectSender)
                {
                    Assert.IsNotNull(cfg.peer1.mediaLine.SenderTrack, $"Transceiver #{i} missing local sender track on Peer #1");
                }
                if (cfg.peer1.expectReceiver)
                {
                    Assert.IsNotNull(cfg.peer1.receiver.Track, $"Transceiver #{i} missing remote track on Peer #1");
                }
                if (cfg.peer2.expectSender)
                {
                    Assert.IsNotNull(cfg.peer2.mediaLine.SenderTrack, $"Transceiver #{i} missing local sender track on Peer #2");
                }
                if (cfg.peer2.expectReceiver)
                {
                    Assert.IsNotNull(cfg.peer2.receiver.Track, $"Transceiver #{i} Missing remote track on Peer #2");
                }
            }

            // Change the senders and receivers and transceivers direction
            //        old            new
            //     P1     P2      P1     P2
            // 0 : S   =>  R          =   R     P1 stops sending
            // 1 : SR <=> SR      SR  =>  R     P2 stops sending
            // 2 : S   => SR      SR <=> SR     P1 starts receiving
            // 3 :  R <=  SR      SR <=> SR     P1 starts sending
            // 4 : S   =>  R      S   =         P2 stops receiving

            numLocal1  = 4;
            numRemote1 = 2;
            numLocal2  = 2;
            numRemote2 = 3;

            // #0 - P1 stops sending
            {
                var cfg = cfgs[0];
                cfg.peer1.mediaLine.Source = null;
                cfg.peer1.expectSender     = false;
                cfg.peer1.expectReceiver   = false;
                cfg.peer2.expectSender     = false;
                cfg.peer2.expectReceiver   = false;
            }

            // #1 - P2 stops sending
            {
                var cfg = cfgs[1];
                cfg.peer2.mediaLine.Source = null;
                cfg.peer1.expectSender     = true;
                cfg.peer1.expectReceiver   = false;
                cfg.peer2.expectSender     = false;
                cfg.peer2.expectReceiver   = true;
            }

            // #2 - P1 starts receiving
            {
                var cfg       = cfgs[2];
                var receiver2 = pc2_go.AddComponent <VideoReceiver>();
                cfg.peer1.receiver           = receiver2;
                cfg.peer1.mediaLine.Receiver = receiver2;
                cfg.peer1.expectSender       = true;
                cfg.peer1.expectReceiver     = true;
                cfg.peer2.expectSender       = true;
                cfg.peer2.expectReceiver     = true;
            }

            // #3 - P1 starts sending
            {
                var cfg     = cfgs[3];
                var source1 = pc1_go.AddComponent <UniformColorVideoSource>();
                cfg.peer1.source           = source1;
                cfg.peer1.mediaLine.Source = source1;
                cfg.peer1.expectSender     = true;
                cfg.peer1.expectReceiver   = true;
                cfg.peer2.expectSender     = true;
                cfg.peer2.expectReceiver   = true;
            }

            // #4 - P2 stops receiving
            {
                var cfg = cfgs[4];
                cfg.peer2.mediaLine.Receiver = null;
                cfg.peer1.expectSender       = false;
                cfg.peer1.expectReceiver     = false;
                cfg.peer2.expectSender       = false;
                cfg.peer2.expectReceiver     = false;
            }

            // Renegotiate
            Assert.IsTrue(sig.StartConnection());
            yield return(sig.WaitForConnection(millisecondsTimeout: 60000));

            Assert.IsTrue(sig.IsConnected);

            // Wait a frame so that the Unity events for streams started can propagate
            yield return(null);

            // Check pairing
            Assert.AreEqual(numLocal1, pc1.Peer.LocalVideoTracks.Count());
            Assert.AreEqual(numRemote1, pc1.Peer.RemoteVideoTracks.Count());
            Assert.AreEqual(numLocal2, pc2.Peer.LocalVideoTracks.Count());
            Assert.AreEqual(numRemote2, pc2.Peer.RemoteVideoTracks.Count());
            for (int i = 0; i < NumTransceivers; ++i)
            {
                var cfg = cfgs[i];
                if (cfg.peer1.expectReceiver)
                {
                    Assert.IsNotNull(cfg.peer1.receiver.Track, $"Transceiver #{i} missing remote track on Peer #1");
                }
                if (cfg.peer2.expectReceiver)
                {
                    Assert.IsNotNull(cfg.peer2.receiver.Track, $"Transceiver #{i} Missing remote track on Peer #2");
                }
            }
        }