/// <inheritdoc /> public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { var item = JObject.Load(reader); var(_, messageType) = MessageUtils.ParseMessageType(item["@type"].ToObject <string>()); IEnvelopeMessage message; switch (messageType) { case MessageTypes.Forward: message = new ForwardEnvelopeMessage(); break; case MessageTypes.ForwardToKey: message = new ForwardToKeyEnvelopeMessage(); break; default: throw new TypeLoadException("Unsupported serialization type."); } serializer.Populate(item.CreateReader(), message); return(message); }
/// <inheritdoc /> public virtual async Task <string> AcceptInvitationAsync(Wallet wallet, ConnectionInvitationMessage invitation) { Logger.LogInformation(LoggingEvents.AcceptInvitation, "Key {0}, Endpoint {1}", invitation.ConnectionKey, invitation.Endpoint.Uri); var my = await Did.CreateAndStoreMyDidAsync(wallet, "{}"); var connection = new ConnectionRecord { Endpoint = invitation.Endpoint, MyDid = my.Did, MyVk = my.VerKey, ConnectionId = Guid.NewGuid().ToString().ToLowerInvariant() }; connection.Tags.Add(TagConstants.MyDid, my.Did); if (!string.IsNullOrEmpty(invitation.Name) || !string.IsNullOrEmpty(invitation.ImageUrl)) { connection.Alias = new ConnectionAlias { Name = invitation.Name, ImageUrl = invitation.ImageUrl }; if (string.IsNullOrEmpty(invitation.Name)) { connection.Tags.Add(TagConstants.Alias, invitation.Name); } } await connection.TriggerAsync(ConnectionTrigger.InvitationAccept); await RecordService.AddAsync(wallet, connection); var provisioning = await ProvisioningService.GetProvisioningAsync(wallet); var connectionDetails = new ConnectionDetails { Did = my.Did, Verkey = my.VerKey, Endpoint = provisioning.Endpoint }; var request = await MessageSerializer.PackSealedAsync <ConnectionRequestMessage>(connectionDetails, wallet, my.VerKey, invitation.ConnectionKey); request.Key = invitation.ConnectionKey; request.Type = MessageUtils.FormatKeyMessageType(invitation.ConnectionKey, MessageTypes.ConnectionRequest); var forwardMessage = new ForwardToKeyEnvelopeMessage { Type = MessageUtils.FormatKeyMessageType(invitation.ConnectionKey, MessageTypes.ForwardToKey), Content = request.ToJson() }; await RouterService.ForwardAsync(forwardMessage, invitation.Endpoint); return(connection.GetId()); }