Example #1
0
        public async void RpcStream()
        {
            using (var call = client.EventStream())
            {
                var responseReaderTask = Task.Run(async() =>
                {
                    while (await call.ResponseStream.MoveNext())
                    {
                        var serverMessage = call.ResponseStream.Current;
                        _eventManager.Publish(new InboundEvent(_workerId, serverMessage));
                    }
                });
                _outboundEventSubscriptions.Add(_workerId, _eventManager.OfType <OutboundEvent>()
                                                .Where(evt => evt.WorkerId == _workerId)
                                                .ObserveOn(NewThreadScheduler.Default)
                                                .Subscribe(evt =>
                {
                    call.RequestStream.WriteAsync(evt.Message).GetAwaiter().GetResult();
                }));
                StartStream str = new StartStream()
                {
                    WorkerId = _workerId
                };
                StreamingMessage startStream = new StreamingMessage()
                {
                    StartStream = str
                };
                await call.RequestStream.WriteAsync(startStream);

                await responseReaderTask;
            }
        }
Example #2
0
        /// <summary>
        /// Multiple threads are required in order to send and receive streamed data if the user interface is going to be responsive.
        /// The best way I could seperate the visual content from the multiple threads required to send and receive streamed data was via the use
        /// of delegates. I could have passed the classes in such as MainWindow or mP2P, however this would have greatly increased the dependencies.
        /// By using delegates this class can stand on it's own without using MainWindow or mP2P.
        /// </summary>
        /// <param name="nodeName">This Node's name</param>
        /// <param name="threadFinishedDelegate">The delegate to respond when the Thread has finished (this will only happen when it is canceled via </param>
        public StreamingHttpListener(String uniqueStreamName, WorkerThreadFinished threadFinishedDelegate,
                                     LogMessage msg, StartStream startStream, SendStream sendStream)
        {
            mLogMessage       = msg;
            mUniqueStreamName = uniqueStreamName;
            mStartStream      = startStream;
            mSendStream       = sendStream;

            //start the audioHttpListenerThread. This thread contains the AudioHttpServer and responds to requests from
            //the mAudioPlayer
            mHttpListenerThread                            = new System.ComponentModel.BackgroundWorker();
            mHttpListenerThread.DoWork                    += new System.ComponentModel.DoWorkEventHandler(PseudoHttpServer);
            mHttpListenerThread.RunWorkerCompleted        += new System.ComponentModel.RunWorkerCompletedEventHandler(threadFinishedDelegate);
            mHttpListenerThread.WorkerSupportsCancellation = true;
            mHttpListenerThread.RunWorkerAsync(null);

            //initialize the audio parameters.
            mIncommingStream          = false;
            mSyncStreamLastWrittenPos = 0;
            mPseudoStream             = new MemoryStream();
            mSyncStream = Stream.Synchronized(mPseudoStream);
            mHashTable  = new System.Collections.Hashtable();

            mTimer = new Timer(new TimerCallback(TimerCallback));
            mTimer.Change(0, 3500);//every 3500ms get a callback
        }
Example #3
0
        public void SharedMemoryDataTransferSetting_VerifyDisabledIfEnvironmentVariableAbsent()
        {
            // Enable shared memory data transfer capability in the worker
            IDictionary <string, string> capabilities = new Dictionary <string, string>()
            {
                { RpcWorkerConstants.SharedMemoryDataTransfer, "1" }
            };

            StartStream startStream = new StartStream()
            {
                WorkerId = _workerId
            };

            StreamingMessage startStreamMessage = new StreamingMessage()
            {
                StartStream = startStream
            };

            // Send worker init request and enable the capabilities
            GrpcEvent rpcEvent = new GrpcEvent(_workerId, startStreamMessage);

            _workerChannel.SendWorkerInitRequest(rpcEvent);
            _testFunctionRpcService.PublishWorkerInitResponseEvent(capabilities);

            Assert.False(_workerChannel.IsSharedMemoryDataTransferEnabled());
        }
Example #4
0
        public void SendLoadRequestCollection_PublishesOutboundEvents()
        {
            StartStream startStream = new StartStream()
            {
                WorkerId = _workerId
            };
            StreamingMessage startStreamMessage = new StreamingMessage()
            {
                StartStream = startStream
            };
            GrpcEvent rpcEvent = new GrpcEvent(_workerId, startStreamMessage);

            _workerChannel.SendWorkerInitRequest(rpcEvent);
            _testFunctionRpcService.PublishWorkerInitResponseEvent(new Dictionary <string, string>()
            {
                { RpcWorkerConstants.AcceptsListOfFunctionLoadRequests, "true" }
            });
            _metricsLogger.ClearCollections();
            IEnumerable <FunctionMetadata> functionMetadata = GetTestFunctionsList("node");

            _workerChannel.SetupFunctionInvocationBuffers(functionMetadata);
            _workerChannel.SendFunctionLoadRequests(null, TimeSpan.FromMinutes(5));
            var traces           = _logger.GetLogMessages();
            var functionLoadLogs = traces.Where(m => string.Equals(m.FormattedMessage, _expectedLogMsg));

            AreExpectedMetricsGenerated();
            Assert.True(functionLoadLogs.Count() == 2);
            Assert.True(traces.Any(m => string.Equals(m.FormattedMessage, string.Format("Sending FunctionLoadRequestCollection with number of functions:'{0}'", functionMetadata.ToList().Count))));
        }
        public async Task SendStartStreamMessageAsync(IClientStreamWriter <StreamingMessage> requestStream)
        {
            StartStream str = new StartStream()
            {
                WorkerId = _options.WorkerId
            };

            StreamingMessage startStream = new StreamingMessage()
            {
                StartStream = str
            };

            await requestStream.WriteAsync(startStream);
        }
