dapr-client 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (35) hide show
  1. checksums.yaml +4 -4
  2. data/.ruby-version +1 -1
  3. data/CHANGELOG.md +3 -0
  4. data/Gemfile.lock +1 -1
  5. data/README.md +22 -5
  6. data/bin/regen_client.sh +15 -0
  7. data/dapr.gemspec +1 -1
  8. data/dapr/proto/common/v1/common.proto +140 -0
  9. data/dapr/proto/runtime/v1/appcallback.proto +131 -0
  10. data/dapr/proto/runtime/v1/dapr.proto +155 -0
  11. data/example.rb +1 -1
  12. data/examples/app-callback/README.md +20 -0
  13. data/examples/app-callback/app_callback_example.rb +15 -0
  14. data/examples/app-callback/app_callback_service.rb +51 -0
  15. data/examples/invoke-simple/README.md +17 -0
  16. data/examples/invoke-simple/invoke-caller.rb +19 -0
  17. data/examples/invoke-simple/invoke-receiver.rb +26 -0
  18. data/examples/pubsub-simple/README.md +13 -0
  19. data/examples/pubsub-simple/publisher.rb +15 -0
  20. data/examples/pubsub-simple/subscriber.rb +28 -0
  21. data/examples/state-store/README.md +7 -0
  22. data/examples/state-store/state-store.rb +29 -0
  23. data/lib/dapr/proto/common/v1/common_pb.rb +87 -0
  24. data/lib/dapr/proto/runtime/v1/appcallback_pb.rb +62 -0
  25. data/lib/dapr/proto/runtime/v1/appcallback_services_pb.rb +49 -0
  26. data/lib/dapr/proto/runtime/v1/dapr_pb.rb +75 -0
  27. data/lib/dapr/proto/runtime/v1/dapr_services_pb.rb +49 -0
  28. data/lib/dapr/version.rb +1 -1
  29. metadata +26 -13
  30. data/lib/dapr/generated/dapr_pb.rb +0 -99
  31. data/lib/dapr/generated/dapr_services_pb.rb +0 -29
  32. data/lib/dapr/generated/daprclient_pb.rb +0 -72
  33. data/lib/dapr/generated/daprclient_services_pb.rb +0 -27
  34. data/proto/dapr.proto +0 -108
  35. data/proto/daprclient.proto +0 -76
data/example.rb CHANGED
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "dapr/generated/dapr_services_pb"
3
+ require "dapr_services_pb"
4
4
 
5
5
  port = ENV.fetch('DAPR_GRPC_PORT', '5001')
6
6
  dapr_uri = "localhost:#{port}"
