public VaspSessionsManager(
            VaspClient vaspClient,
            IVaspCallbacks vaspCallbacks)
        {
            _vaspClient = vaspClient;

            _originatorVaspCallbacks = new OriginatorVaspCallbacks(
                async(message, originatorSession) =>
            {
                await vaspCallbacks.SessionReplyMessageReceivedAsync(originatorSession.SessionId, message);
            },
                async(message, originatorSession) =>
            {
                await vaspCallbacks.TransferReplyMessageReceivedAsync(originatorSession.SessionId, message);
                if (message.Message.MessageCode == "5")     //todo: handle properly.
                {
                    await originatorSession.TerminateAsync(TerminationMessage.TerminationMessageCode.SessionClosedTransferOccured);
                    originatorSession.Wait();
                }
            },
                async(message, originatorSession) =>
            {
                await vaspCallbacks.TransferConfirmationMessageReceivedAsync(originatorSession.SessionId, message);
                await originatorSession.TerminateAsync(TerminationMessage.TerminationMessageCode.SessionClosedTransferOccured);
                originatorSession.Wait();
            });

            IVaspMessageHandler vaspMessageHandler = new VaspMessageHandlerCallbacks(
                vaspInfo => Task.FromResult(true),
                async(request, currentSession) =>
            {
                _beneficiarySessions[currentSession.SessionId] = currentSession as BeneficiarySession;
                await vaspCallbacks.TransferRequestMessageReceivedAsync(currentSession.SessionId, request);
                return(null);
            },
                async(dispatch, currentSession) =>
            {
                await vaspCallbacks.TransferDispatchMessageReceivedAsync(currentSession.SessionId, dispatch);
                return(null);
            });

            _vaspClient.RunListener(vaspMessageHandler);
        }
        /// <summary>
        /// Create a session and send a request session message to beneficiary Vasp.
        /// </summary>
        /// <param name="originator">Information about a client who sends a transfer</param>
        /// <param name="beneficiaryVaan">Information about a receiver of the transfer</param>
        /// <returns>OriginatorSession through which transfer request and transfer dispatch should be requested.</returns>
        public async Task <OriginatorSession> CreateSessionAsync(
            Originator originator,
            VirtualAssetsAccountNumber beneficiaryVaan,
            IOriginatorVaspCallbacks _originatorVaspCallbacks)
        {
            string counterPartyVaspContractAddress = await _ensProvider.GetContractAddressByVaspCodeAsync(beneficiaryVaan.VaspCode);

            var contractInfo = await _ethereumRpc.GetVaspContractInfoAync(counterPartyVaspContractAddress);

            var sessionKey = ECDH_Key.GenerateKey();
            var sharedKey  = sessionKey.GenerateSharedSecretHex(contractInfo.HandshakeKey);

            var session = new OriginatorSession(
                originator,
                this._vaspContractInfo,
                this.VaspInfo,
                beneficiaryVaan,
                contractInfo.SigningKey,
                contractInfo.HandshakeKey,
                sharedKey,
                sessionKey.PublicKey,
                this._signatureKey,
                _whisperRpc,
                _transportClient,
                _signService,
                _originatorVaspCallbacks);

            if (_originatorSessionsDict.TryAdd(session.SessionId, session))
            {
                this.NotifySessionCreated(session);
                session.OnSessionTermination += this.ProcessSessionTermination;
                await session.StartAsync();

                return(session);
            }

            await session.TerminateAsync(TerminationMessage.TerminationMessageCode
                                         .SessionClosedTransferCancelledByOriginator);

            //TODO: process it as exception or retry
            return(null);
        }
示例#3
0
        public OriginatorSession(
            Originator originator,
            VaspContractInfo originatorVaspContractInfo,
            VaspInformation originatorVasp,
            VirtualAssetsAccountNumber beneficiaryVaan,
            string beneficiaryPubSigningKey,
            string beneficiaryPubHandshakeKey,
            string sharedEncryptionKey,
            string pubEncryptionKey,
            string privateSigningKey,
            IWhisperRpc whisperRpc,
            ITransportClient transportClient,
            ISignService signService,
            IOriginatorVaspCallbacks originatorVaspCallbacks)
        //IEnsProvider ensProvider)
            : base(
                originatorVaspContractInfo,
                originatorVasp,
                beneficiaryPubSigningKey,
                sharedEncryptionKey,
                privateSigningKey,
                whisperRpc,
                transportClient,
                signService)
        {
            this._beneficiaryVaan            = beneficiaryVaan;
            this.SessionId                   = Guid.NewGuid().ToString();
            this._beneficiaryPubHandshakeKey = beneficiaryPubHandshakeKey;
            this._pubEncryptionKey           = pubEncryptionKey;
            this._originatorVaspCallbacks    = originatorVaspCallbacks;
            //this._ensProvider = ensProvider;
            this._originator = originator;

            _messageHandlerResolverBuilder.AddHandler(typeof(SessionReplyMessage),
                                                      new SessionReplyMessageHandler((sessionReplyMessage, token) =>
            {
                this.CounterPartyTopic = sessionReplyMessage.HandShake.TopicB;
                return(_originatorVaspCallbacks.SessionReplyMessageHandlerAsync(sessionReplyMessage, this));
            }));

            _messageHandlerResolverBuilder.AddHandler(typeof(TransferReplyMessage),
                                                      new TransferReplyMessageHandler((transferReplyMessage, token) =>
            {
                return(_originatorVaspCallbacks.TransferReplyMessageHandlerAsync(transferReplyMessage, this));
            }));

            _messageHandlerResolverBuilder.AddHandler(typeof(TransferConfirmationMessage),
                                                      new TransferConfirmationMessageHandler((transferDispatchMessage, token) =>
            {
                return(_originatorVaspCallbacks.TransferConfirmationMessageHandlerAsync(transferDispatchMessage,
                                                                                        this));
            }));

            _messageHandlerResolverBuilder.AddHandler(typeof(TerminationMessage),
                                                      new TerminationMessageHandler(async(message, token) =>
            {
                _hasReceivedTerminationMessage = true;

                await TerminateAsync(message.GetMessageCode());
            }));
        }