Esempio n. 1
0
        /// <inheritdoc/>
        public override async ValueTask<TResponse> InvokeBindingAsync<TRequest, TResponse>(
            string name,
            string operation,
            TRequest data,
            Dictionary<string, string> metadata = default,
            CancellationToken cancellationToken = default)
        {
            ArgumentVerifier.ThrowIfNullOrEmpty(name, nameof(name));
            ArgumentVerifier.ThrowIfNullOrEmpty(operation, nameof(operation));

            Autogenerated.InvokeBindingResponse response = await MakeInvokeBindingRequestAsync(name, operation, data, metadata, cancellationToken);
            return ConvertFromInvokeBindingResponse<TResponse>(response, this.jsonSerializerOptions);
        }
 public override Task PublishEventAsync <TData>(
     string pubsubName,
     string topicName,
     TData data,
     Dictionary <string, string> metadata,
     CancellationToken cancellationToken = default)
 {
     ArgumentVerifier.ThrowIfNullOrEmpty(pubsubName, nameof(pubsubName));
     ArgumentVerifier.ThrowIfNullOrEmpty(topicName, nameof(topicName));
     ArgumentVerifier.ThrowIfNull(data, nameof(data));
     ArgumentVerifier.ThrowIfNull(metadata, nameof(metadata));
     return(MakePublishRequest(pubsubName, topicName, data, metadata, cancellationToken));
 }
Esempio n. 3
0
        public override async ValueTask <TResponse> InvokeMethodAsync <TResponse>(
            string appId,
            string methodName,
            HTTPExtension httpExtension         = default,
            CancellationToken cancellationToken = default)
        {
            ArgumentVerifier.ThrowIfNullOrEmpty(appId, nameof(appId));
            ArgumentVerifier.ThrowIfNullOrEmpty(methodName, nameof(methodName));

            var response = await this.MakeInvokeRequestAsync(appId, methodName, null, httpExtension, cancellationToken);

            return(response.Data.Value.IsEmpty ? default : TypeConverters.FromAny <TResponse>(response.Data, this.jsonSerializerOptions));
        }
Esempio n. 4
0
        /// <inheritdoc/>
        public override async Task <TValue> GetStateAsync <TValue>(
            string storeName,
            string key,
            ConsistencyMode?consistencyMode = default,
            IReadOnlyDictionary <string, string> metadata = default,
            CancellationToken cancellationToken           = default)
        {
            ArgumentVerifier.ThrowIfNullOrEmpty(storeName, nameof(storeName));
            ArgumentVerifier.ThrowIfNullOrEmpty(key, nameof(key));

            var envelope = new Autogenerated.GetStateRequest()
            {
                StoreName = storeName,
                Key       = key,
            };

            if (metadata != null)
            {
                foreach (var kvp in metadata)
                {
                    envelope.Metadata.Add(kvp.Key, kvp.Value);
                }
            }

            if (consistencyMode != null)
            {
                envelope.Consistency = GetStateConsistencyForConsistencyMode(consistencyMode.Value);
            }

            var options = CreateCallOptions(headers: null, cancellationToken);

            Autogenerated.GetStateResponse response;

            try
            {
                response = await client.GetStateAsync(envelope, options);
            }
            catch (RpcException ex)
            {
                throw new DaprException("State operation failed: the Dapr endpoint indicated a failure. See InnerException for details.", ex);
            }

            try
            {
                return(TypeConverters.FromJsonByteString <TValue>(response.Data, this.JsonSerializerOptions));
            }
            catch (JsonException ex)
            {
                throw new DaprException("State operation failed: the state payload could not be deserialized. See InnerException for details.", ex);
            }
        }
Esempio n. 5
0
        public override Task <TValue> GetStateAsync <TValue>(string storeName, string key, ConsistencyMode?consistencyMode = default, IReadOnlyDictionary <string, string> metadata = default, CancellationToken cancellationToken = default)
        {
            ArgumentVerifier.ThrowIfNullOrEmpty(storeName, nameof(storeName));
            ArgumentVerifier.ThrowIfNullOrEmpty(key, nameof(key));

            if (this.State.TryGetValue(key, out var obj))
            {
                return(Task.FromResult((TValue)obj));
            }
            else
            {
                return(Task.FromResult(default(TValue)));
            }
        }
