evrblk 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 9924f424ed8bba173f553b935b33bc1d257a8e8c03723e548cda6d805b5d1f2d
4
+ data.tar.gz: 44770bfbd52e3a904a77fcc1405281d4627680248817f5c645b52051f897a7af
5
+ SHA512:
6
+ metadata.gz: e0242e58cdde7851fd715020d01cd825777e57adf2f15ef7d9d759a108941e26df879339ae1bd7ceab823bea8e1204a55c1c26c02b5203e9a1c0c50bfff86da4
7
+ data.tar.gz: d5546338df65de54a9018f4382cf840da2b1506ddeb42248e20a12a8c8e6f688f89d7a6cecb5d36bd332914c65b61ad72aaf8b3926d043c32d4182b3fd293e14
data/Gemfile ADDED
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gemspec
6
+
7
+ gem "grpc"
8
+ gem "base64"
9
+
10
+ group :development do
11
+ gem "rake"
12
+ gem "grpc-tools"
13
+ gem "test-unit"
14
+
15
+ # Rubocop changes pretty quickly: new cops get added and old cops change
16
+ # names or go into new namespaces. This is a library and we don't have
17
+ # `Gemfile.lock` checked in, so to prevent good builds from suddenly going
18
+ # bad, pin to a specific version number here. Try to keep this relatively
19
+ # up-to-date, but it's not the end of the world if it's not.
20
+ #
21
+ # The latest version of rubocop is only compatible with Ruby 2.7+
22
+ gem "rubocop", "1.57.2" if RUBY_VERSION >= "2.7"
23
+ end
data/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 EVRBLK
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,41 @@
1
+ # Everblack Ruby SDK
2
+
3
+ ## Installing
4
+
5
+ ```
6
+ gem install evrblk
7
+ ```
8
+
9
+ ## Example
10
+
11
+ ```ruby
12
+ require "evrblk"
13
+
14
+ api_key_id = "key_alfa_z141pKeFzfmGGyYlUyPsbF"
15
+ api_key_secret = <<-END
16
+ -----BEGIN EC PRIVATE KEY-----
17
+ MHcCAQEEIN33cCNGxsuxwMaJ2jWvWcgxBSVr8HV7WUUSKGc71/BtoAoGCCqGSM49
18
+ AwEHoUQDQgAE0m8+ZVijytLp01dsupG7QF8ZpjX5UmP20wj/sluPdoHW3BgiiyCn
19
+ /pMwYptUs0yJUtUZ/0wzEyp8PgAWWhxglw==
20
+ -----END EC PRIVATE KEY-----
21
+ END
22
+
23
+ signer = Evrblk::AuthN::RequestSigner.new(api_key_id, api_key_secret)
24
+ grackle_client = Evrblk::Grackle::Preview::Client.new(signer, "localhost:8000")
25
+
26
+ grackle_client.create_namespace(
27
+ name: "mynamespace"
28
+ )
29
+
30
+ now = Time.now
31
+ grackle_client.acquire_lock(
32
+ namespace_name: "mynamespace",
33
+ lock_name: "lock1",
34
+ process_id: "process1",
35
+ expires_at: (now.to_i + 60*5) * (10 ** 9) + now.nsec # expires in 5 min
36
+ )
37
+ ```
38
+
39
+ ## License
40
+
41
+ Everblack Ruby SDK is released under the [MIT License](https://opensource.org/licenses/MIT).
data/evrblk.gemspec ADDED
@@ -0,0 +1,42 @@
1
+ # frozen_string_literal: true
2
+
3
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), "lib"))
4
+
5
+ require "evrblk/version"
6
+
7
+ Gem::Specification.new do |s|
8
+ s.name = "evrblk"
9
+ s.version = Evrblk::VERSION
10
+ s.required_ruby_version = ">= 2.3.0"
11
+ s.summary = "Ruby bindings for the Everblack API"
12
+ s.description = "Build simple, secure, scalable systems with Everblack. " \
13
+ "See https://everblack.dev for details."
14
+ s.authors = ["Stanislav Spiridonov", "Everblack"]
15
+ s.email = "stanislav@spiridonov.pro"
16
+ s.homepage = "https://everblack.dev"
17
+ s.license = "MIT"
18
+
19
+ s.metadata = {
20
+ "bug_tracker_uri" => "https://github.com/evrblk/evrblk-ruby/issues",
21
+ # "changelog_uri" =>
22
+ # "https://github.com/evrblk/evrblk-ruby/blob/master/CHANGELOG.md",
23
+ "documentation_uri" => "https://everblack.dev/docs",
24
+ "github_repo" => "ssh://github.com/evrblk/evrblk-ruby",
25
+ "homepage_uri" => "https://everblack.dev",
26
+ "source_code_uri" => "https://github.com/evrblk/evrblk-ruby",
27
+ "rubygems_mfa_required" => "false",
28
+ }
29
+
30
+ ignored = Regexp.union(
31
+ /\A\.editorconfig/,
32
+ /\A\.git/,
33
+ /\A\.rubocop/,
34
+ /\A\.travis.yml/,
35
+ /\A\.vscode/,
36
+ /\A\.cursor/,
37
+ /\Abin/,
38
+ /\Atest/
39
+ )
40
+ s.files = `git ls-files`.split("\n").grep_v(ignored)
41
+ s.require_paths = ["lib"]
42
+ end
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'openssl'
4
+ require 'base64'
5
+
6
+ module Evrblk
7
+ module AuthN
8
+ class Alfa < Base
9
+ def initialize(private_key_pem)
10
+ # Parse the PEM-encoded private key
11
+ @private_key = OpenSSL::PKey::EC.new(private_key_pem)
12
+
13
+ # Verify that the private key is using the correct curve
14
+ unless @private_key.group.curve_name == 'prime256v1'
15
+ raise "Invalid key: Expected secp256r1 (prime256v1) but got #{@private_key.group.curve_name}"
16
+ end
17
+ end
18
+
19
+ def sign(request, timestamp)
20
+ # Serialize timestamp and request body
21
+ data = serialize_int64(timestamp) + marshal_protobuf(request)
22
+
23
+ # Sign a digest using SHA-256 with the private key
24
+ signature = @private_key.sign(OpenSSL::Digest::SHA256.new, data)
25
+
26
+ # Convert the signature to Base64
27
+ signature_base64 = Base64.strict_encode64(signature)
28
+
29
+ return signature_base64
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Evrblk
4
+ module AuthN
5
+ class Base
6
+ def sign(request, timestamp)
7
+ raise "Implement me"
8
+ end
9
+
10
+ private
11
+
12
+ # Serializes an Int64 value into an 8-byte big-endian
13
+ def serialize_int64(value)
14
+ # Ensure the value is within the 64-bit integer range
15
+ if value < -9223372036854775808 || value > 9223372036854775807
16
+ raise ArgumentError, "Value is outside the Int64 range"
17
+ end
18
+
19
+ # Pack the integer into 8 bytes with big-endian byte order
20
+ bytes = [value].pack('q>')
21
+
22
+ return bytes
23
+ end
24
+
25
+ # Marshals a protobuf object into a byte array with deterministic serialization.
26
+ # The deterministic option ensures consistent byte representation regardless of system.
27
+ def marshal_protobuf(obj)
28
+ # Ensure the object is a valid protobuf message
29
+ unless obj.is_a?(Google::Protobuf::MessageExts)
30
+ raise ArgumentError, "Object must be a Google::Protobuf message"
31
+ end
32
+
33
+ # Marshal the protobuf object with deterministic serialization option
34
+ options = { deterministic: true }
35
+
36
+ # Encode the protobuf message to bytes
37
+ bytes = obj.to_proto(options)
38
+
39
+ return bytes
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'base64'
4
+
5
+ module Evrblk
6
+ module AuthN
7
+ class Bravo < Base
8
+ def initialize(secret_base64)
9
+
10
+ end
11
+
12
+ def sign(request, timestamp)
13
+ # Serialize timestamp and request body
14
+ data = serialize_int64(timestamp) + marshal_protobuf(request)
15
+
16
+ # Sign a digest using SHA-256 with the private key
17
+ signature = @private_key.sign(OpenSSL::Digest::SHA256.new, data)
18
+
19
+ # Convert the signature to Base64
20
+ signature_base64 = Base64.strict_encode64(signature)
21
+
22
+ return signature_base64
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,44 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Evrblk
4
+ module AuthN
5
+ class RequestSigner
6
+ def initialize(api_key_id, api_key_secret)
7
+ if !api_key_id.match?(/key_(alfa|bravo)_[0-9a-zA-Z]+/)
8
+ raise ArgumentError, "Invalid API Key ID #{api_key_id}"
9
+ end
10
+ @api_key_id = api_key_id
11
+
12
+ if api_key_id.start_with?("key_alfa")
13
+ @signer = Evrblk::AuthN::Alfa.new(api_key_secret)
14
+ else
15
+ @signer = Evrblk::AuthN::Bravo.new(api_key_secret)
16
+ end
17
+ end
18
+
19
+ def sign(request)
20
+ # Take current time
21
+ timestamp = Time.now.to_i
22
+
23
+ # Sign the request body with the timestamp
24
+ signature = @signer.sign(request, timestamp)
25
+
26
+ # Return gRPC headers for authentication
27
+ return {
28
+ "evrblk-signature": signature,
29
+ "evrblk-api-key-id": @api_key_id,
30
+ "evrblk-timestamp": timestamp.to_s,
31
+ }
32
+ end
33
+ end
34
+
35
+ class NoOpSigner
36
+ def initialize()
37
+ end
38
+
39
+ def sign(request)
40
+ return {}
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,71 @@
1
+ # frozen_string_literal: true
2
+ # Generated by the protocol buffer compiler. DO NOT EDIT!
3
+ # source: grackle/preview/api.proto
4
+
5
+ require 'google/protobuf'
6
+
7
+
8
+ descriptor_data = "\n\x19grackle/preview/api.proto\x12\x1a\x63om.evrblk.grackle.preview\";\n\x16\x43reateNamespaceRequest\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x02 \x01(\t\"S\n\x17\x43reateNamespaceResponse\x12\x38\n\tnamespace\x18\x01 \x01(\x0b\x32%.com.evrblk.grackle.preview.Namespace\"@\n\x15ListNamespacesRequest\x12\x18\n\x10pagination_token\x18\x01 \x01(\t\x12\r\n\x05limit\x18\x02 \x01(\x05\"\x95\x01\n\x16ListNamespacesResponse\x12\x39\n\nnamespaces\x18\x01 \x03(\x0b\x32%.com.evrblk.grackle.preview.Namespace\x12\x1d\n\x15next_pagination_token\x18\x02 \x01(\t\x12!\n\x19previous_pagination_token\x18\x03 \x01(\t\"-\n\x13GetNamespaceRequest\x12\x16\n\x0enamespace_name\x18\x01 \x01(\t\"P\n\x14GetNamespaceResponse\x12\x38\n\tnamespace\x18\x01 \x01(\x0b\x32%.com.evrblk.grackle.preview.Namespace\"0\n\x16\x44\x65leteNamespaceRequest\x12\x16\n\x0enamespace_name\x18\x01 \x01(\t\"\x19\n\x17\x44\x65leteNamespaceResponse\"E\n\x16UpdateNamespaceRequest\x12\x16\n\x0enamespace_name\x18\x01 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x02 \x01(\t\"S\n\x17UpdateNamespaceResponse\x12\x38\n\tnamespace\x18\x01 \x01(\x0b\x32%.com.evrblk.grackle.preview.Namespace\"n\n\x16\x43reateSemaphoreRequest\x12\x16\n\x0enamespace_name\x18\x01 \x01(\t\x12\x16\n\x0esemaphore_name\x18\x02 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x03 \x01(\t\x12\x0f\n\x07permits\x18\x04 \x01(\x04\"S\n\x17\x43reateSemaphoreResponse\x12\x38\n\tsemaphore\x18\x01 \x01(\x0b\x32%.com.evrblk.grackle.preview.Semaphore\"X\n\x15ListSemaphoresRequest\x12\x16\n\x0enamespace_name\x18\x01 \x01(\t\x12\x18\n\x10pagination_token\x18\x02 \x01(\t\x12\r\n\x05limit\x18\x03 \x01(\x05\"\x95\x01\n\x16ListSemaphoresResponse\x12\x39\n\nsemaphores\x18\x01 \x03(\x0b\x32%.com.evrblk.grackle.preview.Semaphore\x12\x1d\n\x15next_pagination_token\x18\x02 \x01(\t\x12!\n\x19previous_pagination_token\x18\x03 \x01(\t\"E\n\x13GetSemaphoreRequest\x12\x16\n\x0enamespace_name\x18\x01 \x01(\t\x12\x16\n\x0esemaphore_name\x18\x02 \x01(\t\"P\n\x14GetSemaphoreResponse\x12\x38\n\tsemaphore\x18\x01 \x01(\x0b\x32%.com.evrblk.grackle.preview.Semaphore\"q\n\x17\x41\x63quireSemaphoreRequest\x12\x16\n\x0enamespace_name\x18\x01 \x01(\t\x12\x16\n\x0esemaphore_name\x18\x02 \x01(\t\x12\x12\n\nprocess_id\x18\x03 \x01(\t\x12\x12\n\nexpires_at\x18\x04 \x01(\x03\"e\n\x18\x41\x63quireSemaphoreResponse\x12\x38\n\tsemaphore\x18\x01 \x01(\x0b\x32%.com.evrblk.grackle.preview.Semaphore\x12\x0f\n\x07success\x18\x02 \x01(\x08\"]\n\x17ReleaseSemaphoreRequest\x12\x16\n\x0enamespace_name\x18\x01 \x01(\t\x12\x16\n\x0esemaphore_name\x18\x02 \x01(\t\x12\x12\n\nprocess_id\x18\x03 \x01(\t\"T\n\x18ReleaseSemaphoreResponse\x12\x38\n\tsemaphore\x18\x01 \x01(\x0b\x32%.com.evrblk.grackle.preview.Semaphore\"n\n\x16UpdateSemaphoreRequest\x12\x16\n\x0enamespace_name\x18\x01 \x01(\t\x12\x16\n\x0esemaphore_name\x18\x02 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x03 \x01(\t\x12\x0f\n\x07permits\x18\x04 \x01(\x04\"S\n\x17UpdateSemaphoreResponse\x12\x38\n\tsemaphore\x18\x01 \x01(\x0b\x32%.com.evrblk.grackle.preview.Semaphore\"H\n\x16\x44\x65leteSemaphoreRequest\x12\x16\n\x0enamespace_name\x18\x01 \x01(\t\x12\x16\n\x0esemaphore_name\x18\x02 \x01(\t\"\x19\n\x17\x44\x65leteSemaphoreResponse\"\xaf\x01\n\tSemaphore\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x02 \x01(\t\x12\x12\n\ncreated_at\x18\x03 \x01(\x03\x12\x12\n\nupdated_at\x18\x04 \x01(\x03\x12\x0f\n\x07permits\x18\x05 \x01(\x04\x12\x46\n\x11semaphore_holders\x18\x06 \x03(\x0b\x32+.com.evrblk.grackle.preview.SemaphoreHolder\"L\n\x0fSemaphoreHolder\x12\x12\n\nprocess_id\x18\x01 \x01(\t\x12\x11\n\tlocked_at\x18\x02 \x01(\x03\x12\x12\n\nexpires_at\x18\x03 \x01(\x03\"\x83\x01\n\x16\x43reateWaitGroupRequest\x12\x16\n\x0enamespace_name\x18\x01 \x01(\t\x12\x17\n\x0fwait_group_name\x18\x02 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x03 \x01(\t\x12\x0f\n\x07\x63ounter\x18\x04 \x01(\x04\x12\x12\n\nexpires_at\x18\x05 \x01(\x03\"T\n\x17\x43reateWaitGroupResponse\x12\x39\n\nwait_group\x18\x01 \x01(\x0b\x32%.com.evrblk.grackle.preview.WaitGroup\"X\n\x15ListWaitGroupsRequest\x12\x16\n\x0enamespace_name\x18\x01 \x01(\t\x12\x18\n\x10pagination_token\x18\x02 \x01(\t\x12\r\n\x05limit\x18\x03 \x01(\x05\"\x96\x01\n\x16ListWaitGroupsResponse\x12:\n\x0bwait_groups\x18\x01 \x03(\x0b\x32%.com.evrblk.grackle.preview.WaitGroup\x12\x1d\n\x15next_pagination_token\x18\x02 \x01(\t\x12!\n\x19previous_pagination_token\x18\x03 \x01(\t\"F\n\x13GetWaitGroupRequest\x12\x16\n\x0enamespace_name\x18\x01 \x01(\t\x12\x17\n\x0fwait_group_name\x18\x02 \x01(\t\"Q\n\x14GetWaitGroupResponse\x12\x39\n\nwait_group\x18\x01 \x01(\x0b\x32%.com.evrblk.grackle.preview.WaitGroup\"I\n\x16\x44\x65leteWaitGroupRequest\x12\x16\n\x0enamespace_name\x18\x01 \x01(\t\x12\x17\n\x0fwait_group_name\x18\x02 \x01(\t\"\x19\n\x17\x44\x65leteWaitGroupResponse\"]\n\x19\x41\x64\x64JobsToWaitGroupRequest\x12\x16\n\x0enamespace_name\x18\x01 \x01(\t\x12\x17\n\x0fwait_group_name\x18\x02 \x01(\t\x12\x0f\n\x07\x63ounter\x18\x03 \x01(\x04\"W\n\x1a\x41\x64\x64JobsToWaitGroupResponse\x12\x39\n\nwait_group\x18\x01 \x01(\x0b\x32%.com.evrblk.grackle.preview.WaitGroup\"h\n CompleteJobsFromWaitGroupRequest\x12\x16\n\x0enamespace_name\x18\x01 \x01(\t\x12\x17\n\x0fwait_group_name\x18\x02 \x01(\t\x12\x13\n\x0bprocess_ids\x18\x03 \x03(\t\"^\n!CompleteJobsFromWaitGroupResponse\x12\x39\n\nwait_group\x18\x01 \x01(\x0b\x32%.com.evrblk.grackle.preview.WaitGroup\"\x8e\x01\n\tWaitGroup\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x02 \x01(\t\x12\x12\n\ncreated_at\x18\x03 \x01(\x03\x12\x12\n\nupdated_at\x18\x04 \x01(\x03\x12\x12\n\nexpires_at\x18\x05 \x01(\x03\x12\x0f\n\x07\x63ounter\x18\x06 \x01(\x04\x12\x11\n\tcompleted\x18\x07 \x01(\x04\"{\n\x12\x41\x63quireLockRequest\x12\x16\n\x0enamespace_name\x18\x01 \x01(\t\x12\x11\n\tlock_name\x18\x02 \x01(\t\x12\x12\n\nprocess_id\x18\x03 \x01(\t\x12\x12\n\nwrite_lock\x18\x04 \x01(\x08\x12\x12\n\nexpires_at\x18\x05 \x01(\x03\"V\n\x13\x41\x63quireLockResponse\x12.\n\x04lock\x18\x01 \x01(\x0b\x32 .com.evrblk.grackle.preview.Lock\x12\x0f\n\x07success\x18\x02 \x01(\x08\"S\n\x12ReleaseLockRequest\x12\x16\n\x0enamespace_name\x18\x01 \x01(\t\x12\x11\n\tlock_name\x18\x02 \x01(\t\x12\x12\n\nprocess_id\x18\x03 \x01(\t\"E\n\x13ReleaseLockResponse\x12.\n\x04lock\x18\x01 \x01(\x0b\x32 .com.evrblk.grackle.preview.Lock\";\n\x0eGetLockRequest\x12\x16\n\x0enamespace_name\x18\x01 \x01(\t\x12\x11\n\tlock_name\x18\x02 \x01(\t\"A\n\x0fGetLockResponse\x12.\n\x04lock\x18\x01 \x01(\x0b\x32 .com.evrblk.grackle.preview.Lock\">\n\x11\x44\x65leteLockRequest\x12\x16\n\x0enamespace_name\x18\x01 \x01(\t\x12\x11\n\tlock_name\x18\x02 \x01(\t\"\x14\n\x12\x44\x65leteLockResponse\"S\n\x10ListLocksRequest\x12\x16\n\x0enamespace_name\x18\x01 \x01(\t\x12\x18\n\x10pagination_token\x18\x02 \x01(\t\x12\r\n\x05limit\x18\x03 \x01(\x05\"\x86\x01\n\x11ListLocksResponse\x12/\n\x05locks\x18\x01 \x03(\x0b\x32 .com.evrblk.grackle.preview.Lock\x12\x1d\n\x15next_pagination_token\x18\x02 \x01(\t\x12!\n\x19previous_pagination_token\x18\x03 \x01(\t\"\xe3\x01\n\x04Lock\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x34\n\x05state\x18\x02 \x01(\x0e\x32%.com.evrblk.grackle.preview.LockState\x12\x11\n\tlocked_at\x18\x03 \x01(\x03\x12\x41\n\x11write_lock_holder\x18\x04 \x01(\x0b\x32&.com.evrblk.grackle.preview.LockHolder\x12\x41\n\x11read_lock_holders\x18\x05 \x03(\x0b\x32&.com.evrblk.grackle.preview.LockHolder\"G\n\nLockHolder\x12\x12\n\nprocess_id\x18\x01 \x01(\t\x12\x11\n\tlocked_at\x18\x02 \x01(\x03\x12\x12\n\nexpires_at\x18\x03 \x01(\x03\"V\n\tNamespace\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x02 \x01(\t\x12\x12\n\ncreated_at\x18\x03 \x01(\x03\x12\x12\n\nupdated_at\x18\x04 \x01(\x03*<\n\tLockState\x12\x0c\n\x08UNLOCKED\x10\x00\x12\x0f\n\x0bREAD_LOCKED\x10\x01\x12\x10\n\x0cWRITE_LOCKED\x10\x02\x32\x9f\x16\n\x11GracklePreviewApi\x12|\n\x0f\x43reateNamespace\x12\x32.com.evrblk.grackle.preview.CreateNamespaceRequest\x1a\x33.com.evrblk.grackle.preview.CreateNamespaceResponse\"\x00\x12y\n\x0eListNamespaces\x12\x31.com.evrblk.grackle.preview.ListNamespacesRequest\x1a\x32.com.evrblk.grackle.preview.ListNamespacesResponse\"\x00\x12s\n\x0cGetNamespace\x12/.com.evrblk.grackle.preview.GetNamespaceRequest\x1a\x30.com.evrblk.grackle.preview.GetNamespaceResponse\"\x00\x12|\n\x0f\x44\x65leteNamespace\x12\x32.com.evrblk.grackle.preview.DeleteNamespaceRequest\x1a\x33.com.evrblk.grackle.preview.DeleteNamespaceResponse\"\x00\x12|\n\x0fUpdateNamespace\x12\x32.com.evrblk.grackle.preview.UpdateNamespaceRequest\x1a\x33.com.evrblk.grackle.preview.UpdateNamespaceResponse\"\x00\x12|\n\x0f\x43reateSemaphore\x12\x32.com.evrblk.grackle.preview.CreateSemaphoreRequest\x1a\x33.com.evrblk.grackle.preview.CreateSemaphoreResponse\"\x00\x12y\n\x0eListSemaphores\x12\x31.com.evrblk.grackle.preview.ListSemaphoresRequest\x1a\x32.com.evrblk.grackle.preview.ListSemaphoresResponse\"\x00\x12s\n\x0cGetSemaphore\x12/.com.evrblk.grackle.preview.GetSemaphoreRequest\x1a\x30.com.evrblk.grackle.preview.GetSemaphoreResponse\"\x00\x12\x7f\n\x10\x41\x63quireSemaphore\x12\x33.com.evrblk.grackle.preview.AcquireSemaphoreRequest\x1a\x34.com.evrblk.grackle.preview.AcquireSemaphoreResponse\"\x00\x12\x7f\n\x10ReleaseSemaphore\x12\x33.com.evrblk.grackle.preview.ReleaseSemaphoreRequest\x1a\x34.com.evrblk.grackle.preview.ReleaseSemaphoreResponse\"\x00\x12|\n\x0fUpdateSemaphore\x12\x32.com.evrblk.grackle.preview.UpdateSemaphoreRequest\x1a\x33.com.evrblk.grackle.preview.UpdateSemaphoreResponse\"\x00\x12|\n\x0f\x44\x65leteSemaphore\x12\x32.com.evrblk.grackle.preview.DeleteSemaphoreRequest\x1a\x33.com.evrblk.grackle.preview.DeleteSemaphoreResponse\"\x00\x12|\n\x0f\x43reateWaitGroup\x12\x32.com.evrblk.grackle.preview.CreateWaitGroupRequest\x1a\x33.com.evrblk.grackle.preview.CreateWaitGroupResponse\"\x00\x12y\n\x0eListWaitGroups\x12\x31.com.evrblk.grackle.preview.ListWaitGroupsRequest\x1a\x32.com.evrblk.grackle.preview.ListWaitGroupsResponse\"\x00\x12s\n\x0cGetWaitGroup\x12/.com.evrblk.grackle.preview.GetWaitGroupRequest\x1a\x30.com.evrblk.grackle.preview.GetWaitGroupResponse\"\x00\x12|\n\x0f\x44\x65leteWaitGroup\x12\x32.com.evrblk.grackle.preview.DeleteWaitGroupRequest\x1a\x33.com.evrblk.grackle.preview.DeleteWaitGroupResponse\"\x00\x12\x85\x01\n\x12\x41\x64\x64JobsToWaitGroup\x12\x35.com.evrblk.grackle.preview.AddJobsToWaitGroupRequest\x1a\x36.com.evrblk.grackle.preview.AddJobsToWaitGroupResponse\"\x00\x12\x9a\x01\n\x19\x43ompleteJobsFromWaitGroup\x12<.com.evrblk.grackle.preview.CompleteJobsFromWaitGroupRequest\x1a=.com.evrblk.grackle.preview.CompleteJobsFromWaitGroupResponse\"\x00\x12p\n\x0b\x41\x63quireLock\x12..com.evrblk.grackle.preview.AcquireLockRequest\x1a/.com.evrblk.grackle.preview.AcquireLockResponse\"\x00\x12p\n\x0bReleaseLock\x12..com.evrblk.grackle.preview.ReleaseLockRequest\x1a/.com.evrblk.grackle.preview.ReleaseLockResponse\"\x00\x12\x64\n\x07GetLock\x12*.com.evrblk.grackle.preview.GetLockRequest\x1a+.com.evrblk.grackle.preview.GetLockResponse\"\x00\x12m\n\nDeleteLock\x12-.com.evrblk.grackle.preview.DeleteLockRequest\x1a..com.evrblk.grackle.preview.DeleteLockResponse\"\x00\x12j\n\tListLocks\x12,.com.evrblk.grackle.preview.ListLocksRequest\x1a-.com.evrblk.grackle.preview.ListLocksResponse\"\x00\x42PZ3github.com/evrblk/evrblk-go/grackle/preview;grackle\xea\x02\x18\x45vrblk::Grackle::Previewb\x06proto3"
9
+
10
+ pool = ::Google::Protobuf::DescriptorPool.generated_pool
11
+ pool.add_serialized_file(descriptor_data)
12
+
13
+ module Evrblk
14
+ module Grackle
15
+ module Preview
16
+ CreateNamespaceRequest = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("com.evrblk.grackle.preview.CreateNamespaceRequest").msgclass
17
+ CreateNamespaceResponse = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("com.evrblk.grackle.preview.CreateNamespaceResponse").msgclass
18
+ ListNamespacesRequest = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("com.evrblk.grackle.preview.ListNamespacesRequest").msgclass
19
+ ListNamespacesResponse = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("com.evrblk.grackle.preview.ListNamespacesResponse").msgclass
20
+ GetNamespaceRequest = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("com.evrblk.grackle.preview.GetNamespaceRequest").msgclass
21
+ GetNamespaceResponse = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("com.evrblk.grackle.preview.GetNamespaceResponse").msgclass
22
+ DeleteNamespaceRequest = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("com.evrblk.grackle.preview.DeleteNamespaceRequest").msgclass
23
+ DeleteNamespaceResponse = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("com.evrblk.grackle.preview.DeleteNamespaceResponse").msgclass
24
+ UpdateNamespaceRequest = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("com.evrblk.grackle.preview.UpdateNamespaceRequest").msgclass
25
+ UpdateNamespaceResponse = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("com.evrblk.grackle.preview.UpdateNamespaceResponse").msgclass
26
+ CreateSemaphoreRequest = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("com.evrblk.grackle.preview.CreateSemaphoreRequest").msgclass
27
+ CreateSemaphoreResponse = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("com.evrblk.grackle.preview.CreateSemaphoreResponse").msgclass
28
+ ListSemaphoresRequest = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("com.evrblk.grackle.preview.ListSemaphoresRequest").msgclass
29
+ ListSemaphoresResponse = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("com.evrblk.grackle.preview.ListSemaphoresResponse").msgclass
30
+ GetSemaphoreRequest = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("com.evrblk.grackle.preview.GetSemaphoreRequest").msgclass
31
+ GetSemaphoreResponse = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("com.evrblk.grackle.preview.GetSemaphoreResponse").msgclass
32
+ AcquireSemaphoreRequest = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("com.evrblk.grackle.preview.AcquireSemaphoreRequest").msgclass
33
+ AcquireSemaphoreResponse = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("com.evrblk.grackle.preview.AcquireSemaphoreResponse").msgclass
34
+ ReleaseSemaphoreRequest = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("com.evrblk.grackle.preview.ReleaseSemaphoreRequest").msgclass
35
+ ReleaseSemaphoreResponse = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("com.evrblk.grackle.preview.ReleaseSemaphoreResponse").msgclass
36
+ UpdateSemaphoreRequest = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("com.evrblk.grackle.preview.UpdateSemaphoreRequest").msgclass
37
+ UpdateSemaphoreResponse = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("com.evrblk.grackle.preview.UpdateSemaphoreResponse").msgclass
38
+ DeleteSemaphoreRequest = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("com.evrblk.grackle.preview.DeleteSemaphoreRequest").msgclass
39
+ DeleteSemaphoreResponse = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("com.evrblk.grackle.preview.DeleteSemaphoreResponse").msgclass
40
+ Semaphore = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("com.evrblk.grackle.preview.Semaphore").msgclass
41
+ SemaphoreHolder = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("com.evrblk.grackle.preview.SemaphoreHolder").msgclass
42
+ CreateWaitGroupRequest = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("com.evrblk.grackle.preview.CreateWaitGroupRequest").msgclass
43
+ CreateWaitGroupResponse = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("com.evrblk.grackle.preview.CreateWaitGroupResponse").msgclass
44
+ ListWaitGroupsRequest = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("com.evrblk.grackle.preview.ListWaitGroupsRequest").msgclass
45
+ ListWaitGroupsResponse = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("com.evrblk.grackle.preview.ListWaitGroupsResponse").msgclass
46
+ GetWaitGroupRequest = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("com.evrblk.grackle.preview.GetWaitGroupRequest").msgclass
47
+ GetWaitGroupResponse = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("com.evrblk.grackle.preview.GetWaitGroupResponse").msgclass
48
+ DeleteWaitGroupRequest = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("com.evrblk.grackle.preview.DeleteWaitGroupRequest").msgclass
49
+ DeleteWaitGroupResponse = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("com.evrblk.grackle.preview.DeleteWaitGroupResponse").msgclass
50
+ AddJobsToWaitGroupRequest = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("com.evrblk.grackle.preview.AddJobsToWaitGroupRequest").msgclass
51
+ AddJobsToWaitGroupResponse = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("com.evrblk.grackle.preview.AddJobsToWaitGroupResponse").msgclass
52
+ CompleteJobsFromWaitGroupRequest = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("com.evrblk.grackle.preview.CompleteJobsFromWaitGroupRequest").msgclass
53
+ CompleteJobsFromWaitGroupResponse = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("com.evrblk.grackle.preview.CompleteJobsFromWaitGroupResponse").msgclass
54
+ WaitGroup = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("com.evrblk.grackle.preview.WaitGroup").msgclass
55
+ AcquireLockRequest = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("com.evrblk.grackle.preview.AcquireLockRequest").msgclass
56
+ AcquireLockResponse = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("com.evrblk.grackle.preview.AcquireLockResponse").msgclass
57
+ ReleaseLockRequest = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("com.evrblk.grackle.preview.ReleaseLockRequest").msgclass
58
+ ReleaseLockResponse = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("com.evrblk.grackle.preview.ReleaseLockResponse").msgclass
59
+ GetLockRequest = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("com.evrblk.grackle.preview.GetLockRequest").msgclass
60
+ GetLockResponse = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("com.evrblk.grackle.preview.GetLockResponse").msgclass
61
+ DeleteLockRequest = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("com.evrblk.grackle.preview.DeleteLockRequest").msgclass
62
+ DeleteLockResponse = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("com.evrblk.grackle.preview.DeleteLockResponse").msgclass
63
+ ListLocksRequest = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("com.evrblk.grackle.preview.ListLocksRequest").msgclass
64
+ ListLocksResponse = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("com.evrblk.grackle.preview.ListLocksResponse").msgclass
65
+ Lock = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("com.evrblk.grackle.preview.Lock").msgclass
66
+ LockHolder = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("com.evrblk.grackle.preview.LockHolder").msgclass
67
+ Namespace = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("com.evrblk.grackle.preview.Namespace").msgclass
68
+ LockState = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("com.evrblk.grackle.preview.LockState").enummodule
69
+ end
70
+ end
71
+ end
@@ -0,0 +1,48 @@
1
+ # Generated by the protocol buffer compiler. DO NOT EDIT!
2
+ # Source: grackle/preview/api.proto for package 'Evrblk.Grackle.Preview'
3
+
4
+ require 'grpc'
5
+ require 'evrblk/grackle/preview/api_pb'
6
+
7
+ module Evrblk
8
+ module Grackle
9
+ module Preview
10
+ module GracklePreviewApi
11
+ class Service
12
+
13
+ include ::GRPC::GenericService
14
+
15
+ self.marshal_class_method = :encode
16
+ self.unmarshal_class_method = :decode
17
+ self.service_name = 'com.evrblk.grackle.preview.GracklePreviewApi'
18
+
19
+ rpc :CreateNamespace, ::Evrblk::Grackle::Preview::CreateNamespaceRequest, ::Evrblk::Grackle::Preview::CreateNamespaceResponse
20
+ rpc :ListNamespaces, ::Evrblk::Grackle::Preview::ListNamespacesRequest, ::Evrblk::Grackle::Preview::ListNamespacesResponse
21
+ rpc :GetNamespace, ::Evrblk::Grackle::Preview::GetNamespaceRequest, ::Evrblk::Grackle::Preview::GetNamespaceResponse
22
+ rpc :DeleteNamespace, ::Evrblk::Grackle::Preview::DeleteNamespaceRequest, ::Evrblk::Grackle::Preview::DeleteNamespaceResponse
23
+ rpc :UpdateNamespace, ::Evrblk::Grackle::Preview::UpdateNamespaceRequest, ::Evrblk::Grackle::Preview::UpdateNamespaceResponse
24
+ rpc :CreateSemaphore, ::Evrblk::Grackle::Preview::CreateSemaphoreRequest, ::Evrblk::Grackle::Preview::CreateSemaphoreResponse
25
+ rpc :ListSemaphores, ::Evrblk::Grackle::Preview::ListSemaphoresRequest, ::Evrblk::Grackle::Preview::ListSemaphoresResponse
26
+ rpc :GetSemaphore, ::Evrblk::Grackle::Preview::GetSemaphoreRequest, ::Evrblk::Grackle::Preview::GetSemaphoreResponse
27
+ rpc :AcquireSemaphore, ::Evrblk::Grackle::Preview::AcquireSemaphoreRequest, ::Evrblk::Grackle::Preview::AcquireSemaphoreResponse
28
+ rpc :ReleaseSemaphore, ::Evrblk::Grackle::Preview::ReleaseSemaphoreRequest, ::Evrblk::Grackle::Preview::ReleaseSemaphoreResponse
29
+ rpc :UpdateSemaphore, ::Evrblk::Grackle::Preview::UpdateSemaphoreRequest, ::Evrblk::Grackle::Preview::UpdateSemaphoreResponse
30
+ rpc :DeleteSemaphore, ::Evrblk::Grackle::Preview::DeleteSemaphoreRequest, ::Evrblk::Grackle::Preview::DeleteSemaphoreResponse
31
+ rpc :CreateWaitGroup, ::Evrblk::Grackle::Preview::CreateWaitGroupRequest, ::Evrblk::Grackle::Preview::CreateWaitGroupResponse
32
+ rpc :ListWaitGroups, ::Evrblk::Grackle::Preview::ListWaitGroupsRequest, ::Evrblk::Grackle::Preview::ListWaitGroupsResponse
33
+ rpc :GetWaitGroup, ::Evrblk::Grackle::Preview::GetWaitGroupRequest, ::Evrblk::Grackle::Preview::GetWaitGroupResponse
34
+ rpc :DeleteWaitGroup, ::Evrblk::Grackle::Preview::DeleteWaitGroupRequest, ::Evrblk::Grackle::Preview::DeleteWaitGroupResponse
35
+ rpc :AddJobsToWaitGroup, ::Evrblk::Grackle::Preview::AddJobsToWaitGroupRequest, ::Evrblk::Grackle::Preview::AddJobsToWaitGroupResponse
36
+ rpc :CompleteJobsFromWaitGroup, ::Evrblk::Grackle::Preview::CompleteJobsFromWaitGroupRequest, ::Evrblk::Grackle::Preview::CompleteJobsFromWaitGroupResponse
37
+ rpc :AcquireLock, ::Evrblk::Grackle::Preview::AcquireLockRequest, ::Evrblk::Grackle::Preview::AcquireLockResponse
38
+ rpc :ReleaseLock, ::Evrblk::Grackle::Preview::ReleaseLockRequest, ::Evrblk::Grackle::Preview::ReleaseLockResponse
39
+ rpc :GetLock, ::Evrblk::Grackle::Preview::GetLockRequest, ::Evrblk::Grackle::Preview::GetLockResponse
40
+ rpc :DeleteLock, ::Evrblk::Grackle::Preview::DeleteLockRequest, ::Evrblk::Grackle::Preview::DeleteLockResponse
41
+ rpc :ListLocks, ::Evrblk::Grackle::Preview::ListLocksRequest, ::Evrblk::Grackle::Preview::ListLocksResponse
42
+ end
43
+
44
+ Stub = Service.rpc_stub_class
45
+ end
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,126 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Evrblk::Grackle::Preview
4
+ class Client
5
+ def initialize(request_signer, endpoint)
6
+ @grpc = Evrblk::Grackle::Preview::GracklePreviewApi::Stub.new(endpoint, :this_channel_is_insecure)
7
+ @request_signer = request_signer
8
+ end
9
+
10
+ def create_namespace(request_hash)
11
+ request = Evrblk::HashConverter.hash_to_grpc_message(request_hash, Evrblk::Grackle::Preview::CreateNamespaceRequest)
12
+ @grpc.create_namespace(request, metadata: @request_signer.sign(request))
13
+ end
14
+
15
+ def list_namespaces(request_hash)
16
+ request = Evrblk::HashConverter.hash_to_grpc_message(request_hash, Evrblk::Grackle::Preview::ListNamespacesRequest)
17
+ @grpc.list_namespaces(request, metadata: @request_signer.sign(request))
18
+ end
19
+
20
+ def get_namespace(request_hash)
21
+ request = Evrblk::HashConverter.hash_to_grpc_message(request_hash, Evrblk::Grackle::Preview::GetNamespaceRequest)
22
+ @grpc.get_namespace(request, metadata: @request_signer.sign(request))
23
+ end
24
+
25
+ def delete_namespace(request_hash)
26
+ request = Evrblk::HashConverter.hash_to_grpc_message(request_hash, Evrblk::Grackle::Preview::DeleteNamespaceRequest)
27
+ @grpc.delete_namespace(request, metadata: @request_signer.sign(request))
28
+ end
29
+
30
+ def update_namespace(request_hash)
31
+ request = Evrblk::HashConverter.hash_to_grpc_message(request_hash, Evrblk::Grackle::Preview::UpdateNamespaceRequest)
32
+ @grpc.update_namespace(request, metadata: @request_signer.sign(request))
33
+ end
34
+
35
+ def create_semaphore(request_hash)
36
+ request = Evrblk::HashConverter.hash_to_grpc_message(request_hash, Evrblk::Grackle::Preview::CreateSemaphoreRequest)
37
+ @grpc.create_semaphore(request, metadata: @request_signer.sign(request))
38
+ end
39
+
40
+ def list_semaphores(request_hash)
41
+ request = Evrblk::HashConverter.hash_to_grpc_message(request_hash, Evrblk::Grackle::Preview::ListSemaphoresRequest)
42
+ @grpc.list_semaphores(request, metadata: @request_signer.sign(request))
43
+ end
44
+
45
+ def get_semaphore(request_hash)
46
+ request = Evrblk::HashConverter.hash_to_grpc_message(request_hash, Evrblk::Grackle::Preview::GetSemaphoreRequest)
47
+ @grpc.get_semaphore(request, metadata: @request_signer.sign(request))
48
+ end
49
+
50
+ def acquire_semaphore(request_hash)
51
+ request = Evrblk::HashConverter.hash_to_grpc_message(request_hash, Evrblk::Grackle::Preview::AcquireSemaphoreRequest)
52
+ @grpc.acquire_semaphore(request, metadata: @request_signer.sign(request))
53
+ end
54
+
55
+ def release_semaphore(request_hash)
56
+ request = Evrblk::HashConverter.hash_to_grpc_message(request_hash, Evrblk::Grackle::Preview::ReleaseSemaphoreRequest)
57
+ @grpc.release_semaphore(request, metadata: @request_signer.sign(request))
58
+ end
59
+
60
+ def update_semaphore(request_hash)
61
+ request = Evrblk::HashConverter.hash_to_grpc_message(request_hash, Evrblk::Grackle::Preview::UpdateSemaphoreRequest)
62
+ @grpc.update_semaphore(request, metadata: @request_signer.sign(request))
63
+ end
64
+
65
+ def delete_semaphore(request_hash)
66
+ request = Evrblk::HashConverter.hash_to_grpc_message(request_hash, Evrblk::Grackle::Preview::DeleteSemaphoreRequest)
67
+ @grpc.delete_semaphore(request, metadata: @request_signer.sign(request))
68
+ end
69
+
70
+ def create_wait_group(request_hash)
71
+ request = Evrblk::HashConverter.hash_to_grpc_message(request_hash, Evrblk::Grackle::Preview::CreateWaitGroupRequest)
72
+ @grpc.create_wait_group(request, metadata: @request_signer.sign(request))
73
+ end
74
+
75
+ def list_wait_groups(request_hash)
76
+ request = Evrblk::HashConverter.hash_to_grpc_message(request_hash, Evrblk::Grackle::Preview::ListWaitGroupsRequest)
77
+ @grpc.list_wait_groups(request, metadata: @request_signer.sign(request))
78
+ end
79
+
80
+ def get_wait_group(request_hash)
81
+ request = Evrblk::HashConverter.hash_to_grpc_message(request_hash, Evrblk::Grackle::Preview::GetWaitGroupRequest)
82
+ @grpc.get_wait_group(request, metadata: @request_signer.sign(request))
83
+ end
84
+
85
+ def delete_wait_group(request_hash)
86
+ request = Evrblk::HashConverter.hash_to_grpc_message(request_hash, Evrblk::Grackle::Preview::DeleteWaitGroupRequest)
87
+ @grpc.delete_wait_group(request, metadata: @request_signer.sign(request))
88
+ end
89
+
90
+ def add_jobs_to_wait_group(request_hash)
91
+ request = Evrblk::HashConverter.hash_to_grpc_message(request_hash, Evrblk::Grackle::Preview::AddJobsToWaitGroupRequest)
92
+ @grpc.add_jobs_to_wait_group(request, metadata: @request_signer.sign(request))
93
+ end
94
+
95
+ def complete_jobs_from_wait_group(request_hash)
96
+ request = Evrblk::HashConverter.hash_to_grpc_message(request_hash, Evrblk::Grackle::Preview::CompleteJobsFromWaitGroupRequest)
97
+ @grpc.complete_jobs_from_wait_group(request, metadata: @request_signer.sign(request))
98
+ end
99
+
100
+ def acquire_lock(request_hash)
101
+ request = Evrblk::HashConverter.hash_to_grpc_message(request_hash, Evrblk::Grackle::Preview::AcquireLockRequest)
102
+ @grpc.acquire_lock(request, metadata: @request_signer.sign(request))
103
+ end
104
+
105
+ def release_lock(request_hash)
106
+ request = Evrblk::HashConverter.hash_to_grpc_message(request_hash, Evrblk::Grackle::Preview::ReleaseLockRequest)
107
+ @grpc.release_lock(request, metadata: @request_signer.sign(request))
108
+ end
109
+
110
+ def get_lock(request_hash)
111
+ request = Evrblk::HashConverter.hash_to_grpc_message(request_hash, Evrblk::Grackle::Preview::GetLockRequest)
112
+ @grpc.get_lock(request, metadata: @request_signer.sign(request))
113
+ end
114
+
115
+ def delete_lock(request_hash)
116
+ request = Evrblk::HashConverter.hash_to_grpc_message(request_hash, Evrblk::Grackle::Preview::DeleteLockRequest)
117
+ @grpc.delete_lock(request, metadata: @request_signer.sign(request))
118
+ end
119
+
120
+ def list_locks(request_hash)
121
+ request = Evrblk::HashConverter.hash_to_grpc_message(request_hash, Evrblk::Grackle::Preview::ListLocksRequest)
122
+ @grpc.list_locks(request, metadata: @request_signer.sign(request))
123
+ end
124
+ end
125
+ end
126
+
@@ -0,0 +1,62 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Evrblk
4
+ class HashConverter
5
+ def self.hash_to_grpc_message(source_hash, message_class)
6
+ serialize_with_descriptor(message_class.descriptor, source_hash.dup)
7
+ end
8
+
9
+ private
10
+
11
+ def self.serialize_with_descriptor(descriptor_class, hash_value)
12
+ return hash_value if descriptor_class.nil?
13
+
14
+ new_hash = {}
15
+ available_keys = hash_value.keys
16
+ descriptor_class.entries.each do |entry|
17
+ is_key_present = available_keys.include?(entry.name.to_sym)
18
+ value = serialize_with_field_descriptor(entry, hash_value[entry.name.to_sym], is_key_present: is_key_present)
19
+ unless value.nil?
20
+ new_hash[entry.name] = value
21
+ end
22
+ end
23
+
24
+ descriptor_class.msgclass.new(new_hash)
25
+ end
26
+
27
+ def self.serialize_with_field_descriptor(field_descriptor, value, is_key_present: true)
28
+ return value if field_descriptor.nil?
29
+
30
+ if field_descriptor.label == :repeated
31
+ return serialize_with_repeated_field(field_descriptor, value)
32
+ end
33
+ if field_descriptor.type == :message
34
+ if field_descriptor.subtype.is_a?(Google::Protobuf::Descriptor)
35
+ return serialize_with_descriptor(field_descriptor.subtype, value) unless value.nil?
36
+ end
37
+
38
+ return field_descriptor.subtype.msgclass.new(value) unless value.nil?
39
+
40
+ end
41
+ value
42
+ end
43
+
44
+ def self.serialize_with_repeated_field(field_descriptor, value)
45
+ if field_descriptor.label == :repeated
46
+ if field_descriptor.subtype && field_descriptor.subtype.lookup("key")
47
+ if field_descriptor.subtype.lookup("value")
48
+ value_dup = ({})
49
+ org_value = value || {}
50
+ org_value.keys.each do |k|
51
+ value_dup[k.to_s] = (serialize_with_field_descriptor(field_descriptor.subtype.lookup("value"), org_value[k]))
52
+ end
53
+ return value_dup
54
+ else
55
+ return value
56
+ end
57
+ end
58
+ return (value || []).map { |v| serialize_with_descriptor(field_descriptor.subtype, v) }
59
+ end
60
+ end
61
+ end
62
+ end