* Prepping for multi pubsub
* Add pubsub name, some cleanup
* multi pubsub changes
Co-authored-by: Aman Bhardwaj <amanbha@microsoft.com>
Co-authored-by: LM <lemai>
* Add bulk get to client
* change params, return type, class to struct
* change IList to IReadOnlyList, make parallelism nullable
* change GetBulkItem to BulkStateItem
* Use protobuf packaging for the Any type
This pull request implements two converters which help with the type conversion between arbitrary types and the protobuf `Any` type. The C# protobuf library provides a mechanism to pack or unpack protobuf messages to `Any`. It provides the methods `Any.Pack` and `Any.Unpack` to serialize/deserialize messages based on `Google.Protobuf.IMessage`. For types that are not based on `Google.Protobuf.IMessage`, the existing JSON serialization/deserialization will be used.
I've also cleaned the existing codebase a little bit.
Fixes#268
* Fix suggested changes
* Remove secret store extension from building
* Remove code
Co-authored-by: LM <lemai>
Co-authored-by: Aman Bhardwaj <amanbha@users.noreply.github.com>
* Include the appcallback.proto into the Dapr.Client package
To implement service invocation for a gRPC API, a user must implement the AppCallback service on the callee site. Currently this must be done by integrating the `appcallpack.proto` file as also the depending `common.proto` file into the gRPC service application. The `Dapr.Client` package contains already the same `common.proto` file to generate the client classes. This results in a CS0433 error, because the `Dapr.Client` package and the generated AppCallback service will contain a `Dapr.Client.Autogen.Grpc.v1` namespace with the exact same classes.
This pull requests integrates the `appcallpack.proto` into the client package. With this fix the user does not need to integrate the proto files by itself.
See: https://gitter.im/Dapr/community?at=5f14b7e98a9a0a08cbab5d53
* Remove specific names
* #312 - make changes corresponding to change in dapr runtime. The runtime will no longer send an activate message. The SDK should 'activate' an actor anytime it receives an actor method call
* spaces
* remove comment'
Co-authored-by: LM <lemai>
* Returning routes for pubsub from aspnetcore integration.
* adding ref to System.IO.Pipelines
* updating tests
* not using RawText, using segments in route.
* fixing tests
* Logging a warning for routes with parameters
* Using ILoggerFactory
* Move to new invoke proto, specify contenttype in response to the dapr/config message, clarify sample
* Update for additional proto changes
* cr
Co-authored-by: LM <lemai>
* 219 Support the granular Actor config such as actor idle time
* cleanup
* cr
* cr
* refactor
* remove now dead code
* Move setter into properties
Co-authored-by: LM <lemai>
* adding IDAprClient interface
* Adding DaprClientBuilder and adding methods for Publish
* updating the method name for publish
* Adding unit tests for publishevent api
* Removing individual clients for publish
* Renaming base class to DaprClient and implementation calss to DparClientGrpc
* Moving State api to grpc and adding helpers to unittest grpc calls.
* More DaprClient logic
* metadata, etag, options, etc are optional
* Revert "metadata, etag, options, etc are optional"
This reverts commit ea5dc12c5d.
* Default params, 2 new Try- methods, overload refactor for InvokeMethodAsync
* Move some classes/enums to different files. Documentation
* Code refactor and changing tests to use grpc
* Adding tests with state options
* Adding test for getting etag and state
* More refactoring and adding INvokeBinding test
* Fixing tests and tidying up things.
* Updating solutions for renamed project
* Updating projects for rename.
* Oneclient secret (#245)
* ADding Secret Apis
* Using Task for secret
* Format (#242)
* Updating samples.slm
* awaint the call to grpc in common method so that common error handling can be done there.
* Addressing review comments
* fixing test.sln
* updating prod.sln
* Addressing review comments from James.
* Add doc and example for method invocation on http app
* Updating arg validation.
* Updating example.
Co-authored-by: LM <lemai>
Co-authored-by: Carlos Mendible <cmendible@gmail.com>
* Getting started with Actor testability
* Added unitests against the Actor Class.
This is to verify that there are no breaking changes, and that the actor class can take any ActorStateManager.
* removed the private constructor
* resolving an issue with causing a null reference exception.
This was caused by an incorrect order of assignment in the constructor.
* Getting started with Actor testability
* Added unitests against the Actor Class.
This is to verify that there are no breaking changes, and that the actor class can take any ActorStateManager.
* removed the private constructor
* The .NET API states that passing `period: TimeSpan.FromMilliseconds(-1)` to `RegisterReminderAsync` should mean that the riminder never triggers on a recurrence.
When doing so, the serialization of the reminder means that
`IRemindable.ReceiveReminderAsync()` will be called with the dueTime value passed in the state parameter.
I figured that out because I passed an UTF8 JSON string as state, and `IRemindable.ReceiveReminderAsync()` received "0h0m0s1ms" as state, instead of my own value.
## Repro
```csharp
namespace Core.Application.Common.ActorImplementations
{
using System;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;
using Dapr.Actors;
using Dapr.Actors.Runtime;
using Core.Domain;
public class FlightServiceQueryActorState
{
public string CoordinatorId { get; set; }
public byte[] ToBytes() => Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(this));
public static FlightServiceQueryActorState FromBytes(byte[] bytes) => JsonConvert.DeserializeObject<FlightServiceQueryActorState>(Encoding.UTF8.GetString(bytes));
}
[Actor(TypeName = ActorNames.FlightServiceQueryActor)]
public class FlightServiceQueryActor : Actor, IRemindable, IFlightServiceQueryActor
{
public FlightServiceQueryActor(ActorService actorService, ActorId actorId) : base(actorService, actorId) { }
const string AfterTickReminder = "AfterTick";
static readonly TimeSpan Never = TimeSpan.FromMilliseconds(-1);
async Task IFlightServiceQueryActor.Tick(string senderId, int duration)
{
var state = new FlightServiceQueryActorState { CoordinatorId = senderId };
await base.RegisterReminderAsync(
reminderName: AfterTickReminder,
state: state.ToBytes(),
dueTime: TimeSpan.FromMilliseconds(1),
period: Never);
await Console.Out.WriteLineAsync($"Tick tock {this.Id.GetId()}");
}
async Task IRemindable.ReceiveReminderAsync(string reminderName, byte[] stateBytes, TimeSpan dueTime, TimeSpan period)
{
var state = FlightServiceQueryActorState.FromBytes(stateBytes);
var coordinator = ActorProxies.CreateFlightTravelCoordinationFor(state.CoordinatorId);
await Console.Out.WriteLineAsync($"Reminder {this.Id.GetId()} -- {state.CoordinatorId}");
}
}
}
```
## Result
```text
time="2020-01-25T11:37:35+01:00" level=error msg="error executing reminder: error from actor service: "
fail: Microsoft.AspNetCore.Server.Kestrel[13]
Connection id "0HLT1GA8OGV6N", Request id "0HLT1GA8OGV6N:00000006": An unhandled exception was thrown by the application.
System.ArgumentOutOfRangeException: Specified argument was out of the range of valid values.
at Dapr.Actors.Runtime.ConverterUtils.ConvertTimeSpanFromDaprFormat(String valueString) in C:\github\dapr\dotnet-sdk\src\Dapr.Actors\Runtime\ConverterUtils.cs:line 28
at Dapr.Actors.Runtime.ReminderInfo.DeserializeAsync(Stream stream) in C:\github\dapr\dotnet-sdk\src\Dapr.Actors\Runtime\ReminderInfo.cs:line 56
at Dapr.Actors.Runtime.ActorManager.FireReminderAsync(ActorId actorId, String reminderName, Stream requestBodyStream, CancellationToken cancellationToken) in C:\github\dapr\dotnet-sdk\src\Dapr.Actors\Runtime\ActorManager.cs:line 162
at Dapr.Actors.AspNetCore.RouterBuilderExtensions.<>c.<<AddReminderRoute>b__4_0>d.MoveNext() in C:\github\dapr\dotnet-sdk\src\Dapr.Actors.AspNetCore\RouterBuilderExtensions.cs:line 101
```
* Serializes DueTime and Period only when non-negative
* Empty values become default
* Not checking dueTime for negative values. Missing reminder attributes or empty string reminders are equal to "never".
Co-authored-by: Aman Bhardwaj <amanbha@users.noreply.github.com>
* Including state Store name in the APIs to support multi state store scenario in SDK
* correcting the typo in the comment.
* Respective Changes to the tests
* Changes in StateAttribute and Binder classes to support state store name
* Changes in StateEntryModelBinderTests
* StoreName changes in the Integration test app
* fixing build issues
* Fixing integration tests
* Addressing review comments.
* Addressing review comments
* Updating samples to use correct state store name as generated by dapr cli.
Co-authored-by: Aman Bhardwaj <amanbha@users.noreply.github.com>
Fixes: #192
We were missing tests for the case where the HttpClient has a
BaseAddress set. In these case we'd generate an incorrect URL.
Co-authored-by: Aman Bhardwaj <amanbha@users.noreply.github.com>
* Add InvokeClient and InvokeHttpClient dapr #184
* Add tests for InvokeHttpClient dapr#184
* Update namespace of InvokeHttpClient dapr#184
* Add DI of InvokeHttpClient dapr#184
* Resolve code format issues dapr#184
* Remove InvokeEnvelope and add params to InvokeMethod dapr#184
* Update method signature to use generic types for Request/Response dapr#184
* Update parameter in data null check dapr#184
* Making Serialization, Deserialization of ReminderInfo, Timer async and using System.Text.Json for Reminder, Timer and State,
* Updating tests.
* Addressing review comment: Passing stream directly to serializer.
* Removing dependency on Newtonsoft.Json
* Revert "Removing dependency on Newtonsoft.Json"
This reverts commit 0315781bd0.
* Refactored ActorRuntime to allow testing.
* Add test for inferred actor type.
* Add RegisterActor() overload.
* Consolidate RegisterActor() implementations.
* Refactor to make type still intrinsic to actor implementation.
* Update docs.
* Revert error codes change.
* Updates per PR feedback.
* Add warning to ActorRuntime constructor.
* Remove unused using
* Updated parameter names
* Summary spacing and extra text
* Checking for null
* Added ActorId tests and convert to xUnit test framework
Fixes: #74
note: This relies on the fix for dapr/dapr#574 which has been merged.
This change introduces a middleware that can upwrap a *structured* cloud
event. This is the format used by dapr by default now for pub/sub
messaging. Adding the middleware makes it transparent to the developer
whether the data can from a cloud event or was a basic RPC call.
We're adding the middleware for this first since it's the most general
approach. It has a drawback compared with other approaches, performance.
Users could alternatively use the SDK from CloudEvents to read their
data without the middleware.
We might also want to add an MVC formatter in the future, which could do
the unwrapping and deserialization to a user-type in a single operation.