Esempio n. 6
0
        /// <inheritdoc/>
        public override Task PublishEventAsync <TData>(
            string pubsubName,
            string topicName,
            TData data,
            CancellationToken cancellationToken = default)
        {
            ArgumentVerifier.ThrowIfNullOrEmpty(pubsubName, nameof(pubsubName));
            ArgumentVerifier.ThrowIfNullOrEmpty(topicName, nameof(topicName));
            ArgumentVerifier.ThrowIfNull(data, nameof(data));

            var content = TypeConverters.ToJsonByteString(data, this.JsonSerializerOptions);

            return(MakePublishRequest(pubsubName, topicName, content, null, cancellationToken));
        }
Esempio n. 7
0
        /// <inheritdoc/>
        public override async Task InvokeBindingAsync <TRequest>(
            string bindingName,
            string operation,
            TRequest data,
            IReadOnlyDictionary <string, string> metadata = default,
            CancellationToken cancellationToken           = default)
        {
            ArgumentVerifier.ThrowIfNullOrEmpty(bindingName, nameof(bindingName));
            ArgumentVerifier.ThrowIfNullOrEmpty(operation, nameof(operation));

            var bytes = TypeConverters.ToJsonByteString <TRequest>(data, this.jsonSerializerOptions);

            _ = await MakeInvokeBindingRequestAsync(bindingName, operation, bytes, metadata, cancellationToken);
        }