Example #6
0
        public void PublishStartStreamEvent(string workerId)
        {
            StatusResult statusResult = new StatusResult()
            {
                Status = StatusResult.Types.Status.Success
            };
            StartStream startStream = new StartStream()
            {
                WorkerId = workerId
            };
            StreamingMessage responseMessage = new StreamingMessage()
            {
                StartStream = startStream
            };

            _eventManager.Publish(new InboundGrpcEvent(_workerId, responseMessage));
        }
Example #7
0
        public void SendWorkerInitRequest_PublishesOutboundEvent()
        {
            StartStream startStream = new StartStream()
            {
                WorkerId = _workerId
            };
            StreamingMessage startStreamMessage = new StreamingMessage()
            {
                StartStream = startStream
            };
            RpcEvent rpcEvent = new RpcEvent(_workerId, startStreamMessage);

            _workerChannel.SendWorkerInitRequest(rpcEvent);
            var traces = _logger.GetLogMessages();

            Assert.True(traces.Any(m => string.Equals(m.FormattedMessage, _expectedLogMsg)));
        }
Example #8
0
        public void StartStreamBxmlVerbTest()
        {
            var expected    = "<?xml version=\"1.0\" encoding=\"utf-8\"?><Response>  <StartStream destination=\"https://www.test.com/stream\" name=\"test_stream\" tracks=\"inbound\" streamEventUrl=\"https://www.test.com/event\" streamEventMethod=\"POST\" username=\"username\" password=\"password\" /></Response>";
            var startStream = new StartStream();

            startStream.Destination       = "https://www.test.com/stream";
            startStream.Name              = "test_stream";
            startStream.Tracks            = "inbound";
            startStream.StreamEventUrl    = "https://www.test.com/event";
            startStream.StreamEventMethod = "POST";
            startStream.Username          = "******";
            startStream.Password          = "******";

            var response = new Response(startStream);
            var actual   = response.ToBXML();

            Assert.Equal(expected, actual);
        }
Example #9
0
        public void SendWorkerInitRequest_PublishesOutboundEvent_V2Compatable()
        {
            _testEnvironment.SetEnvironmentVariable(EnvironmentSettingNames.FunctionsV2CompatibilityModeKey, "true");
            StartStream startStream = new StartStream()
            {
                WorkerId = _workerId
            };
            StreamingMessage startStreamMessage = new StreamingMessage()
            {
                StartStream = startStream
            };
            RpcEvent rpcEvent = new RpcEvent(_workerId, startStreamMessage);

            _workerChannel.SendWorkerInitRequest(rpcEvent);
            _testFunctionRpcService.PublishWorkerInitResponseEvent();
            var traces = _logger.GetLogMessages();

            Assert.True(traces.Any(m => string.Equals(m.FormattedMessage, _expectedLogMsg)));
            Assert.True(traces.Any(m => string.Equals(m.FormattedMessage, "Worker and host running in V2 compatibility mode")));
        }
Example #10
0
        public Dvd9Xbox360 Load(Stream Stream)
        {
            //Console.WriteLine("{0}", Stream.Length);

            Stream StartStream;
            var    MediaHeader = default(MediaHeaderStruct);
            bool   Valid       = false;

            foreach (var TrySector in new[] {
                XDVDFS_SECTOR_XBOX360,
                XDVDFS_SECTOR_XBOX360_3
            })
            {
                IsoStream   = GetStreamByLBA(Stream, TrySector);
                StartStream = GetStreamByLBA(IsoStream, 0x20);
                //Console.WriteLine("{0}", StartStream.Length);
                MediaHeader = StartStream.ReadStruct <MediaHeaderStruct>();
                if (MediaHeader.IsValid)
                {
                    Valid = true;
                    break;
                }
            }

            if (!Valid)
            {
                throw (new Exception("Invalid Xbox360 ISO Image (2)"));
            }

            RootEntry = new Entry();

            //Console.WriteLine("{0:X}", (XDVDFS_SECTOR_XBOX360 + MediaHeader.RootSector) * SECTOR_SIZE);
            LoadProcessNode(
                IsoStream: IsoStream,
                RootStream: GetStreamByLBA(IsoStream, MediaHeader.RootSector, MediaHeader.RootSize),
                EntryParent: RootEntry
                );

            return(this);
        }
Example #11
0
        public async Task <bool> RpcStream()
        {
            StartStream str = new StartStream()
            {
                WorkerId = _workerId
            };
            StreamingMessage startStream = new StreamingMessage()
            {
                StartStream = str
            };
            await _call.RequestStream.WriteAsync(startStream);

            var consumer = Task.Run(async() =>
            {
                foreach (var rpcWriteMsg in _blockingCollectionQueue.GetConsumingEnumerable())
                {
                    await _call.RequestStream.WriteAsync(rpcWriteMsg);
                }
            });
            await consumer;

            return(true);
        }
Example #12
0
        public void SharedMemoryDataTransferSetting_VerifyDisabledIfWorkerCapabilityAbsent()
        {
            // Enable shared memory data transfer in the environment
            _testEnvironment.SetEnvironmentVariable(RpcWorkerConstants.FunctionsWorkerSharedMemoryDataTransferEnabledSettingName, "1");

            StartStream startStream = new StartStream()
            {
                WorkerId = _workerId
            };

            StreamingMessage startStreamMessage = new StreamingMessage()
            {
                StartStream = startStream
            };

            // Send worker init request and enable the capabilities
            GrpcEvent rpcEvent = new GrpcEvent(_workerId, startStreamMessage);

            _workerChannel.SendWorkerInitRequest(rpcEvent);
            _testFunctionRpcService.PublishWorkerInitResponseEvent();

            Assert.False(_workerChannel.IsSharedMemoryDataTransferEnabled());
        }