/// <inheritdoc /> public virtual async Task <string> ProcessRequestAsync(IAgentContext agentContext, ConnectionRequestMessage request, ConnectionRecord connection) { Logger.LogInformation(LoggingEvents.ProcessConnectionRequest, "Did {0}", request.Connection.Did); var my = await Did.CreateAndStoreMyDidAsync(agentContext.Wallet, "{}"); //TODO throw exception or a problem report if the connection request features a did doc that has no indy agent did doc convention featured //i.e there is no way for this agent to respond to messages. And or no keys specified await Did.StoreTheirDidAsync(agentContext.Wallet, new { did = request.Connection.Did, verkey = request.Connection.DidDoc.Keys[0].PublicKeyBase58 }.ToJson()); if (request.Connection.DidDoc.Services != null && request.Connection.DidDoc.Services.Count > 0 && request.Connection.DidDoc.Services[0] is IndyAgentDidDocService service) { connection.Endpoint = new AgentEndpoint(service.ServiceEndpoint, null, service.RoutingKeys != null && service.RoutingKeys.Count > 0 ? service.RoutingKeys.ToArray() : null); } connection.TheirDid = request.Connection.Did; connection.TheirVk = request.Connection.DidDoc.Keys[0].PublicKeyBase58; connection.MyDid = my.Did; connection.MyVk = my.VerKey; connection.SetTag(TagConstants.LastThreadId, request.Id); if (connection.Alias == null) { connection.Alias = new ConnectionAlias(); } if (!string.IsNullOrEmpty(request.Label) && string.IsNullOrEmpty(connection.Alias.Name)) { connection.Alias.Name = request.Label; } if (!string.IsNullOrEmpty(request.ImageUrl) && string.IsNullOrEmpty(connection.Alias.ImageUrl)) { connection.Alias.ImageUrl = request.ImageUrl; } if (!connection.MultiPartyInvitation) { await connection.TriggerAsync(ConnectionTrigger.Request); await RecordService.UpdateAsync(agentContext.Wallet, connection); EventAggregator.Publish(new ServiceMessageProcessingEvent { RecordId = connection.Id, MessageType = request.Type, ThreadId = request.GetThreadId() }); return(connection.Id); } else { var newConnection = connection.DeepCopy(); newConnection.Id = Guid.NewGuid().ToString(); newConnection.MultiPartyInvitation = false; await newConnection.TriggerAsync(ConnectionTrigger.Request); await RecordService.AddAsync(agentContext.Wallet, newConnection); EventAggregator.Publish(new ServiceMessageProcessingEvent { RecordId = newConnection.Id, MessageType = request.Type, ThreadId = request.GetThreadId() }); return(newConnection.Id); } }