Esempio n. 8
0
        public override async ValueTask <TResponse> InvokeMethodAsync <TResponse>(
            string appId,
            string methodName,
            Dictionary <string, string> metadata = default,
            CancellationToken cancellationToken  = default)
        {
            ArgumentVerifier.ThrowIfNullOrEmpty(appId, nameof(appId));
            ArgumentVerifier.ThrowIfNullOrEmpty(methodName, nameof(methodName));

            var response = await this.MakeInvokeRequestAsync(appId, methodName, null, metadata, cancellationToken);

            if (response.Data.Value.IsEmpty)
            {
                return(default);
Esempio n. 9
0
        public override async Task <IReadOnlyList <BulkStateItem> > GetBulkStateAsync(string storeName, IReadOnlyList <string> keys, int?parallelism, IReadOnlyDictionary <string, string> metadata = default, CancellationToken cancellationToken = default)
        {
            ArgumentVerifier.ThrowIfNullOrEmpty(storeName, nameof(storeName));
            if (keys.Count == 0)
            {
                throw new ArgumentException("keys do not contain any elements");
            }

            var envelope = new Autogenerated.GetBulkStateRequest()
            {
                StoreName   = storeName,
                Parallelism = parallelism ?? default
            };

            if (metadata != null)
            {
                foreach (var kvp in metadata)
                {
                    envelope.Metadata.Add(kvp.Key, kvp.Value);
                }
            }

            envelope.Keys.AddRange(keys);

            var options = CreateCallOptions(headers: null, cancellationToken);

            Autogenerated.GetBulkStateResponse response;

            try
            {
                response = await client.GetBulkStateAsync(envelope, options);
            }
            catch (RpcException ex)
            {
                throw new DaprException("State operation failed: the Dapr endpoint indicated a failure. See InnerException for details.", ex);
            }

            var bulkResponse = new List <BulkStateItem>();

            foreach (var item in response.Items)
            {
                bulkResponse.Add(new BulkStateItem(item.Key, item.Data.ToStringUtf8(), item.Etag));
            }

            return(bulkResponse);
        }
Esempio n. 10
0
        public override async Task <TResponse> InvokeMethodAsync <TResponse>(
            string appId,
            string methodName,
            HttpInvocationOptions httpOptions   = default,
            CancellationToken cancellationToken = default)
        {
            ArgumentVerifier.ThrowIfNullOrEmpty(appId, nameof(appId));
            ArgumentVerifier.ThrowIfNullOrEmpty(methodName, nameof(methodName));

            Autogenerated.InvokeServiceRequest request;
            CallOptions callOptions;

            (request, callOptions) = this.MakeInvokeRequestAsync(appId, methodName, null, httpOptions, cancellationToken);
            var response = await client.InvokeServiceAsync(request, callOptions);

            return(response.Data.Value.IsEmpty ? default : TypeConverters.FromAny <TResponse>(response.Data, this.jsonSerializerOptions));
        }
Esempio n. 11
0
        public override async Task InvokeMethodAsync <TRequest>(
            string appId,
            string methodName,
            TRequest data,
            HTTPExtension httpExtension         = default,
            CancellationToken cancellationToken = default)
        {
            ArgumentVerifier.ThrowIfNullOrEmpty(appId, nameof(appId));
            ArgumentVerifier.ThrowIfNullOrEmpty(methodName, nameof(methodName));

            Any serializedData = null;

            if (data != null)
            {
                serializedData = TypeConverters.ToAny(data, this.jsonSerializerOptions);
            }

            _ = await this.MakeInvokeRequestAsync(appId, methodName, serializedData, httpExtension, cancellationToken);
        }
Esempio n. 12
0
        public override async Task InvokeMethodAsync <TRequest>(
            string appId,
            string methodName,
            TRequest data,
            Dictionary <string, string> metadata = default,
            CancellationToken cancellationToken  = default)
        {
            ArgumentVerifier.ThrowIfNullOrEmpty(appId, nameof(appId));
            ArgumentVerifier.ThrowIfNullOrEmpty(methodName, nameof(methodName));

            Any serializedData = null;

            if (data != null)
            {
                serializedData = ConvertToAnyAsync(data, this.jsonSerializerOptions);
            }

            _ = await this.MakeInvokeRequestAsync(appId, methodName, serializedData, metadata, cancellationToken);
        }
Esempio n. 13
0
        public override Task <IReadOnlyList <BulkStateItem> > GetBulkStateAsync(string storeName, IReadOnlyList <string> keys, int?parallelism, IReadOnlyDictionary <string, string> metadata = default, CancellationToken cancellationToken = default)
        {
            ArgumentVerifier.ThrowIfNullOrEmpty(storeName, nameof(storeName));

            var response = new List <BulkStateItem>();

            foreach (var key in keys)
            {
                if (this.State.TryGetValue(key, out var obj))
                {
                    response.Add(new BulkStateItem(key, Encoding.UTF8.GetString(obj as byte[]), ""));
                }
                else
                {
                    response.Add(new BulkStateItem(key, "", ""));
                }
            }

            return(Task.FromResult <IReadOnlyList <BulkStateItem> >(response));
        }
Esempio n. 14
0
        public override async ValueTask<TResponse> InvokeMethodAsync<TRequest, TResponse>(
            string appId,
            string methodName,
            TRequest data,
            HTTPExtension httpExtension = default,
            CancellationToken cancellationToken = default)
        {
            ArgumentVerifier.ThrowIfNullOrEmpty(appId, nameof(appId));
            ArgumentVerifier.ThrowIfNullOrEmpty(methodName, nameof(methodName));

            var request = new InvocationRequest<TRequest>
            {
                AppId = appId,
                MethodName = methodName,
                Body = data,
                HttpExtension = httpExtension,
            };

            var invokeResponse = await this.MakeInvokeRequestAsyncWithResponse<TRequest, TResponse>(request, false, cancellationToken);
            return invokeResponse.Body;
        }
Esempio n. 15
0
        public override async Task<InvocationResponse<byte[]>> InvokeMethodRawAsync(
           string appId,
           string methodName,
           byte[] data,
           HTTPExtension httpExtension = default,
           CancellationToken cancellationToken = default)
        {
            ArgumentVerifier.ThrowIfNullOrEmpty(appId, nameof(appId));
            ArgumentVerifier.ThrowIfNullOrEmpty(methodName, nameof(methodName));

            var request = new InvocationRequest<byte[]>
            {
                AppId = appId,
                MethodName = methodName,
                Body = data,
                HttpExtension = httpExtension,
            };

            var invokeResponse = await this.MakeInvokeRequestAsyncWithResponse<byte[], byte[]>(request, true, cancellationToken);
            return invokeResponse;
        }
Esempio n. 16
0
        /// <inheritdoc/>
        public override async Task <TResponse> InvokeBindingAsync <TRequest, TResponse>(
            string bindingName,
            string operation,
            TRequest data,
            IReadOnlyDictionary <string, string> metadata = default,
            CancellationToken cancellationToken           = default)
        {
            ArgumentVerifier.ThrowIfNullOrEmpty(bindingName, nameof(bindingName));
            ArgumentVerifier.ThrowIfNullOrEmpty(operation, nameof(operation));

            var bytes    = TypeConverters.ToJsonByteString <TRequest>(data, this.jsonSerializerOptions);
            var response = await MakeInvokeBindingRequestAsync(bindingName, operation, bytes, metadata, cancellationToken);

            try
            {
                return(TypeConverters.FromJsonByteString <TResponse>(response.Data, this.JsonSerializerOptions));
            }
            catch (JsonException ex)
            {
                throw new DaprException("Binding operation failed: the response payload could not be deserialized. See InnerException for details.", ex);
            }
        }
        public override HttpRequestMessage CreateInvokeMethodRequest(HttpMethod httpMethod, string appId, string methodName)
        {
            ArgumentVerifier.ThrowIfNull(httpMethod, nameof(httpMethod));
            ArgumentVerifier.ThrowIfNullOrEmpty(appId, nameof(appId));
            ArgumentVerifier.ThrowIfNull(methodName, nameof(methodName));

            // Note about this, it's possible to construct invalid stuff using path navigation operators
            // like `../..`. But the principle of garbage in -> garbage out holds.
            //
            // This approach avoids some common pitfalls that could lead to undesired encoding.
            var path    = $"/v1.0/invoke/{appId}/method/{methodName.TrimStart('/')}";
            var request = new HttpRequestMessage(httpMethod, new Uri(this.httpEndpoint, path))
            {
                Properties =
                {
                    { AppIdKey,      appId      },
                    { MethodNameKey, methodName },
                }
            };

            return(request);
        }
Esempio n. 18
0
        /// <inheritdoc/>
        public override async ValueTask<TValue> GetStateAsync<TValue>(
            string storeName,
            string key,
            ConsistencyMode? consistencyMode = default,
            Dictionary<string, string> metadata = default,
            CancellationToken cancellationToken = default)
        {
            ArgumentVerifier.ThrowIfNullOrEmpty(storeName, nameof(storeName));
            ArgumentVerifier.ThrowIfNullOrEmpty(key, nameof(key));

            var getStateEnvelope = new Autogenerated.GetStateRequest()
            {
                StoreName = storeName,
                Key = key,
            };

            if (metadata != null)
            {
                getStateEnvelope.Metadata.Add(metadata);
            }

            if (consistencyMode != null)
            {
                getStateEnvelope.Consistency = GetStateConsistencyForConsistencyMode(consistencyMode.Value);
            }

            var response = await this.MakeGrpcCallHandleError(
                options => client.GetStateAsync(getStateEnvelope, options),
                cancellationToken);

            if (response.Data.IsEmpty)
            {
                return default;
            }

            var responseData = response.Data.ToStringUtf8();
            return JsonSerializer.Deserialize<TValue>(responseData, this.jsonSerializerOptions);
        }
Esempio n. 19
0
        public override async Task InvokeMethodAsync <TRequest>(
            string appId,
            string methodName,
            TRequest data,
            HttpInvocationOptions httpOptions   = default,
            CancellationToken cancellationToken = default)
        {
            ArgumentVerifier.ThrowIfNullOrEmpty(appId, nameof(appId));
            ArgumentVerifier.ThrowIfNullOrEmpty(methodName, nameof(methodName));

            Any serializedData = null;

            if (data != null)
            {
                serializedData = TypeConverters.ToAny(data, this.jsonSerializerOptions);
            }

            Autogenerated.InvokeServiceRequest request;
            CallOptions callOptions;

            (request, callOptions) = this.MakeInvokeRequestAsync(appId, methodName, serializedData, httpOptions, cancellationToken);
            await client.InvokeServiceAsync(request, callOptions);
        }
Esempio n. 20
0
        /// <inheritdoc/>
        public override async ValueTask <TValue> GetStateAsync <TValue>(string storeName, string key, ConsistencyMode?consistencyMode = default, CancellationToken cancellationToken = default)
        {
            ArgumentVerifier.ThrowIfNullOrEmpty(storeName, nameof(storeName));
            ArgumentVerifier.ThrowIfNullOrEmpty(key, nameof(key));

            var getStateEnvelope = new Autogenerated.GetStateRequest()
            {
                StoreName = storeName,
                Key       = key,
            };

            if (consistencyMode != null)
            {
                getStateEnvelope.Consistency = GetStateConsistencyForConsistencyMode(consistencyMode.Value);
            }

            var response = await this.MakeGrpcCallHandleError(
                options => client.GetStateAsync(getStateEnvelope, options),
                cancellationToken);

            if (response.Data.IsEmpty)
            {
                return(default);
Esempio n. 21
0
        public override async Task <IReadOnlyList <BulkStateItem> > GetBulkStateAsync(string storeName, IReadOnlyList <string> keys, int?parallelism, IReadOnlyDictionary <string, string> metadata = default, CancellationToken cancellationToken = default)
        {
            ArgumentVerifier.ThrowIfNullOrEmpty(storeName, nameof(storeName));
            if (keys.Count == 0)
            {
                throw new ArgumentException("keys do not contain any elements");
            }

            var getBulkStateEnvelope = new Autogenerated.GetBulkStateRequest()
            {
                StoreName   = storeName,
                Parallelism = parallelism ?? default
            };

            if (metadata != null)
            {
                foreach (var kvp in metadata)
                {
                    getBulkStateEnvelope.Metadata.Add(kvp.Key, kvp.Value);
                }
            }

            getBulkStateEnvelope.Keys.AddRange(keys);

            var response = await this.MakeGrpcCallHandleError(
                options => client.GetBulkStateAsync(getBulkStateEnvelope, options),
                cancellationToken);

            var bulkResponse = new List <BulkStateItem>();

            foreach (var item in response.Items)
            {
                bulkResponse.Add(new BulkStateItem(item.Key, item.Data.ToStringUtf8(), item.Etag));
            }

            return(bulkResponse);
        }
Esempio n. 22
0
 /// <inheritdoc/>
 public override Task PublishEventAsync(string pubsubName, string topicName, CancellationToken cancellationToken = default)
 {
     ArgumentVerifier.ThrowIfNullOrEmpty(pubsubName, nameof(pubsubName));
     ArgumentVerifier.ThrowIfNullOrEmpty(topicName, nameof(topicName));
     return(MakePublishRequest(pubsubName, topicName, string.Empty, cancellationToken));
 }
 /// <summary>
 /// Overrides the default endpoint used by IDaprClient for conencting to Dapr runtime.
 /// </summary>
 /// <param name="daprEndpoint">Endpoint to use for making calls to Dapr runtime.
 /// Default endpoint used is http://127.0.0.1:DAPR_GRPC_PORT.</param>
 /// <returns>DaprClientBuilder instance.</returns>
 public DaprClientBuilder UseEndpoint(string daprEndpoint)
 {
     ArgumentVerifier.ThrowIfNullOrEmpty(daprEndpoint, nameof(daprEndpoint));
     this.daprEndpoint = daprEndpoint;
     return(this);
 }
Esempio n. 24
0
 /// <inheritdoc/>
 public override Task PublishEventAsync <TContent>(string topicName, TContent content, CancellationToken cancellationToken = default)
 {
     ArgumentVerifier.ThrowIfNullOrEmpty(topicName, nameof(topicName));
     ArgumentVerifier.ThrowIfNull(content, nameof(content));
     return(MakePublishRequest(topicName, content, cancellationToken));
 }
Esempio n. 25
0
 /// <summary>
 /// Overrides the gRPC endpoint used by <see cref="DaprClient" /> for communicating with the Dapr runtime.
 /// </summary>
 /// <param name="grpcEndpoint">
 /// The URI endpoint to use for gRPC calls to the Dapr runtime. The default value will be
 /// <c>http://127.0.0.1:DAPR_GRPC_PORT</c> where <c>DAPR_GRPC_PORT</c> represents the value of the
 /// <c>DAPR_GRPC_PORT</c> environment variable.
 /// </param>
 /// <returns>The <see cref="DaprClientBuilder" /> instance.</returns>
 public DaprClientBuilder UseGrpcEndpoint(string grpcEndpoint)
 {
     ArgumentVerifier.ThrowIfNullOrEmpty(grpcEndpoint, nameof(grpcEndpoint));
     this.GrpcEndpoint = grpcEndpoint;
     return(this);
 }
Esempio n. 26
0
 /// <summary>
 /// Overrides the HTTP endpoint used by <see cref="DaprClient" /> for communicating with the Dapr runtime.
 /// </summary>
 /// <param name="httpEndpoint">
 /// The URI endpoint to use for HTTP calls to the Dapr runtime. The default value will be
 /// <c>http://127.0.0.1:DAPR_HTTP_PORT</c> where <c>DAPR_HTTP_PORT</c> represents the value of the
 /// <c>DAPR_HTTP_PORT</c> environment variable.
 /// </param>
 /// <returns>The <see cref="DaprClientBuilder" /> instance.</returns>
 public DaprClientBuilder UseHttpEndpoint(string httpEndpoint)
 {
     ArgumentVerifier.ThrowIfNullOrEmpty(httpEndpoint, nameof(httpEndpoint));
     this.HttpEndpoint = httpEndpoint;
     return(this);
 }