예제 #1
0
        /// <summary>
        /// Perform the basic initialization workflow
        /// </summary>
        /// <returns></returns>
        private async Task InitializeClient()
        {
            // Request initialization
            var deferred     = new RelayDeferredTransaction(_options.transactionTimeout);
            var deferredTask = _transactionManager.WaitFor(deferred);
            await _eventStream.Send(new InitializeClient()
            {
                transaction_id = deferred.TransactionId,
                metadata       = _options.metadata
            });

            // Wait for response
            try
            {
                await deferredTask;
            }
            catch (Exception error)
            {
                _eventHandler.OnError(new RelayException(RelayErrorCode.InitializationFailed, error));
                return;
            }

            // Try to join a session
            deferred     = new RelayDeferredTransaction(_options.transactionTimeout);
            deferredTask = _transactionManager.WaitFor(deferred);
            await _eventStream.Send(new Join()
            {
                transaction_id = deferred.TransactionId,
                session_id     = _options.sessionId
            });

            // Wait for response
            try
            {
                await deferredTask;
            }
            catch (Exception error)
            {
                _eventHandler.OnError(new RelayException(RelayErrorCode.InitializationFailed, error));
                return;
            }

            // Finally, we're connected
            _eventHandler.OnConnected();
        }
예제 #2
0
        /// <summary>
        /// Send a message to the master
        /// </summary>
        public async Task Send <T>(T data)
        {
            if (_eventStream == null)
            {
                throw new Exception("Not connected");
            }

            // Send
            var output       = _serializer.Serialize(data);
            var deferred     = new RelayDeferredTransaction(_options.transactionTimeout);
            var deferredTask = _transactionManager.WaitFor(deferred);
            await _eventStream.Send(new MessageFromClient()
            {
                transaction_id = deferred.TransactionId,
                data           = output
            });

            // Wait for confirmation
            await deferredTask;
        }
예제 #3
0
        /// <summary>
        /// Perform the basic initialization workflow
        /// </summary>
        /// <returns></returns>
        private async Task InitializeMaster()
        {
            // Request initialization
            var deferred     = new RelayDeferredTransaction(_options.transactionTimeout);
            var deferredTask = _transactionManager.WaitFor(deferred);
            await _eventStream.Send(new InitializeMaster()
            {
                transaction_id = deferred.TransactionId,
                metadata       = _options.metadata
            });

            // Wait for response
            try
            {
                await deferredTask;
            }
            catch (Exception error)
            {
                _eventHandler.OnError(new RelayException(RelayErrorCode.InitializationFailed, error));
            }
        }