public SessionContractMetadata(Type contract, ActionMetadata initSession, ActionMetadata destroySession)
        {
            if (contract == null) throw new ArgumentNullException(nameof(contract));
            if (initSession == null) throw new ArgumentNullException(nameof(initSession));
            if (destroySession == null) throw new ArgumentNullException(nameof(destroySession));

            Contract = contract;
            InitSession = initSession;
            DestroySession = destroySession;
        }
        public virtual async Task HandleContractMetadataAsync(ServerActionContext context)
        {
            try
            {
                string result;
                string actionName = context.HttpContext.Request.Query["action"];

                Bolt.Metadata.ActionMetadata action = null;
                if (!string.IsNullOrEmpty(actionName))
                {
                    action = _actionResolver.Resolve(context.Contract, actionName.AsReadOnlySpan());
                }

                if (action == null)
                {
                    var contractMetadata = CrateContractMetadata(context);
                    result = JsonConvert.SerializeObject(contractMetadata, Formatting.Indented, CreateSettings());
                }
                else
                {
                    context.Action = action;
                    ActionMetadata actionMetadata = new ActionMetadata();

                    if (context.Action.HasSerializableParameters)
                    {
                        actionMetadata.Parameters = context.Action.Parameters.Where(p => p.IsSerializable).Select(p => p.Name).ToArray();
                    }

                    if (context.Action.HasResult)
                    {
                        actionMetadata.Response = context.Action.ResultType.Name;
                    }

                    result = JsonConvert.SerializeObject(actionMetadata, Formatting.Indented, CreateSettings());
                }

                context.HttpContext.Response.ContentType = "application/json";
                context.HttpContext.Response.StatusCode  = 200;
                await context.HttpContext.Response.WriteAsync(result);
            }
            catch (Exception e)
            {
                Logger.LogWarning(
                    BoltLogId.HandleContractMetadataError,
                    "Failed to generate Bolt metadata for contract '{0}'. Error: {1}",
                    context.Contract.Name,
                    e);
            }
        }
 public SessionContractMetadata(Type contract, ActionMetadata initSession, ActionMetadata destroySession)
 {
     Contract       = contract ?? throw new ArgumentNullException(nameof(contract));
     InitSession    = initSession ?? throw new ArgumentNullException(nameof(initSession));
     DestroySession = destroySession ?? throw new ArgumentNullException(nameof(destroySession));
 }