statelydb 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 5716a868b12a20de48e33bddf16396bac216172edc29ee5302eb3477380c7943
4
+ data.tar.gz: 98ca1b24cd5bdaa79409de8bf36e10bc573bc6c0b80bf8194bb08eeddc91cf0a
5
+ SHA512:
6
+ metadata.gz: 13a52d97a5ac5c309a3249dcbd1f5cb15392edc40c87a65a34064be54dfc44e5d6dd5ed6bff63fd4793f6e85297dbff92660fdc50a490d994c4af41e4ed9159c
7
+ data.tar.gz: cb8ce77af551b2c015c06ab75114517fe05376c26f1d8b228dde017b25da3685d7d8ee551bc140b50dc15fe06982618d485aab43dc88e7f63ebd47bdbd04769c
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+ # Generated by the protocol buffer compiler. DO NOT EDIT!
3
+ # source: db/continue_list.proto
4
+
5
+ require 'google/protobuf'
6
+
7
+
8
+ descriptor_data = "\n\x16\x64\x62/continue_list.proto\x12\nstately.db\"u\n\x13\x43ontinueListRequest\x12\x1d\n\ntoken_data\x18\x01 \x01(\x0cR\ttokenData\x12?\n\tdirection\x18\x02 \x01(\x0e\x32!.stately.db.ContinueListDirectionR\tdirection*N\n\x15\x43ontinueListDirection\x12\x19\n\x15\x43ONTINUE_LIST_FORWARD\x10\x00\x12\x1a\n\x16\x43ONTINUE_LIST_BACKWARD\x10\x01\x42l\n\x0e\x63om.stately.dbB\x11\x43ontinueListProtoP\x01\xa2\x02\x03SDX\xaa\x02\nStately.Db\xca\x02\nStately\\Db\xe2\x02\x16Stately\\Db\\GPBMetadata\xea\x02\x0bStately::Dbb\x06proto3"
9
+
10
+ pool = Google::Protobuf::DescriptorPool.generated_pool
11
+ pool.add_serialized_file(descriptor_data)
12
+
13
+ module Stately
14
+ module Db
15
+ ContinueListRequest = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("stately.db.ContinueListRequest").msgclass
16
+ ContinueListDirection = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("stately.db.ContinueListDirection").enummodule
17
+ end
18
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+ # Generated by the protocol buffer compiler. DO NOT EDIT!
3
+ # source: db/delete.proto
4
+
5
+ require 'google/protobuf'
6
+
7
+
8
+ descriptor_data = "\n\x0f\x64\x62/delete.proto\x12\nstately.db\"b\n\rDeleteRequest\x12\x19\n\x08store_id\x18\x01 \x01(\x04R\x07storeId\x12\x30\n\x07\x64\x65letes\x18\x03 \x03(\x0b\x32\x16.stately.db.DeleteItemR\x07\x64\x65letesJ\x04\x08\x04\x10\x05\"\'\n\nDeleteItem\x12\x19\n\x08key_path\x18\x01 \x01(\tR\x07keyPath\"/\n\x0c\x44\x65leteResult\x12\x19\n\x08key_path\x18\x01 \x01(\tR\x07keyPathJ\x04\x08\x02\x10\x03\"D\n\x0e\x44\x65leteResponse\x12\x32\n\x07results\x18\x01 \x03(\x0b\x32\x18.stately.db.DeleteResultR\x07resultsBf\n\x0e\x63om.stately.dbB\x0b\x44\x65leteProtoP\x01\xa2\x02\x03SDX\xaa\x02\nStately.Db\xca\x02\nStately\\Db\xe2\x02\x16Stately\\Db\\GPBMetadata\xea\x02\x0bStately::Dbb\x06proto3"
9
+
10
+ pool = Google::Protobuf::DescriptorPool.generated_pool
11
+ pool.add_serialized_file(descriptor_data)
12
+
13
+ module Stately
14
+ module Db
15
+ DeleteRequest = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("stately.db.DeleteRequest").msgclass
16
+ DeleteItem = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("stately.db.DeleteItem").msgclass
17
+ DeleteResult = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("stately.db.DeleteResult").msgclass
18
+ DeleteResponse = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("stately.db.DeleteResponse").msgclass
19
+ end
20
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+ # Generated by the protocol buffer compiler. DO NOT EDIT!
3
+ # source: db/get.proto
4
+
5
+ require 'google/protobuf'
6
+
7
+ require 'db/item_pb'
8
+
9
+
10
+ descriptor_data = "\n\x0c\x64\x62/get.proto\x12\nstately.db\x1a\rdb/item.proto\"w\n\nGetRequest\x12\x19\n\x08store_id\x18\x01 \x01(\x04R\x07storeId\x12\'\n\x04gets\x18\x02 \x03(\x0b\x32\x13.stately.db.GetItemR\x04gets\x12\x1f\n\x0b\x61llow_stale\x18\x03 \x01(\x08R\nallowStaleJ\x04\x08\x04\x10\x05\"$\n\x07GetItem\x12\x19\n\x08key_path\x18\x01 \x01(\tR\x07keyPath\"5\n\x0bGetResponse\x12&\n\x05items\x18\x01 \x03(\x0b\x32\x10.stately.db.ItemR\x05itemsBc\n\x0e\x63om.stately.dbB\x08GetProtoP\x01\xa2\x02\x03SDX\xaa\x02\nStately.Db\xca\x02\nStately\\Db\xe2\x02\x16Stately\\Db\\GPBMetadata\xea\x02\x0bStately::Dbb\x06proto3"
11
+
12
+ pool = Google::Protobuf::DescriptorPool.generated_pool
13
+ pool.add_serialized_file(descriptor_data)
14
+
15
+ module Stately
16
+ module Db
17
+ GetRequest = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("stately.db.GetRequest").msgclass
18
+ GetItem = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("stately.db.GetItem").msgclass
19
+ GetResponse = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("stately.db.GetResponse").msgclass
20
+ end
21
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+ # Generated by the protocol buffer compiler. DO NOT EDIT!
3
+ # source: db/item.proto
4
+
5
+ require 'google/protobuf'
6
+
7
+ require 'google/protobuf/struct_pb'
8
+
9
+
10
+ descriptor_data = "\n\rdb/item.proto\x12\nstately.db\x1a\x1cgoogle/protobuf/struct.proto\"u\n\x04Item\x12\x1b\n\titem_type\x18\x01 \x01(\tR\x08itemType\x12\x16\n\x05proto\x18\x02 \x01(\x0cH\x00R\x05proto\x12-\n\x04json\x18\x03 \x01(\x0b\x32\x17.google.protobuf.StructH\x00R\x04jsonB\t\n\x07payloadBd\n\x0e\x63om.stately.dbB\tItemProtoP\x01\xa2\x02\x03SDX\xaa\x02\nStately.Db\xca\x02\nStately\\Db\xe2\x02\x16Stately\\Db\\GPBMetadata\xea\x02\x0bStately::Dbb\x06proto3"
11
+
12
+ pool = Google::Protobuf::DescriptorPool.generated_pool
13
+ pool.add_serialized_file(descriptor_data)
14
+
15
+ module Stately
16
+ module Db
17
+ Item = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("stately.db.Item").msgclass
18
+ end
19
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+ # Generated by the protocol buffer compiler. DO NOT EDIT!
3
+ # source: db/item_property.proto
4
+
5
+ require 'google/protobuf'
6
+
7
+
8
+ descriptor_data = "\n\x16\x64\x62/item_property.proto\x12\nstately.db*\x8b\x02\n\x10SortableProperty\x12\x1e\n\x1aSORTABLE_PROPERTY_KEY_PATH\x10\x00\x12+\n\'SORTABLE_PROPERTY_LAST_MODIFIED_VERSION\x10\x01\x12)\n%SORTABLE_PROPERTY_GROUP_LOCAL_INDEX_1\x10\x08\x12)\n%SORTABLE_PROPERTY_GROUP_LOCAL_INDEX_2\x10\t\x12)\n%SORTABLE_PROPERTY_GROUP_LOCAL_INDEX_3\x10\n\x12)\n%SORTABLE_PROPERTY_GROUP_LOCAL_INDEX_4\x10\x0b\x42l\n\x0e\x63om.stately.dbB\x11ItemPropertyProtoP\x01\xa2\x02\x03SDX\xaa\x02\nStately.Db\xca\x02\nStately\\Db\xe2\x02\x16Stately\\Db\\GPBMetadata\xea\x02\x0bStately::Dbb\x06proto3"
9
+
10
+ pool = Google::Protobuf::DescriptorPool.generated_pool
11
+ pool.add_serialized_file(descriptor_data)
12
+
13
+ module Stately
14
+ module Db
15
+ SortableProperty = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("stately.db.SortableProperty").enummodule
16
+ end
17
+ end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+ # Generated by the protocol buffer compiler. DO NOT EDIT!
3
+ # source: db/list.proto
4
+
5
+ require 'google/protobuf'
6
+
7
+ require 'db/item_pb'
8
+ require 'db/item_property_pb'
9
+ require 'db/list_token_pb'
10
+
11
+
12
+ descriptor_data = "\n\rdb/list.proto\x12\nstately.db\x1a\rdb/item.proto\x1a\x16\x64\x62/item_property.proto\x1a\x13\x64\x62/list_token.proto\"\x91\x02\n\x10\x42\x65ginListRequest\x12\x19\n\x08store_id\x18\x01 \x01(\x04R\x07storeId\x12&\n\x0fkey_path_prefix\x18\x02 \x01(\tR\rkeyPathPrefix\x12\x14\n\x05limit\x18\x03 \x01(\rR\x05limit\x12\x1f\n\x0b\x61llow_stale\x18\x04 \x01(\x08R\nallowStale\x12\x41\n\rsort_property\x18\x05 \x01(\x0e\x32\x1c.stately.db.SortablePropertyR\x0csortProperty\x12@\n\x0esort_direction\x18\x06 \x01(\x0e\x32\x19.stately.db.SortDirectionR\rsortDirection\"\x8b\x01\n\x0cListResponse\x12\x37\n\x06result\x18\x01 \x01(\x0b\x32\x1d.stately.db.ListPartialResultH\x00R\x06result\x12\x36\n\x08\x66inished\x18\x02 \x01(\x0b\x32\x18.stately.db.ListFinishedH\x00R\x08\x66inishedB\n\n\x08response\";\n\x11ListPartialResult\x12&\n\x05items\x18\x01 \x03(\x0b\x32\x10.stately.db.ItemR\x05items\";\n\x0cListFinished\x12+\n\x05token\x18\x01 \x01(\x0b\x32\x15.stately.db.ListTokenR\x05token*8\n\rSortDirection\x12\x12\n\x0eSORT_ASCENDING\x10\x00\x12\x13\n\x0fSORT_DESCENDING\x10\x01\x42\x64\n\x0e\x63om.stately.dbB\tListProtoP\x01\xa2\x02\x03SDX\xaa\x02\nStately.Db\xca\x02\nStately\\Db\xe2\x02\x16Stately\\Db\\GPBMetadata\xea\x02\x0bStately::Dbb\x06proto3"
13
+
14
+ pool = Google::Protobuf::DescriptorPool.generated_pool
15
+ pool.add_serialized_file(descriptor_data)
16
+
17
+ module Stately
18
+ module Db
19
+ BeginListRequest = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("stately.db.BeginListRequest").msgclass
20
+ ListResponse = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("stately.db.ListResponse").msgclass
21
+ ListPartialResult = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("stately.db.ListPartialResult").msgclass
22
+ ListFinished = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("stately.db.ListFinished").msgclass
23
+ SortDirection = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("stately.db.SortDirection").enummodule
24
+ end
25
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+ # Generated by the protocol buffer compiler. DO NOT EDIT!
3
+ # source: db/list_token.proto
4
+
5
+ require 'google/protobuf'
6
+
7
+
8
+ descriptor_data = "\n\x13\x64\x62/list_token.proto\x12\nstately.db\"h\n\tListToken\x12\x1d\n\ntoken_data\x18\x01 \x01(\x0cR\ttokenData\x12!\n\x0c\x63\x61n_continue\x18\x02 \x01(\x08R\x0b\x63\x61nContinue\x12\x19\n\x08\x63\x61n_sync\x18\x03 \x01(\x08R\x07\x63\x61nSyncBi\n\x0e\x63om.stately.dbB\x0eListTokenProtoP\x01\xa2\x02\x03SDX\xaa\x02\nStately.Db\xca\x02\nStately\\Db\xe2\x02\x16Stately\\Db\\GPBMetadata\xea\x02\x0bStately::Dbb\x06proto3"
9
+
10
+ pool = Google::Protobuf::DescriptorPool.generated_pool
11
+ pool.add_serialized_file(descriptor_data)
12
+
13
+ module Stately
14
+ module Db
15
+ ListToken = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("stately.db.ListToken").msgclass
16
+ end
17
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+ # Generated by the protocol buffer compiler. DO NOT EDIT!
3
+ # source: db/put.proto
4
+
5
+ require 'google/protobuf'
6
+
7
+ require 'db/item_pb'
8
+
9
+
10
+ descriptor_data = "\n\x0c\x64\x62/put.proto\x12\nstately.db\x1a\rdb/item.proto\"P\n\nPutRequest\x12\x19\n\x08store_id\x18\x01 \x01(\x04R\x07storeId\x12\'\n\x04puts\x18\x02 \x03(\x0b\x32\x13.stately.db.PutItemR\x04puts\"/\n\x07PutItem\x12$\n\x04item\x18\x01 \x01(\x0b\x32\x10.stately.db.ItemR\x04item\"5\n\x0bPutResponse\x12&\n\x05items\x18\x01 \x03(\x0b\x32\x10.stately.db.ItemR\x05itemsBc\n\x0e\x63om.stately.dbB\x08PutProtoP\x01\xa2\x02\x03SDX\xaa\x02\nStately.Db\xca\x02\nStately\\Db\xe2\x02\x16Stately\\Db\\GPBMetadata\xea\x02\x0bStately::Dbb\x06proto3"
11
+
12
+ pool = Google::Protobuf::DescriptorPool.generated_pool
13
+ pool.add_serialized_file(descriptor_data)
14
+
15
+ module Stately
16
+ module Db
17
+ PutRequest = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("stately.db.PutRequest").msgclass
18
+ PutItem = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("stately.db.PutItem").msgclass
19
+ PutResponse = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("stately.db.PutResponse").msgclass
20
+ end
21
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+ # Generated by the protocol buffer compiler. DO NOT EDIT!
3
+ # source: db/scan_root_paths.proto
4
+
5
+ require 'google/protobuf'
6
+
7
+
8
+ descriptor_data = "\n\x18\x64\x62/scan_root_paths.proto\x12\nstately.db\"r\n\x14ScanRootPathsRequest\x12\x19\n\x08store_id\x18\x01 \x01(\x04R\x07storeId\x12\x14\n\x05limit\x18\x02 \x01(\rR\x05limit\x12)\n\x10pagination_token\x18\x03 \x01(\x0cR\x0fpaginationToken\"|\n\x15ScanRootPathsResponse\x12\x38\n\x07results\x18\x01 \x03(\x0b\x32\x1e.stately.db.ScanRootPathResultR\x07results\x12)\n\x10pagination_token\x18\x02 \x01(\x0cR\x0fpaginationToken\"/\n\x12ScanRootPathResult\x12\x19\n\x08key_path\x18\x01 \x01(\tR\x07keyPathBm\n\x0e\x63om.stately.dbB\x12ScanRootPathsProtoP\x01\xa2\x02\x03SDX\xaa\x02\nStately.Db\xca\x02\nStately\\Db\xe2\x02\x16Stately\\Db\\GPBMetadata\xea\x02\x0bStately::Dbb\x06proto3"
9
+
10
+ pool = Google::Protobuf::DescriptorPool.generated_pool
11
+ pool.add_serialized_file(descriptor_data)
12
+
13
+ module Stately
14
+ module Db
15
+ ScanRootPathsRequest = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("stately.db.ScanRootPathsRequest").msgclass
16
+ ScanRootPathsResponse = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("stately.db.ScanRootPathsResponse").msgclass
17
+ ScanRootPathResult = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("stately.db.ScanRootPathResult").msgclass
18
+ end
19
+ end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+ # Generated by the protocol buffer compiler. DO NOT EDIT!
3
+ # source: db/service.proto
4
+
5
+ require 'google/protobuf'
6
+
7
+ require 'db/continue_list_pb'
8
+ require 'db/delete_pb'
9
+ require 'db/get_pb'
10
+ require 'db/list_pb'
11
+ require 'db/put_pb'
12
+ require 'db/scan_root_paths_pb'
13
+ require 'db/sync_list_pb'
14
+ require 'db/transaction_pb'
15
+
16
+
17
+ descriptor_data = "\n\x10\x64\x62/service.proto\x12\nstately.db\x1a\x16\x64\x62/continue_list.proto\x1a\x0f\x64\x62/delete.proto\x1a\x0c\x64\x62/get.proto\x1a\rdb/list.proto\x1a\x0c\x64\x62/put.proto\x1a\x18\x64\x62/scan_root_paths.proto\x1a\x12\x64\x62/sync_list.proto\x1a\x14\x64\x62/transaction.proto2\xee\x04\n\x0f\x44\x61tabaseService\x12;\n\x03Put\x12\x16.stately.db.PutRequest\x1a\x17.stately.db.PutResponse\"\x03\x90\x02\x02\x12;\n\x03Get\x12\x16.stately.db.GetRequest\x1a\x17.stately.db.GetResponse\"\x03\x90\x02\x01\x12\x44\n\x06\x44\x65lete\x12\x19.stately.db.DeleteRequest\x1a\x1a.stately.db.DeleteResponse\"\x03\x90\x02\x02\x12J\n\tBeginList\x12\x1c.stately.db.BeginListRequest\x1a\x18.stately.db.ListResponse\"\x03\x90\x02\x01\x30\x01\x12P\n\x0c\x43ontinueList\x12\x1f.stately.db.ContinueListRequest\x1a\x18.stately.db.ListResponse\"\x03\x90\x02\x01\x30\x01\x12L\n\x08SyncList\x12\x1b.stately.db.SyncListRequest\x1a\x1c.stately.db.SyncListResponse\"\x03\x90\x02\x01\x30\x01\x12T\n\x0bTransaction\x12\x1e.stately.db.TransactionRequest\x1a\x1f.stately.db.TransactionResponse\"\x00(\x01\x30\x01\x12Y\n\rScanRootPaths\x12 .stately.db.ScanRootPathsRequest\x1a!.stately.db.ScanRootPathsResponse\"\x03\x90\x02\x01\x42g\n\x0e\x63om.stately.dbB\x0cServiceProtoP\x01\xa2\x02\x03SDX\xaa\x02\nStately.Db\xca\x02\nStately\\Db\xe2\x02\x16Stately\\Db\\GPBMetadata\xea\x02\x0bStately::Dbb\x06proto3"
18
+
19
+ pool = Google::Protobuf::DescriptorPool.generated_pool
20
+ pool.add_serialized_file(descriptor_data)
21
+
22
+ module Stately
23
+ module Db
24
+ end
25
+ end
@@ -0,0 +1,101 @@
1
+ # Generated by the protocol buffer compiler. DO NOT EDIT!
2
+ # Source: db/service.proto for package 'Stately.Db'
3
+
4
+ require 'grpc'
5
+ require 'db/service_pb'
6
+
7
+ module Stately
8
+ module Db
9
+ module DatabaseService
10
+ # DatabaseService is the service for creating, reading, updating and deleting data
11
+ # in a StatelyDB Store. Creating and modifying Stores is done by
12
+ # stately.dbmanagement.ManagementService.
13
+ class Service
14
+
15
+ include ::GRPC::GenericService
16
+
17
+ self.marshal_class_method = :encode
18
+ self.unmarshal_class_method = :decode
19
+ self.service_name = 'stately.db.DatabaseService'
20
+
21
+ # Put adds one or more Items to the Store, or replaces the Items if they
22
+ # already exist. This will fail if the caller does not have permission to
23
+ # create or update Items, if there is no schema registered for the provided
24
+ # item type, or if an item is invalid. All puts are applied atomically;
25
+ # either all will fail or all will succeed. If an item's schema specifies an
26
+ # `initialValue` for one or more properties used in its key paths, and the
27
+ # item is new, you should not provide those values - the database will choose
28
+ # them for you, and Data must be provided as either serialized binary
29
+ # protobuf or JSON.
30
+ rpc :Put, ::Stately::Db::PutRequest, ::Stately::Db::PutResponse
31
+ # Get retrieves one or more Items by their key paths. This will return any of
32
+ # the Items that exist. It will fail if the caller does not have permission
33
+ # to read Items. Use the List APIs if you want to retrieve multiple items but
34
+ # don't already know the full key paths of the items you want to get.
35
+ rpc :Get, ::Stately::Db::GetRequest, ::Stately::Db::GetResponse
36
+ # Delete removes one or more Items from the Store by their key paths. This
37
+ # will fail if the caller does not have permission to delete Items.
38
+ # Tombstones will be saved for deleted items for time, so
39
+ # that SyncList can return information about deleted items. Deletes are
40
+ # always applied atomically; all will fail or all will succeed.
41
+ rpc :Delete, ::Stately::Db::DeleteRequest, ::Stately::Db::DeleteResponse
42
+ # BeginList retrieves Items that start with a specified key path prefix. The
43
+ # key path prefix must minimally contain a Group Key (an item type and an
44
+ # item ID). BeginList will return an empty result set if there are no items
45
+ # matching that key prefix. This API returns a token that you can pass to
46
+ # ContinueList to expand the result set, or to SyncList to get updates within
47
+ # the result set. This can fail if the caller does not have permission to
48
+ # read Items.
49
+ # buf:lint:ignore RPC_RESPONSE_STANDARD_NAME
50
+ rpc :BeginList, ::Stately::Db::BeginListRequest, stream(::Stately::Db::ListResponse)
51
+ # ContinueList takes the token from a BeginList call and returns more results
52
+ # based on the original query parameters and pagination options. It has very
53
+ # few options of its own because it is a continuation of a previous list
54
+ # operation. It will return a new token which can be used for another
55
+ # ContinueList call, and so on. The token is the same one used by SyncList -
56
+ # each time you call either ContinueList or SyncList, you should pass the
57
+ # latest version of the token, and then use the new token from the result in
58
+ # subsequent calls. You may interleave ContinueList and SyncList calls
59
+ # however you like, but it does not make sense to make both calls in
60
+ # parallel. Calls to ContinueList are tied to the authorization of the
61
+ # original BeginList call, so if the original BeginList call was allowed,
62
+ # ContinueList with its token should also be allowed.
63
+ # buf:lint:ignore RPC_RESPONSE_STANDARD_NAME
64
+ rpc :ContinueList, ::Stately::Db::ContinueListRequest, stream(::Stately::Db::ListResponse)
65
+ # SyncList returns all changes to Items within the result set of a previous
66
+ # List operation. For all Items within the result set that were modified, it
67
+ # returns the full Item at in its current state. It also returns a list of
68
+ # Item key paths that were deleted since the last SyncList, which you should
69
+ # reconcile with your view of items returned from previous
70
+ # BeginList/ContinueList calls. Using this API, you can start with an initial
71
+ # set of items from BeginList, and then stay up to date on any changes via
72
+ # repeated SyncList requests over time. The token is the same one used by
73
+ # ContinueList - each time you call either ContinueList or SyncList, you
74
+ # should pass the latest version of the token, and then use the new token
75
+ # from the result in subsequent calls. Note that if the result set has
76
+ # already been expanded to the end (in the direction of the original
77
+ # BeginList request), SyncList will return newly created Items. You may
78
+ # interleave ContinueList and SyncList calls however you like, but it does
79
+ # not make sense to make both calls in parallel. Calls to SyncList are tied
80
+ # to the authorization of the original BeginList call, so if the original
81
+ # BeginList call was allowed, SyncList with its token should also be allowed.
82
+ rpc :SyncList, ::Stately::Db::SyncListRequest, stream(::Stately::Db::SyncListResponse)
83
+ # Transaction performs a transaction, within which you can issue writes
84
+ # (Put/Delete) and reads (Get/List) in any order, followed by a commit
85
+ # message. Reads are guaranteed to reflect the state as of when the
86
+ # transaction started, and writes are committed atomically. This method may
87
+ # fail if another transaction commits before this one finishes - in that
88
+ # case, you should retry your transaction.
89
+ rpc :Transaction, stream(::Stately::Db::TransactionRequest), stream(::Stately::Db::TransactionResponse)
90
+ # ScanRootPaths lists root paths (Groups) in the Store. This is a very
91
+ # expensive operation, as it must consult multiple partitions and it reads
92
+ # and ignores a lot of data. It is provided for use in the web console's data
93
+ # browser and is not exposed to customers. This operation will fail if the
94
+ # caller does not have permission to read Items.
95
+ rpc :ScanRootPaths, ::Stately::Db::ScanRootPathsRequest, ::Stately::Db::ScanRootPathsResponse
96
+ end
97
+
98
+ Stub = Service.rpc_stub_class
99
+ end
100
+ end
101
+ end
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+ # Generated by the protocol buffer compiler. DO NOT EDIT!
3
+ # source: db/sync_list.proto
4
+
5
+ require 'google/protobuf'
6
+
7
+ require 'db/item_pb'
8
+ require 'db/list_pb'
9
+
10
+
11
+ descriptor_data = "\n\x12\x64\x62/sync_list.proto\x12\nstately.db\x1a\rdb/item.proto\x1a\rdb/list.proto\"0\n\x0fSyncListRequest\x12\x1d\n\ntoken_data\x18\x01 \x01(\x0cR\ttokenData\"\xc8\x01\n\x10SyncListResponse\x12\x31\n\x05reset\x18\x01 \x01(\x0b\x32\x19.stately.db.SyncListResetH\x00R\x05reset\x12=\n\x06result\x18\x02 \x01(\x0b\x32#.stately.db.SyncListPartialResponseH\x00R\x06result\x12\x36\n\x08\x66inished\x18\x03 \x01(\x0b\x32\x18.stately.db.ListFinishedH\x00R\x08\x66inishedB\n\n\x08response\"\x0f\n\rSyncListReset\"\xdf\x01\n\x17SyncListPartialResponse\x12\x35\n\rchanged_items\x18\x01 \x03(\x0b\x32\x10.stately.db.ItemR\x0c\x63hangedItems\x12<\n\rdeleted_items\x18\x02 \x03(\x0b\x32\x17.stately.db.DeletedItemR\x0c\x64\x65letedItems\x12O\n%updated_item_keys_outside_list_window\x18\x03 \x03(\tR updatedItemKeysOutsideListWindow\"(\n\x0b\x44\x65letedItem\x12\x19\n\x08key_path\x18\x01 \x01(\tR\x07keyPathBh\n\x0e\x63om.stately.dbB\rSyncListProtoP\x01\xa2\x02\x03SDX\xaa\x02\nStately.Db\xca\x02\nStately\\Db\xe2\x02\x16Stately\\Db\\GPBMetadata\xea\x02\x0bStately::Dbb\x06proto3"
12
+
13
+ pool = Google::Protobuf::DescriptorPool.generated_pool
14
+ pool.add_serialized_file(descriptor_data)
15
+
16
+ module Stately
17
+ module Db
18
+ SyncListRequest = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("stately.db.SyncListRequest").msgclass
19
+ SyncListResponse = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("stately.db.SyncListResponse").msgclass
20
+ SyncListReset = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("stately.db.SyncListReset").msgclass
21
+ SyncListPartialResponse = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("stately.db.SyncListPartialResponse").msgclass
22
+ DeletedItem = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("stately.db.DeletedItem").msgclass
23
+ end
24
+ end
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+ # Generated by the protocol buffer compiler. DO NOT EDIT!
3
+ # source: db/transaction.proto
4
+
5
+ require 'google/protobuf'
6
+
7
+ require 'db/continue_list_pb'
8
+ require 'db/delete_pb'
9
+ require 'db/get_pb'
10
+ require 'db/item_pb'
11
+ require 'db/item_property_pb'
12
+ require 'db/list_pb'
13
+ require 'db/put_pb'
14
+ require 'google/protobuf/empty_pb'
15
+
16
+
17
+ descriptor_data = "\n\x14\x64\x62/transaction.proto\x12\nstately.db\x1a\x16\x64\x62/continue_list.proto\x1a\x0f\x64\x62/delete.proto\x1a\x0c\x64\x62/get.proto\x1a\rdb/item.proto\x1a\x16\x64\x62/item_property.proto\x1a\rdb/list.proto\x1a\x0c\x64\x62/put.proto\x1a\x1bgoogle/protobuf/empty.proto\"\x9f\x04\n\x12TransactionRequest\x12\x1d\n\nmessage_id\x18\x01 \x01(\rR\tmessageId\x12\x34\n\x05\x62\x65gin\x18\x02 \x01(\x0b\x32\x1c.stately.db.TransactionBeginH\x00R\x05\x62\x65gin\x12\x39\n\tget_items\x18\x03 \x01(\x0b\x32\x1a.stately.db.TransactionGetH\x00R\x08getItems\x12\x41\n\nbegin_list\x18\x04 \x01(\x0b\x32 .stately.db.TransactionBeginListH\x00R\tbeginList\x12J\n\rcontinue_list\x18\x05 \x01(\x0b\x32#.stately.db.TransactionContinueListH\x00R\x0c\x63ontinueList\x12\x39\n\tput_items\x18\x06 \x01(\x0b\x32\x1a.stately.db.TransactionPutH\x00R\x08putItems\x12\x42\n\x0c\x64\x65lete_items\x18\x07 \x01(\x0b\x32\x1d.stately.db.TransactionDeleteH\x00R\x0b\x64\x65leteItems\x12\x30\n\x06\x63ommit\x18\x08 \x01(\x0b\x32\x16.google.protobuf.EmptyH\x00R\x06\x63ommit\x12.\n\x05\x61\x62ort\x18\t \x01(\x0b\x32\x16.google.protobuf.EmptyH\x00R\x05\x61\x62ortB\t\n\x07\x63ommand\"\xc8\x02\n\x13TransactionResponse\x12\x1d\n\nmessage_id\x18\x01 \x01(\rR\tmessageId\x12\x45\n\x0bget_results\x18\x02 \x01(\x0b\x32\".stately.db.TransactionGetResponseH\x00R\ngetResults\x12\x38\n\x07put_ack\x18\x03 \x01(\x0b\x32\x1d.stately.db.TransactionPutAckH\x00R\x06putAck\x12H\n\x0clist_results\x18\x04 \x01(\x0b\x32#.stately.db.TransactionListResponseH\x00R\x0blistResults\x12=\n\x08\x66inished\x18\x05 \x01(\x0b\x32\x1f.stately.db.TransactionFinishedH\x00R\x08\x66inishedB\x08\n\x06result\"-\n\x10TransactionBegin\x12\x19\n\x08store_id\x18\x01 \x01(\x04R\x07storeId\"9\n\x0eTransactionGet\x12\'\n\x04gets\x18\x01 \x03(\x0b\x32\x13.stately.db.GetItemR\x04gets\"\xd9\x01\n\x14TransactionBeginList\x12&\n\x0fkey_path_prefix\x18\x01 \x01(\tR\rkeyPathPrefix\x12\x14\n\x05limit\x18\x02 \x01(\rR\x05limit\x12\x41\n\rsort_property\x18\x03 \x01(\x0e\x32\x1c.stately.db.SortablePropertyR\x0csortProperty\x12@\n\x0esort_direction\x18\x04 \x01(\x0e\x32\x19.stately.db.SortDirectionR\rsortDirection\"y\n\x17TransactionContinueList\x12\x1d\n\ntoken_data\x18\x01 \x01(\x0cR\ttokenData\x12?\n\tdirection\x18\x04 \x01(\x0e\x32!.stately.db.ContinueListDirectionR\tdirection\"9\n\x0eTransactionPut\x12\'\n\x04puts\x18\x01 \x03(\x0b\x32\x13.stately.db.PutItemR\x04puts\"E\n\x11TransactionDelete\x12\x30\n\x07\x64\x65letes\x18\x01 \x03(\x0b\x32\x16.stately.db.DeleteItemR\x07\x64\x65letes\"@\n\x16TransactionGetResponse\x12&\n\x05items\x18\x01 \x03(\x0b\x32\x10.stately.db.ItemR\x05items\"D\n\x0bGeneratedID\x12\x14\n\x04uint\x18\x01 \x01(\x04H\x00R\x04uint\x12\x16\n\x05\x62ytes\x18\x02 \x01(\x0cH\x00R\x05\x62ytesB\x07\n\x05value\"Q\n\x11TransactionPutAck\x12<\n\rgenerated_ids\x18\x01 \x03(\x0b\x32\x17.stately.db.GeneratedIDR\x0cgeneratedIds\"\x96\x01\n\x17TransactionListResponse\x12\x37\n\x06result\x18\x01 \x01(\x0b\x32\x1d.stately.db.ListPartialResultH\x00R\x06result\x12\x36\n\x08\x66inished\x18\x02 \x01(\x0b\x32\x18.stately.db.ListFinishedH\x00R\x08\x66inishedB\n\n\x08response\"\xa7\x01\n\x13TransactionFinished\x12\x1c\n\tcommitted\x18\x01 \x01(\x08R\tcommitted\x12\x31\n\x0bput_results\x18\x02 \x03(\x0b\x32\x10.stately.db.ItemR\nputResults\x12?\n\x0e\x64\x65lete_results\x18\x03 \x03(\x0b\x32\x18.stately.db.DeleteResultR\rdeleteResultsBk\n\x0e\x63om.stately.dbB\x10TransactionProtoP\x01\xa2\x02\x03SDX\xaa\x02\nStately.Db\xca\x02\nStately\\Db\xe2\x02\x16Stately\\Db\\GPBMetadata\xea\x02\x0bStately::Dbb\x06proto3"
18
+
19
+ pool = Google::Protobuf::DescriptorPool.generated_pool
20
+ pool.add_serialized_file(descriptor_data)
21
+
22
+ module Stately
23
+ module Db
24
+ TransactionRequest = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("stately.db.TransactionRequest").msgclass
25
+ TransactionResponse = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("stately.db.TransactionResponse").msgclass
26
+ TransactionBegin = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("stately.db.TransactionBegin").msgclass
27
+ TransactionGet = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("stately.db.TransactionGet").msgclass
28
+ TransactionBeginList = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("stately.db.TransactionBeginList").msgclass
29
+ TransactionContinueList = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("stately.db.TransactionContinueList").msgclass
30
+ TransactionPut = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("stately.db.TransactionPut").msgclass
31
+ TransactionDelete = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("stately.db.TransactionDelete").msgclass
32
+ TransactionGetResponse = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("stately.db.TransactionGetResponse").msgclass
33
+ GeneratedID = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("stately.db.GeneratedID").msgclass
34
+ TransactionPutAck = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("stately.db.TransactionPutAck").msgclass
35
+ TransactionListResponse = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("stately.db.TransactionListResponse").msgclass
36
+ TransactionFinished = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("stately.db.TransactionFinished").msgclass
37
+ end
38
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+ # Generated by the protocol buffer compiler. DO NOT EDIT!
3
+ # source: errors/error_details.proto
4
+
5
+ require 'google/protobuf'
6
+
7
+
8
+ descriptor_data = "\n\x1a\x65rrors/error_details.proto\x12\x0estately.errors\"y\n\x13StatelyErrorDetails\x12!\n\x0cstately_code\x18\x01 \x01(\tR\x0bstatelyCode\x12\x18\n\x07message\x18\x02 \x01(\tR\x07message\x12%\n\x0eupstream_cause\x18\x03 \x01(\tR\rupstreamCauseB\x80\x01\n\x12\x63om.stately.errorsB\x11\x45rrorDetailsProtoP\x01\xa2\x02\x03SEX\xaa\x02\x0eStately.Errors\xca\x02\x0eStately\\Errors\xe2\x02\x1aStately\\Errors\\GPBMetadata\xea\x02\x0fStately::Errorsb\x06proto3"
9
+
10
+ pool = Google::Protobuf::DescriptorPool.generated_pool
11
+ pool.add_serialized_file(descriptor_data)
12
+
13
+ module Stately
14
+ module Errors
15
+ StatelyErrorDetails = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("stately.errors.StatelyErrorDetails").msgclass
16
+ end
17
+ end
@@ -0,0 +1,124 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "async"
4
+ require "async/http/internet"
5
+ require "async/semaphore"
6
+ require "json"
7
+ require "logger"
8
+ require "weakref"
9
+ require_relative "token_provider"
10
+
11
+ LOGGER = Logger.new($stdout)
12
+ LOGGER.level = Logger::WARN
13
+ DEFAULT_GRANT_TYPE = "client_credentials"
14
+
15
+ module StatelyDB
16
+ module Common
17
+ # A module for Stately Cloud auth code
18
+ module Auth
19
+ # Auth0TokenProvider is an implementation of the TokenProvider abstract base class
20
+ # which vends tokens from auth0 with the given client_id and client_secret.
21
+ # It will default to using the values of `STATELY_CLIENT_ID` and `STATELY_CLIENT_SECRET` if
22
+ # no credentials are explicitly passed and will throw an error if none are found.
23
+ class Auth0TokenProvider < TokenProvider
24
+ # @param [String] auth_url The URL of the OAuth server
25
+ # @param [String] audience The OAuth Audience for the token
26
+ # @param [String] client_secret The StatelyDB client secret credential
27
+ # @param [String] client_id The StatelyDB client ID credential
28
+ def initialize(
29
+ auth_url: "https://oauth.stately.cloud",
30
+ audience: "api.stately.cloud",
31
+ client_secret: ENV.fetch("STATELY_CLIENT_SECRET"),
32
+ client_id: ENV.fetch("STATELY_CLIENT_ID")
33
+ )
34
+ super()
35
+ @client_id = client_id
36
+ @client_secret = client_secret
37
+ @audience = audience
38
+ @auth_url = "#{auth_url}/oauth/token"
39
+ @access_token = nil
40
+ @pending_refresh = nil
41
+ @timer = nil
42
+
43
+ Async do |_task|
44
+ refresh_token
45
+ end
46
+
47
+ # need a weak ref to ourself or the GC will never run the finalizer
48
+ ObjectSpace.define_finalizer(WeakRef.new(self), finalize)
49
+ end
50
+
51
+ # finalizer kills the thread running the timer if one exists
52
+ # @return [Proc] The finalizer proc
53
+ def finalize
54
+ proc {
55
+ Thread.kill(@timer) unless @timer.nil?
56
+ }
57
+ end
58
+
59
+ # Get the current access token
60
+ # @return [String] The current access token
61
+ def access_token
62
+ # TODO: - check whether or not the GIL is enough to make this threadsafe
63
+ @access_token || refresh_token
64
+ end
65
+
66
+ private
67
+
68
+ # Refresh the access token
69
+ # @return [void]
70
+ def refresh_token
71
+ # never run more than one at a time.
72
+ @pending_refresh ||= refresh_token_impl
73
+ # many threads all wait on the same task here.
74
+ # I wrote a test to check this is possible
75
+ @pending_refresh.wait
76
+ # multiple people will all set this to nil after
77
+ # they are done waiting but I don't think i can put this inside
78
+ # refresh_token_impl. It seems harmless because of the GIL?
79
+ @pending_refresh = nil
80
+ end
81
+
82
+ # Refresh the access token implementation
83
+ # @return [String] The new access token
84
+ def refresh_token_impl
85
+ Async do
86
+ client = Async::HTTP::Internet.new
87
+ headers = [["content-type", "application/json"]]
88
+ data = { "client_id" => @client_id, client_secret: @client_secret, audience: @audience,
89
+ grant_type: DEFAULT_GRANT_TYPE }
90
+ body = [JSON.dump(data)]
91
+
92
+ resp = client.post(@auth_url, headers, body)
93
+ resp_data = JSON.parse(resp.read)
94
+ raise "Auth request failed: #{resp_data}" if resp.status != 200
95
+
96
+ @access_token = resp_data["access_token"]
97
+
98
+ # do this on a thread or else the sleep
99
+ # will block the event loop.
100
+ # there is no non-blocking sleep in ruby.
101
+ # skip this if we have a pending timer thread already
102
+ @timer = Thread.new do
103
+ # TODO: - add some random jitter to stop clients getting a cycle after
104
+ # some event like an outage
105
+ # Also, don't let this be less than 1sec
106
+ delay = [resp_data["expires_in"] - 10, 1].max
107
+ sleep(delay)
108
+ refresh_token
109
+ end
110
+ @pending_refresh = nil
111
+ resp_data["access_token"]
112
+ rescue StandardError => e
113
+ # set the token to nil so that it will
114
+ # be refreshed on the next get
115
+ @access_token = nil
116
+ LOGGER.warn(e)
117
+ ensure
118
+ client.close
119
+ end
120
+ end
121
+ end
122
+ end
123
+ end
124
+ end
@@ -0,0 +1,82 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "grpc"
4
+ require "common/auth/token_provider"
5
+
6
+ module StatelyDB
7
+ module Common
8
+ # A module for Stately Cloud auth code
9
+ module Auth
10
+ # GRPC interceptor to authenticate against Stately and append bearer tokens to outgoing requests
11
+ class Interceptor < GRPC::ClientInterceptor
12
+ # @param [TokenProvider] token_provider The token provider to use for authentication
13
+ def initialize(
14
+ token_provider: Auth0TokenProvider.new
15
+ )
16
+ super()
17
+ @token_provider = token_provider
18
+ end
19
+
20
+ # gRPC client unary interceptor
21
+ #
22
+ # @param [Object] request The request object
23
+ # @param [GRPC::ActiveCall] call The active call object
24
+ # @param [Symbol] method The method being called
25
+ # @param [Hash] metadata The metadata hash
26
+ # @return [Object] The response object
27
+ # @api private
28
+ def request_response(request:, call:, method:, metadata:) # rubocop:disable Lint/UnusedMethodArgument
29
+ add_jwt_to_grpc_request(metadata:)
30
+ yield
31
+ end
32
+
33
+ # gRPC client streaming interceptor
34
+ #
35
+ # @param [Enumerable] requests The list of requests
36
+ # @param [GRPC::ActiveCall] call The active call object
37
+ # @param [Symbol] method The method being called
38
+ # @param [Hash] metadata The metadata hash
39
+ # @return [Enumerator] The response enumerator
40
+ # @api private
41
+ def client_streamer(requests:, call:, method:, metadata:) # rubocop:disable Lint/UnusedMethodArgument
42
+ add_jwt_to_grpc_request(metadata:)
43
+ yield
44
+ end
45
+
46
+ # gRPC server streaming interceptor
47
+ #
48
+ # @param [Object] request The request object
49
+ # @param [GRPC::ActiveCall] call The active call object
50
+ # @param [Symbol] method The method being called
51
+ # @param [Hash] metadata The metadata hash
52
+ # @return [Enumerator] The response enumerator
53
+ # @api private
54
+ def server_streamer(request:, call:, method:, metadata:) # rubocop:disable Lint/UnusedMethodArgument
55
+ add_jwt_to_grpc_request(metadata:)
56
+ yield
57
+ end
58
+
59
+ # gRPC bidirectional streaming interceptor
60
+ #
61
+ # @param [Enumerable] requests The list of requests
62
+ # @param [GRPC::ActiveCall] call The active call object
63
+ # @param [Symbol] method The method being called
64
+ # @param [Hash] metadata The metadata hash
65
+ # @return [Enumerator] The response enumerator
66
+ # @api private
67
+ def bidi_streamer(requests:, call:, method:, metadata:) # rubocop:disable Lint/UnusedMethodArgument
68
+ add_jwt_to_grpc_request(metadata:)
69
+ yield
70
+ end
71
+
72
+ # Adds a JWT to the metadata hash
73
+ # @param [Hash] metadata The metadata hash
74
+ # @return [void]
75
+ # @api private
76
+ def add_jwt_to_grpc_request(metadata:)
77
+ metadata["authorization"] = "Bearer #{@token_provider.access_token}"
78
+ end
79
+ end
80
+ end
81
+ end
82
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ module StatelyDB
4
+ module Common
5
+ # A module for Stately Cloud auth code
6
+ module Auth
7
+ # TokenProvider is an abstract base class that should be extended
8
+ # for individual token provider implementations
9
+ class TokenProvider
10
+ # Get the current access token
11
+ # @return [String] The current access token
12
+ def access_token
13
+ raise "Not Implemented"
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end