@@ -0,0 +1,20 @@
1
+ # AppCallbackExample
2
+
3
+ Run the example service:
4
+
5
+ ```bash
6
+ dapr run --app-id app-callback --protocol grpc --app-port 50051 \
7
+ bundle exec ruby app_callback_example.rb
8
+ ```
9
+
10
+ Make a request to invoke a method:
11
+
12
+ ```bash
13
+ dapr invoke -a app-callback -m foobar -p '{"foo": "bar"}'
14
+ ```
15
+
16
+ Publish a message to a topic:
17
+
18
+ ```bash
19
+ dapr publish -t "example" -d "5"
20
+ ```
@@ -0,0 +1,15 @@
1
+ require_relative "./app_callback_service"
2
+
3
+ $stdout.sync = true
4
+
5
+ port = '0.0.0.0:50051'
6
+ s = GRPC::RpcServer.new
7
+ s.add_http2_port(port, :this_port_is_insecure)
8
+ GRPC.logger.info("... running insecurely on #{port}")
9
+ service = AppCallbackService
10
+ s.handle(service)
11
+
12
+ # Runs the server with SIGHUP, SIGINT and SIGQUIT signal handlers to
13
+ # gracefully shutdown.
14
+ # User could also choose to run server via call to run_till_terminated
15
+ s.run_till_terminated_or_interrupted([1, 'int', 'SIGQUIT'])
@@ -0,0 +1,51 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "dapr/proto/runtime/v1/appcallback_services_pb"
4
+ require "json"
5
+
6
+ class AppCallbackService < Dapr::Proto::Runtime::V1::AppCallback::Service
7
+ Any = Google::Protobuf::Any
8
+ Protocol = Dapr::Proto::Runtime::V1
9
+
10
+ def on_invoke(invoke, _call)
11
+ puts "invoked!"
12
+ # Be careful! method() is a builtin method in Ruby
13
+ method = invoke['method']
14
+ raw_data = invoke.data
15
+ data = JSON.parse(raw_data.value) if raw_data&.value
16
+ result = { method: method, data: data }
17
+ Dapr::Proto::Common::V1::InvokeResponse.new(data: Any.new(value: result.to_json))
18
+ rescue => ex
19
+ Dapr::Proto::Common::V1::InvokeResponse.new(data: Any.new(value: { error: ex.inspect }.to_json))
20
+ end
21
+
22
+ def list_topic_subscriptions(_empty, _call)
23
+ puts "topics requested!"
24
+ Protocol::ListTopicSubscriptionsResponse.
25
+ new(subscriptions: Array(Protocol::TopicSubscription.new(topic: "example")))
26
+ end
27
+
28
+ def list_input_bindings(_empty, _call)
29
+ puts "bindings requested!"
30
+ Protocol::ListInputBindingsResponse.new(bindings: %w(readers_digest))
31
+ end
32
+
33
+ def on_binding_event(binding_event, _call)
34
+ puts "binding event!"
35
+ name = binding_event.name
36
+ raw_data = binding_event.data
37
+ metadata = binding_event.metadata
38
+ puts "Binding Event: name:#{name}, data: #{raw_data}"
39
+ Protocol::BindingEventResponse.new # data: Any.new(value:)
40
+ end
41
+
42
+ def on_topic_event(topic_event, _call)
43
+ puts "topic event!"
44
+ topic = topic_event.topic
45
+ raw_data = topic_event.data
46
+ puts "Topic Event: topic:#{topic}, data: #{raw_data}"
47
+ Google::Protobuf::Empty.new
48
+ rescue => ex
49
+ puts ex.inspect
50
+ end
51
+ end
@@ -0,0 +1,17 @@
1
+ # Example - Invoke
2
+
3
+ This example utilizes a receiver and a caller for the OnInvoke / Invoke
4
+ functionality. It will create a gRPC server and bind the on_invoke method,
5
+ which gets called after a client sends a direct method invocation.
6
+
7
+ ## Running
8
+
9
+ To run this example, use the following code:
10
+
11
+ ```
12
+ # 1. Start Receiver (expose gRPC receiver server on port 50051)
13
+ dapr run --app-id invoke-receiver --protocol grpc --app-port 50051 bundle exec ruby invoke-receiver.rb
14
+
15
+ # 2. Start Caller
16
+ dapr run --app-id invoke-caller --protocol grpc bundle exec ruby invoke-caller.rb
17
+ ```
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "dapr/proto/runtime/v1/dapr_services_pb"
4
+
5
+ $stdout.sync = true
6
+
7
+ port = ENV["DAPR_GRPC_PORT"]
8
+ stub = Dapr::Proto::Runtime::V1::Dapr::Stub.new("localhost:#{port}", :this_channel_is_insecure)
9
+ request = Dapr::Proto::Runtime::V1::InvokeServiceRequest.
10
+ new(id: "invoke-receiver",
11
+ message: Dapr::Proto::Common::V1::InvokeRequest.new(
12
+ method: "my-method",
13
+ data: Google::Protobuf::Any.new(value: "TEST MESSAGE"),
14
+ content_type: "text/plain; charset=UTF-8"
15
+ ))
16
+ response = stub.invoke_service(request)
17
+
18
+ puts response.content_type
19
+ puts response.data.value
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ $stdout.sync = true
4
+
5
+ require "dapr/proto/runtime/v1/appcallback_services_pb"
6
+
7
+ class InvokeReceiverService < Dapr::Proto::Runtime::V1::AppCallback::Service
8
+ Any = Google::Protobuf::Any
9
+
10
+ def on_invoke(invoke, _call)
11
+ content_type = "text/plain; charset=UTF-8"
12
+ data = if invoke["method"] == "my-method"
13
+ Any.new(value: "INVOKE_RECEIVED")
14
+ else
15
+ Any.new(value: "unsupported method")
16
+ end
17
+
18
+ Dapr::Proto::Common::V1::InvokeResponse.new(data: data, content_type: content_type)
19
+ end
20
+ end
21
+
22
+ server = GRPC::RpcServer.new
23
+ server.add_http2_port("0.0.0.0:50051", :this_port_is_insecure)
24
+ server.handle(InvokeReceiverService)
25
+
26
+ server.run_till_terminated_or_interrupted([1, +"int", +"SIGQUIT"])
@@ -0,0 +1,13 @@
1
+ # Example - Pub/Sub
2
+
3
+ ## Running
4
+
5
+ To run this example, use the following commands:
6
+
7
+ ```bash
8
+ # 1. Start Subscriber (expose gRPC receiver server on port 50051)
9
+ dapr run --app-id subscriber --protocol grpc --app-port 50051 bundle exec ruby subscriber.rb
10
+
11
+ # 2. Start Publisher
12
+ dapr run --app-id publisher --protocol grpc bundle exec ruby publisher.rb
13
+ ```
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "dapr/proto/runtime/v1/dapr_services_pb"
4
+
5
+ $stdout.sync = true
6
+
7
+ RuntimeV1 = Dapr::Proto::Runtime::V1
8
+
9
+ port = ENV["DAPR_GRPC_PORT"]
10
+ client = Dapr::Proto::Runtime::V1::Dapr::Stub.new("localhost:#{port}", :this_channel_is_insecure)
11
+
12
+ client.publish_event(RuntimeV1::PublishEventRequest.
13
+ new(topic: "TOPIC_A", data: "ACTION=1"))
14
+
15
+ puts "Published!"
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "dapr/proto/runtime/v1/appcallback_services_pb"
4
+
5
+ $stdout.sync = true
6
+
7
+ class Subscriber < Dapr::Proto::Runtime::V1::AppCallback::Service
8
+ RuntimeV1 = Dapr::Proto::Runtime::V1
9
+
10
+ # Dapr will call this method to get the list of topics the app
11
+ # wants to subscribe to. In this example, we are telling Dapr
12
+ # To subscribe to a topic named TOPIC_A
13
+ def list_topic_subscriptions(_empty, _call)
14
+ RuntimeV1::ListTopicSubscriptionsResponse.new(
15
+ subscriptions: Array(RuntimeV1::TopicSubscription.new(topic: "TOPIC_A")))
16
+ end
17
+
18
+ def on_topic_event(_topic_event, _call)
19
+ puts "Event received!"
20
+ Google::Protobuf::Empty.new
21
+ end
22
+ end
23
+
24
+ server = GRPC::RpcServer.new
25
+ server.add_http2_port("0.0.0.0:50051", :this_port_is_insecure)
26
+ server.handle(Subscriber)
27
+
28
+ server.run_till_terminated_or_interrupted([1, +"int", +"SIGQUIT"])
@@ -0,0 +1,7 @@
1
+ # Example - State Store
2
+
3
+ This example demonstrates saving, fetching, and deleting state from the store.
4
+
5
+ ```bash
6
+ dapr run --app-id state-store --protocol grpc bundle exec ruby state-store.rb
7
+ ```
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "dapr/proto/runtime/v1/dapr_services_pb"
4
+
5
+ $stdout.sync = true
6
+
7
+ RuntimeV1 = Dapr::Proto::Runtime::V1
8
+
9
+ port = ENV["DAPR_GRPC_PORT"]
10
+ client = Dapr::Proto::Runtime::V1::Dapr::Stub.new("localhost:#{port}", :this_channel_is_insecure)
11
+
12
+ key = "my-key"
13
+ store_name = "statestore"
14
+
15
+ state = Dapr::Proto::Common::V1::StateItem.
16
+ new(key: key, value: "my state")
17
+
18
+ client.save_state(RuntimeV1::SaveStateRequest.
19
+ new(store_name: store_name, states: Array(state)))
20
+ puts "Saved!"
21
+
22
+ response = client.get_state(RuntimeV1::GetStateRequest.
23
+ new(store_name: store_name, key: key))
24
+ puts "Fetched!"
25
+ puts response.inspect
26
+
27
+ client.delete_state(RuntimeV1::DeleteStateRequest.
28
+ new(store_name: store_name, key: key))
29
+ puts "Deleted!"
@@ -0,0 +1,87 @@
1
+ # Generated by the protocol buffer compiler. DO NOT EDIT!
2
+ # source: dapr/proto/common/v1/common.proto
3
+
4
+ require 'google/protobuf'
5
+
6
+ require 'google/protobuf/any_pb'
7
+ require 'google/protobuf/duration_pb'
8
+ Google::Protobuf::DescriptorPool.generated_pool.build do
9
+ add_file("dapr/proto/common/v1/common.proto", :syntax => :proto3) do
10
+ add_message "dapr.proto.common.v1.HTTPExtension" do
11
+ optional :verb, :enum, 1, "dapr.proto.common.v1.HTTPExtension.Verb"
12
+ map :querystring, :string, :string, 2
13
+ end
14
+ add_enum "dapr.proto.common.v1.HTTPExtension.Verb" do
15
+ value :NONE, 0
16
+ value :GET, 1
17
+ value :HEAD, 2
18
+ value :POST, 3
19
+ value :PUT, 4
20
+ value :DELETE, 5
21
+ value :CONNECT, 6
22
+ value :OPTIONS, 7
23
+ value :TRACE, 8
24
+ end
25
+ add_message "dapr.proto.common.v1.InvokeRequest" do
26
+ optional :method, :string, 1
27
+ optional :data, :message, 2, "google.protobuf.Any"
28
+ optional :content_type, :string, 3
29
+ optional :http_extension, :message, 4, "dapr.proto.common.v1.HTTPExtension"
30
+ end
31
+ add_message "dapr.proto.common.v1.InvokeResponse" do
32
+ optional :data, :message, 1, "google.protobuf.Any"
33
+ optional :content_type, :string, 2
34
+ end
35
+ add_message "dapr.proto.common.v1.StateItem" do
36
+ optional :key, :string, 1
37
+ optional :value, :bytes, 2
38
+ optional :etag, :string, 3
39
+ map :metadata, :string, :string, 4
40
+ optional :options, :message, 5, "dapr.proto.common.v1.StateOptions"
41
+ end
42
+ add_message "dapr.proto.common.v1.StateOptions" do
43
+ optional :concurrency, :enum, 1, "dapr.proto.common.v1.StateOptions.StateConcurrency"
44
+ optional :consistency, :enum, 2, "dapr.proto.common.v1.StateOptions.StateConsistency"
45
+ optional :retry_policy, :message, 3, "dapr.proto.common.v1.StateRetryPolicy"
46
+ end
47
+ add_enum "dapr.proto.common.v1.StateOptions.StateConcurrency" do
48
+ value :CONCURRENCY_UNSPECIFIED, 0
49
+ value :CONCURRENCY_FIRST_WRITE, 1
50
+ value :CONCURRENCY_LAST_WRITE, 2
51
+ end
52
+ add_enum "dapr.proto.common.v1.StateOptions.StateConsistency" do
53
+ value :CONSISTENCY_UNSPECIFIED, 0
54
+ value :CONSISTENCY_EVENTUAL, 1
55
+ value :CONSISTENCY_STRONG, 2
56
+ end
57
+ add_message "dapr.proto.common.v1.StateRetryPolicy" do
58
+ optional :threshold, :int32, 1
59
+ optional :pattern, :enum, 2, "dapr.proto.common.v1.StateRetryPolicy.RetryPattern"
60
+ optional :interval, :message, 3, "google.protobuf.Duration"
61
+ end
62
+ add_enum "dapr.proto.common.v1.StateRetryPolicy.RetryPattern" do
63
+ value :RETRY_UNSPECIFIED, 0
64
+ value :RETRY_LINEAR, 1
65
+ value :RETRY_EXPONENTIAL, 2
66
+ end
67
+ end
68
+ end
69
+
70
+ module Dapr
71
+ module Proto
72
+ module Common
73
+ module V1
74
+ HTTPExtension = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("dapr.proto.common.v1.HTTPExtension").msgclass
75
+ HTTPExtension::Verb = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("dapr.proto.common.v1.HTTPExtension.Verb").enummodule
76
+ InvokeRequest = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("dapr.proto.common.v1.InvokeRequest").msgclass
77
+ InvokeResponse = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("dapr.proto.common.v1.InvokeResponse").msgclass
78
+ StateItem = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("dapr.proto.common.v1.StateItem").msgclass
79
+ StateOptions = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("dapr.proto.common.v1.StateOptions").msgclass
80
+ StateOptions::StateConcurrency = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("dapr.proto.common.v1.StateOptions.StateConcurrency").enummodule
81
+ StateOptions::StateConsistency = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("dapr.proto.common.v1.StateOptions.StateConsistency").enummodule
82
+ StateRetryPolicy = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("dapr.proto.common.v1.StateRetryPolicy").msgclass
83
+ StateRetryPolicy::RetryPattern = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("dapr.proto.common.v1.StateRetryPolicy.RetryPattern").enummodule
84
+ end
85
+ end
86
+ end
87
+ end
@@ -0,0 +1,62 @@
1
+ # Generated by the protocol buffer compiler. DO NOT EDIT!
2
+ # source: dapr/proto/runtime/v1/appcallback.proto
3
+
4
+ require 'google/protobuf'
5
+
6
+ require 'google/protobuf/empty_pb'
7
+ require 'dapr/proto/common/v1/common_pb'
8
+ Google::Protobuf::DescriptorPool.generated_pool.build do
9
+ add_file("dapr/proto/runtime/v1/appcallback.proto", :syntax => :proto3) do
10
+ add_message "dapr.proto.runtime.v1.TopicEventRequest" do
11
+ optional :id, :string, 1
12
+ optional :source, :string, 2
13
+ optional :type, :string, 3
14
+ optional :spec_version, :string, 4
15
+ optional :data_content_type, :string, 5
16
+ optional :data, :bytes, 7
17
+ optional :topic, :string, 6
18
+ end
19
+ add_message "dapr.proto.runtime.v1.BindingEventRequest" do
20
+ optional :name, :string, 1
21
+ optional :data, :bytes, 2
22
+ map :metadata, :string, :string, 3
23
+ end
24
+ add_message "dapr.proto.runtime.v1.BindingEventResponse" do
25
+ optional :store_name, :string, 1
26
+ repeated :states, :message, 2, "dapr.proto.common.v1.StateItem"
27
+ repeated :to, :string, 3
28
+ optional :data, :bytes, 4
29
+ optional :concurrency, :enum, 5, "dapr.proto.runtime.v1.BindingEventResponse.BindingEventConcurrency"
30
+ end
31
+ add_enum "dapr.proto.runtime.v1.BindingEventResponse.BindingEventConcurrency" do
32
+ value :SEQUENTIAL, 0
33
+ value :PARALLEL, 1
34
+ end
35
+ add_message "dapr.proto.runtime.v1.ListTopicSubscriptionsResponse" do
36
+ repeated :subscriptions, :message, 1, "dapr.proto.runtime.v1.TopicSubscription"
37
+ end
38
+ add_message "dapr.proto.runtime.v1.TopicSubscription" do
39
+ optional :topic, :string, 1
40
+ map :metadata, :string, :string, 2
41
+ end
42
+ add_message "dapr.proto.runtime.v1.ListInputBindingsResponse" do
43
+ repeated :bindings, :string, 1
44
+ end
45
+ end
46
+ end
47
+
48
+ module Dapr
49
+ module Proto
50
+ module Runtime
51
+ module V1
52
+ TopicEventRequest = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("dapr.proto.runtime.v1.TopicEventRequest").msgclass
53
+ BindingEventRequest = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("dapr.proto.runtime.v1.BindingEventRequest").msgclass
54
+ BindingEventResponse = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("dapr.proto.runtime.v1.BindingEventResponse").msgclass
55
+ BindingEventResponse::BindingEventConcurrency = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("dapr.proto.runtime.v1.BindingEventResponse.BindingEventConcurrency").enummodule
56
+ ListTopicSubscriptionsResponse = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("dapr.proto.runtime.v1.ListTopicSubscriptionsResponse").msgclass
57
+ TopicSubscription = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("dapr.proto.runtime.v1.TopicSubscription").msgclass
58
+ ListInputBindingsResponse = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("dapr.proto.runtime.v1.ListInputBindingsResponse").msgclass
59
+ end
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,49 @@
1
+ # Generated by the protocol buffer compiler. DO NOT EDIT!
2
+ # Source: dapr/proto/runtime/v1/appcallback.proto for package 'dapr.proto.runtime.v1'
3
+ # Original file comments:
4
+ # ------------------------------------------------------------
5
+ # Copyright (c) Microsoft Corporation.
6
+ # Licensed under the MIT License.
7
+ # ------------------------------------------------------------
8
+ #
9
+
10
+ require 'grpc'
11
+ require 'dapr/proto/runtime/v1/appcallback_pb'
12
+
13
+ module Dapr
14
+ module Proto
15
+ module Runtime
16
+ module V1
17
+ module AppCallback
18
+ # AppCallback V1 allows user application to interact with Dapr runtime.
19
+ # User application needs to implement AppCallback service if it needs to
20
+ # receive message from dapr runtime.
21
+ class Service
22
+
23
+ include GRPC::GenericService
24
+
25
+ self.marshal_class_method = :encode
26
+ self.unmarshal_class_method = :decode
27
+ self.service_name = 'dapr.proto.runtime.v1.AppCallback'
28
+
29
+ # Invokes service method with InvokeRequest.
30
+ rpc :OnInvoke, Dapr::Proto::Common::V1::InvokeRequest, Dapr::Proto::Common::V1::InvokeResponse
31
+ # Lists all topics subscribed by this app.
32
+ rpc :ListTopicSubscriptions, Google::Protobuf::Empty, ListTopicSubscriptionsResponse
33
+ # Subscribes events from Pubsub
34
+ rpc :OnTopicEvent, TopicEventRequest, Google::Protobuf::Empty
35
+ # Lists all input bindings subscribed by this app.
36
+ rpc :ListInputBindings, Google::Protobuf::Empty, ListInputBindingsResponse
37
+ # Listens events from the input bindings
38
+ #
39
+ # User application can save the states or send the events to the output
40
+ # bindings optionally by returning BindingEventResponse.
41
+ rpc :OnBindingEvent, BindingEventRequest, BindingEventResponse
42
+ end
43
+
44
+ Stub = Service.rpc_stub_class
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end