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