diff --git a/.github/workflows/main.yaml b/.github/workflows/main.yaml index ef43b0b..d4bf6a6 100644 --- a/.github/workflows/main.yaml +++ b/.github/workflows/main.yaml @@ -16,5 +16,5 @@ jobs: build: uses: VeryGoodOpenSource/very_good_workflows/.github/workflows/dart_package.yml@v1 with: - coverage_excludes: "*.pb*.dart" + coverage_excludes: "**/*.pb*.dart" min_coverage: 0 diff --git a/README.md b/README.md index 4cb1161..39be3e5 100644 --- a/README.md +++ b/README.md @@ -107,7 +107,7 @@ To create our Nitric project, we have to create a `nitric.yaml` file. The handle name: my_profile_api services: - match: bin/my_profile_api.dart - start: dart run bin/my_profile_api.dart + start: dart run $SERVICE_PATH ``` ## Create a Profile class @@ -141,34 +141,34 @@ class Profile { Applications built with Nitric can contain many APIs, let's start by adding one to this project to serve as the public endpoint. Rename `bin/my_profile_api.dart` to `bin/profiles.dart` ```dart -import 'package:uuid/uuid.dart'; +import 'package:nitric_sdk/nitric.dart'; +import 'package:nitric_sdk/resources.dart'; +import 'package:nitric_sdk/src/context/common.dart'; -import 'package:nitric_sdk/src/api/collection.dart'; -import 'package:nitric_sdk/src/nitric.dart'; -import 'package:nitric_sdk/src/resources/common.dart'; +import 'package:uuid/uuid.dart'; void main() { // Create an API named 'public' final profileApi = api("public"); - // Define a collection named 'profiles', then request reading and writing permissions. - final profiles = collection("profiles").requires([ - CollectionPermission.writing, - CollectionPermission.deleting, - CollectionPermission.reading + // Define a key value store named 'profiles', then request getting, setting and deleting permissions. + final profiles = store("profiles").requires([ + KeyValuePermission.getting, + KeyValuePermission.setting, + KeyValuePermission.deleting ]); } ``` -Here we're creating an API named `public` and a collection named `profiles`, then requesting read, write, and delete permissions which allows our function to access the collection. +Here we're creating an API named `public` and a key value store named `profiles`, then requesting get, set, and delete permissions which allows our function to access the key value store. - Resources in Nitric like `api` and `collection` represent high-level cloud + Resources in Nitric like `api` and `key value store` represent high-level cloud resources. When your app is deployed Nitric automatically converts these requests into appropriate resources for the specific [provider](https://nitric.io/docs/reference/providers). Nitric also takes care of adding the IAM roles, policies, etc. that grant the requested access. For example the - `collection` resource uses DynamoDB in AWS or FireStore on Google Cloud. + `key value stores` resource uses DynamoDB in AWS or FireStore on Google Cloud. ### Create profiles with POST @@ -189,7 +189,7 @@ profileApi.post("/profiles", (ctx) async { final profile = Profile.fromJson(ctx.req.json()); // Store the new profile in the profiles collection - await profiles.key(id).put(profile); + await profiles.set(id, profile); // Send a success response. ctx.resp.body = "Profile $id created."; @@ -206,9 +206,9 @@ profileApi.get("/profiles/:id", (ctx) async { try { // Retrieve and return the profile data - final profile = await profiles.key(id).access(); + final profile = await profiles.get(id); ctx.resp.json(profile.toJson()); - } on KeyNotFoundException catch (e) { + } on Exception catch (e) { print(e); ctx.resp.status = 404; ctx.resp.body = "Profile $id not found."; @@ -218,19 +218,6 @@ profileApi.get("/profiles/:id", (ctx) async { }); ``` -### List all profiles with GET - -```dart -profileApi.get("/profiles", (ctx) async { - // Return all profiles - final allProfiles = await profiles.list(); - - ctx.resp.json({'profiles': allProfiles}); - - return ctx; -}); -``` - ### Remove a profile with DELETE ```dart @@ -239,11 +226,11 @@ profileApi.delete("/profiles/:id", (ctx) async { // Delete the profile try { - await profiles.key(id).unset(); + await profiles.delete(id); ctx.resp.body = "Profile $id removed."; - } on KeyNotFoundException catch (e) { + } on Exception catch (e) { ctx.resp.status = 404; - ctx.resp.body = "Profile $id not found."; + ctx.resp.body = "Profile $id not found. $e"; } return ctx; @@ -255,15 +242,9 @@ profileApi.delete("/profiles/:id", (ctx) async { Now that you have an API defined with handlers for each of its methods, it's time to test it locally. ```bash -npm run dev +nitric start ``` - - the `dev` script starts the Nitric Server using `nitric start`, which provides - local interfaces to emulate cloud resources, then runs your functions and - allows them to connect. - - Once it starts, the application will receive requests via the API port. You can use the Local Dashboard or any HTTP client to test the API. We'll keep it running for our tests. If you want to update your functions, just save them, they'll be reloaded automatically. ## Test the API @@ -354,7 +335,7 @@ If you want to go a bit deeper and create some other resources with Nitric, why Define a bucket named `profilesImg` with reading/writing permissions. ```dart -final profilesImg = bucket("profilesImg").requires([BucketPermission.reading, BucketPermission.writing]); +final profilesImg = Nitric.bucket("profilesImg").requires([BucketPermission.reading, BucketPermission.writing]); ``` ### Get a URL to upload a profile image diff --git a/example/services/nitric_example.dart b/example/services/nitric_example.dart index 7a657a4..f4c442c 100644 --- a/example/services/nitric_example.dart +++ b/example/services/nitric_example.dart @@ -1,33 +1,39 @@ import 'package:nitric_sdk/nitric.dart'; import 'package:nitric_sdk/resources.dart'; -import 'package:nitric_sdk/src/context/common.dart'; import 'package:uuid/uuid.dart'; class Profile { - String name; - int age; - String homeTown; + late String name; + late int age; + late String homeTown; + late List contacts; - Profile(this.name, this.age, this.homeTown); + Profile({required this.name, required this.age, required this.homeTown}); Profile.fromJson(Map contents) : name = contents["name"] as String, age = contents["age"] as int, - homeTown = contents["homeTown"] as String; + homeTown = contents["homeTown"] as String, + contacts = List.from(contents["contacts"]); - Map toJson() => { - 'name': name, - 'age': age, - 'homeTown': homeTown, - }; + Map toJson() => + {'name': name, 'age': age, 'homeTown': homeTown, 'contacts': contacts}; } void main() { + var oidc = Nitric.oidcRule( + "profile security", + "https://dev-w7gm5ldb.us.auth0.com", + ["https://test-security-definition/"]); + // Create an API named 'public' - final profileApi = Nitric.api("public"); + final profileApi = Nitric.api("public", + opts: ApiOptions(security: [ + oidc(["user:read"]) + ])); // Define a collection named 'profiles', then request reading and writing permissions. - final profiles = Nitric.store("profiles").requires([ + final profiles = Nitric.store("profiles").requires([ KeyValueStorePermission.getting, KeyValueStorePermission.deleting, KeyValueStorePermission.setting @@ -36,22 +42,22 @@ void main() { final profilesImg = Nitric.bucket("profilesImg") .requires([BucketPermission.reading, BucketPermission.writing]); - profilesImg.on(BlobEventType.write, "*", (ctx) async { - return ctx; - }); - profileApi.post("/profiles", (ctx) async { final uuid = Uuid(); final id = uuid.v4(); - final profile = Profile.fromJson(ctx.req.json()); - - // Store the new profile in the profiles collection - await profiles.set(id, profile); + try { + var profile = Profile.fromJson(ctx.req.json()); + // Store the new profile in the profiles collection + await profiles.set(id, profile.toJson()); - // Send a success response. - ctx.resp.body = "Profile $id created."; + // Send a success response. + ctx.resp.body = "Profile $id created."; + } on Exception catch (e) { + ctx.resp.status = 400; + ctx.resp.body = "An error occurred: $e"; + } return ctx; }); @@ -62,7 +68,7 @@ void main() { try { // Retrieve and return the profile data final profile = await profiles.get(id); - ctx.resp.json(profile.toJson()); + ctx.resp.json(profile); } on Exception catch (e) { print(e); ctx.resp.status = 404; @@ -123,6 +129,4 @@ void main() { return ctx; }); - - Nitric.run(); } diff --git a/lib/resource.dart b/lib/resource.dart deleted file mode 100644 index 54954d1..0000000 --- a/lib/resource.dart +++ /dev/null @@ -1 +0,0 @@ -export 'src/resources/resources.dart'; diff --git a/lib/resources.dart b/lib/resources.dart index 54954d1..2bc4048 100644 --- a/lib/resources.dart +++ b/lib/resources.dart @@ -1 +1,2 @@ export 'src/resources/resources.dart'; +export 'src/context/common.dart'; diff --git a/lib/src/api/api.dart b/lib/src/api/api.dart index 8eb46c3..5afefcf 100644 --- a/lib/src/api/api.dart +++ b/lib/src/api/api.dart @@ -2,3 +2,5 @@ export 'bucket.dart'; export 'keyvalue.dart'; export 'secret.dart'; export 'topic.dart'; +export 'proto.dart'; +export 'queue.dart'; diff --git a/lib/src/api/bucket.dart b/lib/src/api/bucket.dart index 157b8aa..3d785c2 100644 --- a/lib/src/api/bucket.dart +++ b/lib/src/api/bucket.dart @@ -1,11 +1,12 @@ import 'dart:async'; import 'dart:convert'; +import 'package:nitric_sdk/nitric.dart'; import 'package:nitric_sdk/src/context/common.dart'; import 'package:nitric_sdk/src/grpc_helper.dart'; import 'package:nitric_sdk/src/nitric/proto/storage/v1/storage.pbgrpc.dart' as $p; -import '../google/protobuf/duration.pb.dart' as $d; +import 'package:nitric_sdk/src/google/protobuf/duration.pb.dart' as $d; import 'package:fixnum/fixnum.dart'; import 'package:grpc/grpc.dart'; @@ -14,63 +15,43 @@ class Bucket { String name; - Bucket(this.name) { - final channel = createClientChannelFromEnvVar(); + Bucket(this.name, {$p.StorageClient? client}) { + if (client == null) { + final channel = createClientChannelFromEnvVar(); - _storageClient = $p.StorageClient(channel); + _storageClient = $p.StorageClient(channel); + } else { + _storageClient = client; + } } - /// Get a reference to + /// Get a reference to a file by it's [key]. File file(String key) { return File(this, key); } - /// Create a blob event subscription when + /// Create a blob event subscription triggered on the [blobEventType] filtered by files that match the [keyPrefixFilter]. Future on(BlobEventType blobEventType, String keyPrefixFilter, - BlobEventMiddleware handler) async { - // Create Storage listener client - final channel = createClientChannelFromEnvVar(); - final client = $p.StorageListenerClient(channel); - + BlobEventHandler handler) async { // Create the request to register the Storage listener with the membrane + final eventType = switch (blobEventType) { + BlobEventType.write => $p.BlobEventType.Created, + BlobEventType.delete => $p.BlobEventType.Deleted, + }; + final registrationRequest = $p.RegistrationRequest( bucketName: name, + keyPrefixFilter: keyPrefixFilter, + blobEventType: eventType, ); - final initMsg = $p.ClientMessage(registrationRequest: registrationRequest); - // Create the request stream and send the initial message - final requestStream = StreamController<$p.ClientMessage>(); - requestStream.add(initMsg); + var worker = BlobEventWorker(registrationRequest, handler, this); - final response = client.listen( - requestStream.stream, - ); - - try { - await for (final msg in response) { - if (msg.hasRegistrationResponse()) { - print("Function connected with membrane"); - } else if (msg.hasBlobEventRequest()) { - var ctx = BlobEventContext.fromRequest(msg, this); - - ctx = await handler(ctx); - - var resp = ctx.toResponse(); - - requestStream.add(resp); - } - } - } on GrpcError catch (e) { - print("caught a GrpcError: $e"); - } on Error { - var resp = BlobEventResponse(false); - - requestStream.add($p.ClientMessage(blobEventResponse: resp.toWire())); - } + worker.start(); } } -/// A reference to a file in the bucket. +/// A reference to a [File] in the bucket. class File { final Bucket _bucket; @@ -126,12 +107,12 @@ class File { return resp.exists; } - /// Get a presigned download URL with an [expiry] time (in seconds). Defaults to 600. + /// Get a presigned download URL with an [expiry] time (in seconds). Defaults to 600 (10 minutes), max of 604800 (7 days). Future getDownloadUrl([int expiry = 600]) async { return _getSignedUrl($p.StoragePreSignUrlRequest_Operation.READ, expiry); } - /// Get a presigned upload URL with an [expiry] time (in seconds). Defaults to 600. + /// Get a presigned upload URL with an [expiry] time (in seconds). Defaults to 600 (10 minutes), max of 604800 (7 days). Future getUploadUrl([int expiry = 600]) async { return _getSignedUrl($p.StoragePreSignUrlRequest_Operation.WRITE, expiry); } @@ -139,6 +120,11 @@ class File { /// Create a presigned URL with a determined [op] type and [expiry] time (in seconds). Future _getSignedUrl( $p.StoragePreSignUrlRequest_Operation op, int expiry) async { + if (expiry < 0 || expiry > 604800) { + throw ArgumentError.value(expiry, "expiry", + "presigned url expiry must be between 0 and 604800"); + } + var exp = $d.Duration(seconds: Int64(expiry)); var req = $p.StoragePreSignUrlRequest( @@ -153,3 +139,50 @@ class File { return resp.url; } } + +class BlobEventWorker implements Worker { + $p.RegistrationRequest registrationRequest; + BlobEventHandler middleware; + Bucket bucket; + + BlobEventWorker(this.registrationRequest, this.middleware, this.bucket); + + @override + Future start() async { + // Create Storage listener client + final channel = createClientChannelFromEnvVar(); + final client = $p.StorageListenerClient(channel); + + final initMsg = $p.ClientMessage(registrationRequest: registrationRequest); + + // Create the request stream and send the initial message + final requestStream = StreamController<$p.ClientMessage>(); + requestStream.add(initMsg); + + final response = client.listen( + requestStream.stream, + ); + + await for (final msg in response) { + if (msg.hasRegistrationResponse()) { + // Blob Notification has connected with Nitric server + } else if (msg.hasBlobEventRequest()) { + var ctx = BlobEventContext.fromRequest(msg, bucket); + + try { + ctx = await middleware(ctx); + } on GrpcError catch (e) { + print("caught a GrpcError: $e"); + } catch (e) { + print("unhandled application error: $e"); + + ctx.resp.success = false; + } + + requestStream.add(ctx.toResponse()); + } + } + + await channel.shutdown(); + } +} diff --git a/lib/src/api/keyvalue.dart b/lib/src/api/keyvalue.dart index 73b64d2..19060e9 100644 --- a/lib/src/api/keyvalue.dart +++ b/lib/src/api/keyvalue.dart @@ -1,44 +1,59 @@ -import 'dart:convert'; - +import 'package:nitric_sdk/src/api/api.dart'; import 'package:nitric_sdk/src/grpc_helper.dart'; -import 'package:nitric_sdk/src/nitric/proto/keyvalue/v1/keyvalue.pbgrpc.dart'; - -import '../google/protobuf/struct.pb.dart'; +import 'package:nitric_sdk/src/nitric/proto/kvstore/v1/kvstore.pbgrpc.dart' + as $p; /// A Key Value Store. -class KeyValueStore { - late KeyValueClient _keyValueClient; +class KeyValueStore { + late $p.KvStoreClient _keyValueClient; final String name; - KeyValueStore(this.name) { - var channel = createClientChannelFromEnvVar(); + KeyValueStore(this.name, {$p.KvStoreClient? client}) { + if (client == null) { + var channel = createClientChannelFromEnvVar(); - _keyValueClient = KeyValueClient(channel); + _keyValueClient = $p.KvStoreClient(channel); + } else { + _keyValueClient = client; + } } - /// Get a reference to a key in the store. - Future get(String key) async { - var req = KeyValueGetRequest(ref: ValueRef(key: key, store: name)); + /// Get a reference to a [key] in the store. + Future> get(String key) async { + var req = + $p.KvStoreGetValueRequest(ref: $p.ValueRef(key: key, store: name)); - var resp = await _keyValueClient.get(req); + var resp = await _keyValueClient.getValue(req); - return json.decode(resp.writeToJson()); + return Proto.mapFromStruct(resp.value.content); } - Future set(String key, T value) async { - var content = Struct(); - content.mergeFromJson(json.encode(value)); + /// Set a new [value] to a [key] in the store. + Future set(String key, Map value) async { + var content = Proto.structFromMap(value); - var req = KeyValueSetRequest( - ref: ValueRef(key: key, store: name), content: content); + var req = $p.KvStoreSetValueRequest( + ref: $p.ValueRef(key: key, store: name), content: content); - await _keyValueClient.set(req); + await _keyValueClient.setValue(req); } + /// Delete a [key] from the store. Future delete(String key) async { - var req = KeyValueDeleteRequest(ref: ValueRef(key: key, store: name)); + var req = + $p.KvStoreDeleteKeyRequest(ref: $p.ValueRef(key: key, store: name)); + + await _keyValueClient.deleteKey(req); + } + + /// Get a stream of key values that match the [prefix]. + Stream keys({String prefix = ""}) { + var req = + $p.KvStoreScanKeysRequest(store: $p.Store(name: name), prefix: prefix); + + var resp = _keyValueClient.scanKeys(req); - await _keyValueClient.delete(req); + return resp.map((event) => event.key); } } diff --git a/lib/src/api/proto.dart b/lib/src/api/proto.dart new file mode 100644 index 0000000..74f4515 --- /dev/null +++ b/lib/src/api/proto.dart @@ -0,0 +1,55 @@ +import 'package:nitric_sdk/src/google/protobuf/struct.pb.dart'; + +class Proto { + static Struct structFromMap(Map protoMap) { + final struct = Struct(); + protoMap.forEach( + (key, value) => struct.fields[key] = Proto.valueFromDynamic(value)); + + return struct; + } + + static Value valueFromDynamic(dynamic value) { + if (value is String) { + return Value(stringValue: value); + } else if (value is int) { + return Value(numberValue: value.toDouble()); + } else if (value is double) { + return Value(numberValue: value); + } else if (value is bool) { + return Value(boolValue: value); + } else if (value is List) { + return Value( + listValue: + ListValue(values: value.map((e) => Proto.valueFromDynamic(e)))); + } else if (value is Map) { + var content = Struct(); + value.forEach( + (key, value) => content.fields[key] = Proto.valueFromDynamic(value)); + return Value(structValue: content); + } else if (value == null) { + return Value(nullValue: null); + } + + throw FormatException( + "The type of dynamic value is incompatible with the Value types."); + } + + static Map mapFromStruct(Struct struct) { + return struct.fields + .map((key, value) => MapEntry(key, Proto.dynamicFromValue(value))); + } + + static dynamic dynamicFromValue(Value protoValue) { + return switch (protoValue.whichKind()) { + Value_Kind.boolValue => protoValue.boolValue, + Value_Kind.listValue => protoValue.listValue.values + .map((v) => Proto.dynamicFromValue(v)) + .toList(), + Value_Kind.numberValue => protoValue.numberValue, + Value_Kind.stringValue => protoValue.stringValue, + Value_Kind.structValue => Proto.mapFromStruct(protoValue.structValue), + _ => null + }; + } +} diff --git a/lib/src/api/queue.dart b/lib/src/api/queue.dart new file mode 100644 index 0000000..6f86401 --- /dev/null +++ b/lib/src/api/queue.dart @@ -0,0 +1,83 @@ +import 'dart:async'; + +import 'package:nitric_sdk/api.dart'; +import 'package:nitric_sdk/src/grpc_helper.dart'; +import 'package:nitric_sdk/src/nitric/proto/queues/v1/queues.pbgrpc.dart' as $p; + +class Queue { + late $p.QueuesClient _queuesClient; + + /// The name of the queue. + String name; + + /// Construct a new queue. + Queue(this.name, {$p.QueuesClient? client}) { + if (client == null) { + final channel = createClientChannelFromEnvVar(); + + _queuesClient = $p.QueuesClient(channel); + } else { + _queuesClient = client; + } + } + + /// Enqueue a list of [messages] to the queue. + Future> enqueue( + List> messages) async { + var messageStructs = messages.map((message) => + $p.QueueMessage(structPayload: Proto.structFromMap(message))); + + var req = $p.QueueEnqueueRequest( + messages: messageStructs, + queueName: name, + ); + + var resp = await _queuesClient.enqueue(req); + + return resp.failedMessages.map((fm) => FailedMessage(fm)).toList(); + } + + /// Dequeue a list of messages from the queue. The number of messages dequeued can be between 0 and [depth] messages. + Future> dequeue({int depth = 1}) async { + var req = $p.QueueDequeueRequest(queueName: name, depth: depth); + + var resp = await _queuesClient.dequeue(req); + + return resp.messages.map((m) => DequeuedMessage(this, m)).toList(); + } +} + +class DequeuedMessage { + late Queue _queue; + late String _leaseId; + + /// The message contents. + late Map message; + + DequeuedMessage(Queue queue, $p.DequeuedMessage message) { + _leaseId = message.leaseId; + _queue = queue; + this.message = Proto.mapFromStruct(message.message.structPayload); + } + + /// Inform the queue that the message was handled successfully. + void complete() async { + var req = + $p.QueueCompleteRequest(leaseId: _leaseId, queueName: _queue.name); + + await _queue._queuesClient.complete(req); + } +} + +class FailedMessage { + /// The [details] of the failure. + late String details; + + /// The [message] that failed. + late Map message; + + FailedMessage($p.FailedEnqueueMessage failedMessage) { + details = failedMessage.details; + message = Proto.mapFromStruct(failedMessage.message.structPayload); + } +} diff --git a/lib/src/api/secret.dart b/lib/src/api/secret.dart index 7944255..1dc652f 100644 --- a/lib/src/api/secret.dart +++ b/lib/src/api/secret.dart @@ -10,10 +10,14 @@ class Secret { final String name; late final $p.SecretManagerClient _secretClient; - Secret(this.name) { - final channel = createClientChannelFromEnvVar(); - - _secretClient = $p.SecretManagerClient(channel); + Secret(this.name, {$p.SecretManagerClient? client}) { + if (client == null) { + final channel = createClientChannelFromEnvVar(); + + _secretClient = $p.SecretManagerClient(channel); + } else { + _secretClient = client; + } } /// Get a reference to a specific [version] of this secret. diff --git a/lib/src/api/topic.dart b/lib/src/api/topic.dart index 4c60faf..28a96aa 100644 --- a/lib/src/api/topic.dart +++ b/lib/src/api/topic.dart @@ -1,7 +1,7 @@ +import 'package:nitric_sdk/src/api/api.dart'; import 'package:nitric_sdk/src/grpc_helper.dart'; -import '../google/protobuf/duration.pb.dart' as $d; -import '../google/protobuf/struct.pb.dart'; +import 'package:nitric_sdk/src/google/protobuf/duration.pb.dart' as $d; import 'package:nitric_sdk/src/nitric/proto/topics/v1/topics.pbgrpc.dart' as $p; import 'package:fixnum/fixnum.dart'; @@ -11,17 +11,20 @@ class Topic { final String name; late final $p.TopicsClient _topicsClient; - Topic(this.name) { - final channel = createClientChannelFromEnvVar(); + Topic(this.name, {$p.TopicsClient? client}) { + if (client == null) { + final channel = createClientChannelFromEnvVar(); - _topicsClient = $p.TopicsClient(channel); + _topicsClient = $p.TopicsClient(channel); + } else { + _topicsClient = client; + } } /// Publish a [message] to the topic. Optional [delay] (in seconds) can be set to delay the message publish time. - Future publish(Map message, [int delay = 0]) async { + Future publish(Map message, {int delay = 0}) async { // Convert the message to a proto struct wrapped in an event message - final messageStruct = Struct.create(); - messageStruct.mergeFromJsonMap(message); + final messageStruct = Proto.structFromMap(message); var req = $p.TopicPublishRequest( topicName: name, diff --git a/lib/src/context/common.dart b/lib/src/context/common.dart index 9f1251b..f31e3dd 100644 --- a/lib/src/context/common.dart +++ b/lib/src/context/common.dart @@ -2,7 +2,7 @@ library context; import 'dart:convert'; -import 'package:nitric_sdk/src/api/bucket.dart'; +import 'package:nitric_sdk/src/api/api.dart'; import 'package:nitric_sdk/src/nitric/proto/apis/v1/apis.pb.dart' as $ap; import 'package:nitric_sdk/src/nitric/proto/schedules/v1/schedules.pb.dart' as $sp; diff --git a/lib/src/context/http.dart b/lib/src/context/http.dart index a297110..d56e790 100644 --- a/lib/src/context/http.dart +++ b/lib/src/context/http.dart @@ -82,7 +82,7 @@ class HttpResponse extends TriggerResponse { } /// Creates a http response with an error for the body and 500 (internal server error) as the status. - HttpResponse.withError(Error e) { + void withError(Object e) { status = 500; body = e.toString(); headers = {}; diff --git a/lib/src/context/message.dart b/lib/src/context/message.dart index 3a478d3..0f76909 100644 --- a/lib/src/context/message.dart +++ b/lib/src/context/message.dart @@ -1,20 +1,22 @@ part of './common.dart'; /// The context for a topic message for a subscription. -class MessageContext - extends TriggerContext, MessageResponse> { - MessageContext(String id, MessageRequest req, MessageResponse resp) +class MessageContext extends TriggerContext { + MessageContext(String id, MessageRequest req, MessageResponse resp) : super(id, req, resp); /// Create an Event context from a server message. - MessageContext.fromRequest($ep.ServerMessage msg) - : this( - msg.id, - MessageRequest( - msg.messageRequest.topicName, - json.decode( - msg.messageRequest.message.structPayload.writeToJson())), - MessageResponse()); + factory MessageContext.fromRequest($ep.ServerMessage msg) { + var payload = Proto.mapFromStruct(msg.messageRequest.message.structPayload); + + return MessageContext( + msg.id, + MessageRequest( + msg.messageRequest.topicName, + payload, + ), + MessageResponse()); + } /// Converts the context to a gRPC client response. $ep.ClientMessage toResponse() { @@ -23,12 +25,12 @@ class MessageContext } /// Represents a request received by a subscription to a topic. -class MessageRequest extends TriggerRequest { +class MessageRequest extends TriggerRequest { /// The name of the topic that triggered this subscription. String topicName; /// The message payload that was sent. - T message; + Map message; MessageRequest(this.topicName, this.message); } diff --git a/lib/src/context/middleware.dart b/lib/src/context/middleware.dart index 3807434..a0c038c 100644 --- a/lib/src/context/middleware.dart +++ b/lib/src/context/middleware.dart @@ -1,13 +1,9 @@ part of './common.dart'; -typedef Middleware = Future Function(T ctx); +typedef Handler = Future Function(T ctx); -typedef HttpMiddleware = Middleware; -typedef IntervalMiddleware = Middleware; -typedef MessageMiddleware = Middleware; -typedef BlobEventMiddleware = Middleware; - -typedef WebsocketMiddleware = Middleware; -typedef WebsocketConnectMiddleware = Middleware; -typedef WebsocketDisconnectMiddleware = Middleware; -typedef WebsocketMessageMiddleware = Middleware; +typedef HttpHandler = Handler; +typedef IntervalHandler = Handler; +typedef MessageHandler = Handler; +typedef BlobEventHandler = Handler; +typedef WebsocketHandler = Handler; diff --git a/lib/src/context/websocket.dart b/lib/src/context/websocket.dart index 88098b3..860b763 100644 --- a/lib/src/context/websocket.dart +++ b/lib/src/context/websocket.dart @@ -3,62 +3,46 @@ part of 'common.dart'; enum WebsocketEvent { connect, disconnect, message } /// Base context for a websocket based request/response. -abstract class WebsocketContext +class WebsocketContext extends TriggerContext { WebsocketContext(String id, WebsocketRequest req, WebsocketResponse resp) : super(id, req, resp); + factory WebsocketContext.fromRequest($wp.ServerMessage msg) { + var eventType = WebsocketEvent.connect; + if (msg.websocketEventRequest.hasDisconnection()) { + eventType = WebsocketEvent.disconnect; + } else if (msg.websocketEventRequest.hasMessage()) { + eventType = WebsocketEvent.message; + } + + var message = ""; + if (msg.websocketEventRequest.hasMessage()) { + message = utf8.decode(msg.websocketEventRequest.message.body); + } + + Map> queryParams = {}; + if (msg.websocketEventRequest.hasConnection()) { + queryParams = msg.websocketEventRequest.connection.queryParams + .map((key, value) => MapEntry(key, value.value)); + } + + return WebsocketContext( + msg.id, + WebsocketRequest( + msg.websocketEventRequest.socketName, + msg.websocketEventRequest.connectionId, + eventType, + queryParams, + message), + WebsocketResponse()); + } + $wp.ClientMessage toResponse() { return $wp.ClientMessage(websocketEventResponse: resp.toWire()); } } -/// Context for a websocket connection request/response. -class WebsocketConnectContext extends WebsocketContext { - WebsocketConnectContext( - String id, WebsocketRequest req, WebsocketConnectResponse resp) - : super(id, req, resp); - - WebsocketConnectContext.fromRequest($wp.ServerMessage msg) - : this( - msg.id, - WebsocketRequest(msg.websocketEventRequest.socketName, - msg.websocketEventRequest.connectionId, WebsocketEvent.connect), - WebsocketConnectResponse()); -} - -/// Context for a websocket disconnection request/response. -class WebsocketDisconnectContext extends WebsocketContext { - WebsocketDisconnectContext( - String id, WebsocketRequest req, WebsocketResponse resp) - : super(id, req, resp); - - WebsocketDisconnectContext.fromRequest($wp.ServerMessage msg) - : this( - msg.id, - WebsocketRequest( - msg.websocketEventRequest.socketName, - msg.websocketEventRequest.connectionId, - WebsocketEvent.disconnect), - WebsocketResponse()); -} - -/// Context for a websocket message request/response. -class WebsocketMessageContext extends WebsocketContext { - WebsocketMessageContext( - String id, WebsocketMessageRequest req, WebsocketResponse resp) - : super(id, req, resp); - - WebsocketMessageContext.fromRequest($wp.ServerMessage msg) - : this( - msg.id, - WebsocketMessageRequest( - msg.websocketEventRequest.socketName, - msg.websocketEventRequest.connectionId, - utf8.decode(msg.websocketEventRequest.message.body)), - WebsocketResponse()); -} - /// Represents a websocket request. class WebsocketRequest extends TriggerRequest { /// The name of the websocket that received teh request. @@ -67,39 +51,27 @@ class WebsocketRequest extends TriggerRequest { /// The unique connection id String connectionId; - /// The event type that triggered this request, either a + /// The event type that triggered this request WebsocketEvent eventType; - WebsocketRequest(this.socketName, this.connectionId, this.eventType); -} + // The query parameters passed during the connection request. + Map> queryParams; -class WebsocketMessageRequest extends WebsocketRequest { /// The message that was sent with the message request. String message; - WebsocketMessageRequest(String socketName, String connectionId, this.message) - : super(socketName, connectionId, WebsocketEvent.message); + WebsocketRequest(this.socketName, this.connectionId, this.eventType, + this.queryParams, this.message); } /// Represents a response from a websocket request. class WebsocketResponse extends TriggerResponse { - WebsocketResponse(); - - $wp.WebsocketEventResponse toWire() { - return $wp.WebsocketEventResponse(); - } -} - -/// Represents a response from a websocket connect request. -class WebsocketConnectResponse extends WebsocketResponse { /// If the connection should be accepted or rejected. Defaults to accepting (false). bool reject; - WebsocketConnectResponse([this.reject = false]); + WebsocketResponse([this.reject = false]); - @override $wp.WebsocketEventResponse toWire() { - return $wp.WebsocketEventResponse( - connectionResponse: $wp.WebsocketConnectionResponse(reject: reject)); + return $wp.WebsocketEventResponse(); } } diff --git a/lib/src/google/protobuf/any.pb.dart b/lib/src/google/protobuf/any.pb.dart new file mode 100644 index 0000000..1eac990 --- /dev/null +++ b/lib/src/google/protobuf/any.pb.dart @@ -0,0 +1,224 @@ +// +// Generated code. Do not modify. +// source: google/protobuf/any.proto +// +// @dart = 2.12 + +// ignore_for_file: annotate_overrides, camel_case_types, comment_references +// ignore_for_file: constant_identifier_names, library_prefixes +// ignore_for_file: non_constant_identifier_names, prefer_final_fields +// ignore_for_file: unnecessary_import, unnecessary_this, unused_import + +import 'dart:core' as $core; + +import 'package:protobuf/protobuf.dart' as $pb; +import 'package:protobuf/src/protobuf/mixins/well_known.dart' as $mixin; + +/// `Any` contains an arbitrary serialized protocol buffer message along with a +/// URL that describes the type of the serialized message. +/// +/// Protobuf library provides support to pack/unpack Any values in the form +/// of utility functions or additional generated methods of the Any type. +/// +/// Example 1: Pack and unpack a message in C++. +/// +/// Foo foo = ...; +/// Any any; +/// any.PackFrom(foo); +/// ... +/// if (any.UnpackTo(&foo)) { +/// ... +/// } +/// +/// Example 2: Pack and unpack a message in Java. +/// +/// Foo foo = ...; +/// Any any = Any.pack(foo); +/// ... +/// if (any.is(Foo.class)) { +/// foo = any.unpack(Foo.class); +/// } +/// // or ... +/// if (any.isSameTypeAs(Foo.getDefaultInstance())) { +/// foo = any.unpack(Foo.getDefaultInstance()); +/// } +/// +/// Example 3: Pack and unpack a message in Python. +/// +/// foo = Foo(...) +/// any = Any() +/// any.Pack(foo) +/// ... +/// if any.Is(Foo.DESCRIPTOR): +/// any.Unpack(foo) +/// ... +/// +/// Example 4: Pack and unpack a message in Go +/// +/// foo := &pb.Foo{...} +/// any, err := anypb.New(foo) +/// if err != nil { +/// ... +/// } +/// ... +/// foo := &pb.Foo{} +/// if err := any.UnmarshalTo(foo); err != nil { +/// ... +/// } +/// +/// The pack methods provided by protobuf library will by default use +/// 'type.googleapis.com/full.type.name' as the type URL and the unpack +/// methods only use the fully qualified type name after the last '/' +/// in the type URL, for example "foo.bar.com/x/y.z" will yield type +/// name "y.z". +/// +/// JSON +/// ==== +/// The JSON representation of an `Any` value uses the regular +/// representation of the deserialized, embedded message, with an +/// additional field `@type` which contains the type URL. Example: +/// +/// package google.profile; +/// message Person { +/// string first_name = 1; +/// string last_name = 2; +/// } +/// +/// { +/// "@type": "type.googleapis.com/google.profile.Person", +/// "firstName": , +/// "lastName": +/// } +/// +/// If the embedded message type is well-known and has a custom JSON +/// representation, that representation will be embedded adding a field +/// `value` which holds the custom JSON in addition to the `@type` +/// field. Example (for message [google.protobuf.Duration][]): +/// +/// { +/// "@type": "type.googleapis.com/google.protobuf.Duration", +/// "value": "1.212s" +/// } +class Any extends $pb.GeneratedMessage with $mixin.AnyMixin { + factory Any({ + $core.String? typeUrl, + $core.List<$core.int>? value, + }) { + final result = create(); + if (typeUrl != null) { + result.typeUrl = typeUrl; + } + if (value != null) { + result.value = value; + } + return result; + } + Any._() : super(); + factory Any.fromBuffer($core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + factory Any.fromJson($core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'Any', + package: + const $pb.PackageName(_omitMessageNames ? '' : 'google.protobuf'), + createEmptyInstance: create, + toProto3Json: $mixin.AnyMixin.toProto3JsonHelper, + fromProto3Json: $mixin.AnyMixin.fromProto3JsonHelper) + ..aOS(1, _omitFieldNames ? '' : 'typeUrl') + ..a<$core.List<$core.int>>( + 2, _omitFieldNames ? '' : 'value', $pb.PbFieldType.OY) + ..hasRequiredFields = false; + + @$core.Deprecated('Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') + Any clone() => Any()..mergeFromMessage(this); + @$core.Deprecated('Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + Any copyWith(void Function(Any) updates) => + super.copyWith((message) => updates(message as Any)) as Any; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static Any create() => Any._(); + Any createEmptyInstance() => create(); + static $pb.PbList createRepeated() => $pb.PbList(); + @$core.pragma('dart2js:noInline') + static Any getDefault() => + _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static Any? _defaultInstance; + + /// A URL/resource name that uniquely identifies the type of the serialized + /// protocol buffer message. This string must contain at least + /// one "/" character. The last segment of the URL's path must represent + /// the fully qualified name of the type (as in + /// `path/google.protobuf.Duration`). The name should be in a canonical form + /// (e.g., leading "." is not accepted). + /// + /// In practice, teams usually precompile into the binary all types that they + /// expect it to use in the context of Any. However, for URLs which use the + /// scheme `http`, `https`, or no scheme, one can optionally set up a type + /// server that maps type URLs to message definitions as follows: + /// + /// * If no scheme is provided, `https` is assumed. + /// * An HTTP GET on the URL must yield a [google.protobuf.Type][] + /// value in binary format, or produce an error. + /// * Applications are allowed to cache lookup results based on the + /// URL, or have them precompiled into a binary to avoid any + /// lookup. Therefore, binary compatibility needs to be preserved + /// on changes to types. (Use versioned type names to manage + /// breaking changes.) + /// + /// Note: this functionality is not currently available in the official + /// protobuf release, and it is not used for type URLs beginning with + /// type.googleapis.com. As of May 2023, there are no widely used type server + /// implementations and no plans to implement one. + /// + /// Schemes other than `http`, `https` (or the empty scheme) might be + /// used with implementation specific semantics. + @$pb.TagNumber(1) + $core.String get typeUrl => $_getSZ(0); + @$pb.TagNumber(1) + set typeUrl($core.String v) { + $_setString(0, v); + } + + @$pb.TagNumber(1) + $core.bool hasTypeUrl() => $_has(0); + @$pb.TagNumber(1) + void clearTypeUrl() => clearField(1); + + /// Must be a valid serialized protocol buffer of the above specified type. + @$pb.TagNumber(2) + $core.List<$core.int> get value => $_getN(1); + @$pb.TagNumber(2) + set value($core.List<$core.int> v) { + $_setBytes(1, v); + } + + @$pb.TagNumber(2) + $core.bool hasValue() => $_has(1); + @$pb.TagNumber(2) + void clearValue() => clearField(2); + + /// Creates a new [Any] encoding [message]. + /// + /// The [typeUrl] will be [typeUrlPrefix]/`fullName` where `fullName` is + /// the fully qualified name of the type of [message]. + static Any pack($pb.GeneratedMessage message, + {$core.String typeUrlPrefix = 'type.googleapis.com'}) { + final result = create(); + $mixin.AnyMixin.packIntoAny(result, message, typeUrlPrefix: typeUrlPrefix); + return result; + } +} + +const _omitFieldNames = $core.bool.fromEnvironment('protobuf.omit_field_names'); +const _omitMessageNames = + $core.bool.fromEnvironment('protobuf.omit_message_names'); diff --git a/lib/src/google/protobuf/wrappers.pbenum.dart b/lib/src/google/protobuf/any.pbenum.dart similarity index 87% rename from lib/src/google/protobuf/wrappers.pbenum.dart rename to lib/src/google/protobuf/any.pbenum.dart index 0c55a58..3744f12 100644 --- a/lib/src/google/protobuf/wrappers.pbenum.dart +++ b/lib/src/google/protobuf/any.pbenum.dart @@ -1,6 +1,6 @@ // // Generated code. Do not modify. -// source: nitric/google/protobuf/wrappers.proto +// source: google/protobuf/any.proto // // @dart = 2.12 diff --git a/lib/src/google/protobuf/any.pbjson.dart b/lib/src/google/protobuf/any.pbjson.dart new file mode 100644 index 0000000..eafbc6b --- /dev/null +++ b/lib/src/google/protobuf/any.pbjson.dart @@ -0,0 +1,27 @@ +// +// Generated code. Do not modify. +// source: google/protobuf/any.proto +// +// @dart = 2.12 + +// ignore_for_file: annotate_overrides, camel_case_types, comment_references +// ignore_for_file: constant_identifier_names, library_prefixes +// ignore_for_file: non_constant_identifier_names, prefer_final_fields +// ignore_for_file: unnecessary_import, unnecessary_this, unused_import + +import 'dart:convert' as $convert; +import 'dart:core' as $core; +import 'dart:typed_data' as $typed_data; + +@$core.Deprecated('Use anyDescriptor instead') +const Any$json = { + '1': 'Any', + '2': [ + {'1': 'type_url', '3': 1, '4': 1, '5': 9, '10': 'typeUrl'}, + {'1': 'value', '3': 2, '4': 1, '5': 12, '10': 'value'}, + ], +}; + +/// Descriptor for `Any`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List anyDescriptor = $convert.base64Decode( + 'CgNBbnkSGQoIdHlwZV91cmwYASABKAlSB3R5cGVVcmwSFAoFdmFsdWUYAiABKAxSBXZhbHVl'); diff --git a/lib/src/google/protobuf/duration.pb.dart b/lib/src/google/protobuf/duration.pb.dart index 6022694..2c225ac 100644 --- a/lib/src/google/protobuf/duration.pb.dart +++ b/lib/src/google/protobuf/duration.pb.dart @@ -1,6 +1,6 @@ // // Generated code. Do not modify. -// source: nitric/google/protobuf/duration.proto +// source: google/protobuf/duration.proto // // @dart = 2.12 @@ -78,14 +78,14 @@ class Duration extends $pb.GeneratedMessage with $mixin.DurationMixin { $fixnum.Int64? seconds, $core.int? nanos, }) { - final $result = create(); + final result = create(); if (seconds != null) { - $result.seconds = seconds; + result.seconds = seconds; } if (nanos != null) { - $result.nanos = nanos; + result.nanos = nanos; } - return $result; + return result; } Duration._() : super(); factory Duration.fromBuffer($core.List<$core.int> i, diff --git a/lib/src/google/protobuf/duration.pbenum.dart b/lib/src/google/protobuf/duration.pbenum.dart index 3bbfa9a..1a2c58d 100644 --- a/lib/src/google/protobuf/duration.pbenum.dart +++ b/lib/src/google/protobuf/duration.pbenum.dart @@ -1,6 +1,6 @@ // // Generated code. Do not modify. -// source: nitric/google/protobuf/duration.proto +// source: google/protobuf/duration.proto // // @dart = 2.12 diff --git a/lib/src/google/protobuf/duration.pbjson.dart b/lib/src/google/protobuf/duration.pbjson.dart index f4d7778..5847acb 100644 --- a/lib/src/google/protobuf/duration.pbjson.dart +++ b/lib/src/google/protobuf/duration.pbjson.dart @@ -1,6 +1,6 @@ // // Generated code. Do not modify. -// source: nitric/google/protobuf/duration.proto +// source: google/protobuf/duration.proto // // @dart = 2.12 diff --git a/lib/src/google/protobuf/empty.pb.dart b/lib/src/google/protobuf/empty.pb.dart index a04050a..5c5ce50 100644 --- a/lib/src/google/protobuf/empty.pb.dart +++ b/lib/src/google/protobuf/empty.pb.dart @@ -1,6 +1,6 @@ // // Generated code. Do not modify. -// source: nitric/google/protobuf/empty.proto +// source: google/protobuf/empty.proto // // @dart = 2.12 diff --git a/lib/src/google/protobuf/empty.pbenum.dart b/lib/src/google/protobuf/empty.pbenum.dart index f6116db..2f2a761 100644 --- a/lib/src/google/protobuf/empty.pbenum.dart +++ b/lib/src/google/protobuf/empty.pbenum.dart @@ -1,6 +1,6 @@ // // Generated code. Do not modify. -// source: nitric/google/protobuf/empty.proto +// source: google/protobuf/empty.proto // // @dart = 2.12 diff --git a/lib/src/google/protobuf/empty.pbjson.dart b/lib/src/google/protobuf/empty.pbjson.dart index 2d9198f..35f6e2e 100644 --- a/lib/src/google/protobuf/empty.pbjson.dart +++ b/lib/src/google/protobuf/empty.pbjson.dart @@ -1,6 +1,6 @@ // // Generated code. Do not modify. -// source: nitric/google/protobuf/empty.proto +// source: google/protobuf/empty.proto // // @dart = 2.12 diff --git a/lib/src/google/protobuf/struct.pb.dart b/lib/src/google/protobuf/struct.pb.dart index 165b715..fa1e3e7 100644 --- a/lib/src/google/protobuf/struct.pb.dart +++ b/lib/src/google/protobuf/struct.pb.dart @@ -1,6 +1,6 @@ // // Generated code. Do not modify. -// source: nitric/google/protobuf/struct.proto +// source: google/protobuf/struct.proto // // @dart = 2.12 @@ -30,11 +30,11 @@ class Struct extends $pb.GeneratedMessage with $mixin.StructMixin { factory Struct({ $core.Map<$core.String, Value>? fields, }) { - final $result = create(); + final result = create(); if (fields != null) { - $result.fields.addAll(fields); + result.fields.addAll(fields); } - return $result; + return result; } Struct._() : super(); factory Struct.fromBuffer($core.List<$core.int> i, @@ -111,26 +111,26 @@ class Value extends $pb.GeneratedMessage with $mixin.ValueMixin { Struct? structValue, ListValue? listValue, }) { - final $result = create(); + final result = create(); if (nullValue != null) { - $result.nullValue = nullValue; + result.nullValue = nullValue; } if (numberValue != null) { - $result.numberValue = numberValue; + result.numberValue = numberValue; } if (stringValue != null) { - $result.stringValue = stringValue; + result.stringValue = stringValue; } if (boolValue != null) { - $result.boolValue = boolValue; + result.boolValue = boolValue; } if (structValue != null) { - $result.structValue = structValue; + result.structValue = structValue; } if (listValue != null) { - $result.listValue = listValue; + result.listValue = listValue; } - return $result; + return result; } Value._() : super(); factory Value.fromBuffer($core.List<$core.int> i, @@ -285,11 +285,11 @@ class ListValue extends $pb.GeneratedMessage with $mixin.ListValueMixin { factory ListValue({ $core.Iterable? values, }) { - final $result = create(); + final result = create(); if (values != null) { - $result.values.addAll(values); + result.values.addAll(values); } - return $result; + return result; } ListValue._() : super(); factory ListValue.fromBuffer($core.List<$core.int> i, diff --git a/lib/src/google/protobuf/struct.pbenum.dart b/lib/src/google/protobuf/struct.pbenum.dart index 93c6e3c..7f9bf0c 100644 --- a/lib/src/google/protobuf/struct.pbenum.dart +++ b/lib/src/google/protobuf/struct.pbenum.dart @@ -1,6 +1,6 @@ // // Generated code. Do not modify. -// source: nitric/google/protobuf/struct.proto +// source: google/protobuf/struct.proto // // @dart = 2.12 diff --git a/lib/src/google/protobuf/struct.pbjson.dart b/lib/src/google/protobuf/struct.pbjson.dart index 99b1121..c0693f5 100644 --- a/lib/src/google/protobuf/struct.pbjson.dart +++ b/lib/src/google/protobuf/struct.pbjson.dart @@ -1,6 +1,6 @@ // // Generated code. Do not modify. -// source: nitric/google/protobuf/struct.proto +// source: google/protobuf/struct.proto // // @dart = 2.12 diff --git a/lib/src/google/protobuf/timestamp.pb.dart b/lib/src/google/protobuf/timestamp.pb.dart index 772dd50..3282fc2 100644 --- a/lib/src/google/protobuf/timestamp.pb.dart +++ b/lib/src/google/protobuf/timestamp.pb.dart @@ -1,6 +1,6 @@ // // Generated code. Do not modify. -// source: nitric/google/protobuf/timestamp.proto +// source: google/protobuf/timestamp.proto // // @dart = 2.12 @@ -109,14 +109,14 @@ class Timestamp extends $pb.GeneratedMessage with $mixin.TimestampMixin { $fixnum.Int64? seconds, $core.int? nanos, }) { - final $result = create(); + final result = create(); if (seconds != null) { - $result.seconds = seconds; + result.seconds = seconds; } if (nanos != null) { - $result.nanos = nanos; + result.nanos = nanos; } - return $result; + return result; } Timestamp._() : super(); factory Timestamp.fromBuffer($core.List<$core.int> i, diff --git a/lib/src/google/protobuf/timestamp.pbenum.dart b/lib/src/google/protobuf/timestamp.pbenum.dart index 3c668f4..a194b80 100644 --- a/lib/src/google/protobuf/timestamp.pbenum.dart +++ b/lib/src/google/protobuf/timestamp.pbenum.dart @@ -1,6 +1,6 @@ // // Generated code. Do not modify. -// source: nitric/google/protobuf/timestamp.proto +// source: google/protobuf/timestamp.proto // // @dart = 2.12 diff --git a/lib/src/google/protobuf/timestamp.pbjson.dart b/lib/src/google/protobuf/timestamp.pbjson.dart index 438a3c0..39ab20f 100644 --- a/lib/src/google/protobuf/timestamp.pbjson.dart +++ b/lib/src/google/protobuf/timestamp.pbjson.dart @@ -1,6 +1,6 @@ // // Generated code. Do not modify. -// source: nitric/google/protobuf/timestamp.proto +// source: google/protobuf/timestamp.proto // // @dart = 2.12 diff --git a/lib/src/google/protobuf/wrappers.pb.dart b/lib/src/google/protobuf/wrappers.pb.dart deleted file mode 100644 index 705cdda..0000000 --- a/lib/src/google/protobuf/wrappers.pb.dart +++ /dev/null @@ -1,620 +0,0 @@ -// -// Generated code. Do not modify. -// source: nitric/google/protobuf/wrappers.proto -// -// @dart = 2.12 - -// ignore_for_file: annotate_overrides, camel_case_types, comment_references -// ignore_for_file: constant_identifier_names, library_prefixes -// ignore_for_file: non_constant_identifier_names, prefer_final_fields -// ignore_for_file: unnecessary_import, unnecessary_this, unused_import - -import 'dart:core' as $core; - -import 'package:fixnum/fixnum.dart' as $fixnum; -import 'package:protobuf/protobuf.dart' as $pb; -import 'package:protobuf/src/protobuf/mixins/well_known.dart' as $mixin; - -/// Wrapper message for `double`. -/// -/// The JSON representation for `DoubleValue` is JSON number. -class DoubleValue extends $pb.GeneratedMessage with $mixin.DoubleValueMixin { - factory DoubleValue({ - $core.double? value, - }) { - final $result = create(); - if (value != null) { - $result.value = value; - } - return $result; - } - DoubleValue._() : super(); - factory DoubleValue.fromBuffer($core.List<$core.int> i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromBuffer(i, r); - factory DoubleValue.fromJson($core.String i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromJson(i, r); - - static final $pb.BuilderInfo _i = $pb.BuilderInfo( - _omitMessageNames ? '' : 'DoubleValue', - package: - const $pb.PackageName(_omitMessageNames ? '' : 'google.protobuf'), - createEmptyInstance: create, - toProto3Json: $mixin.DoubleValueMixin.toProto3JsonHelper, - fromProto3Json: $mixin.DoubleValueMixin.fromProto3JsonHelper) - ..a<$core.double>(1, _omitFieldNames ? '' : 'value', $pb.PbFieldType.OD) - ..hasRequiredFields = false; - - @$core.Deprecated('Using this can add significant overhead to your binary. ' - 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' - 'Will be removed in next major version') - DoubleValue clone() => DoubleValue()..mergeFromMessage(this); - @$core.Deprecated('Using this can add significant overhead to your binary. ' - 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' - 'Will be removed in next major version') - DoubleValue copyWith(void Function(DoubleValue) updates) => - super.copyWith((message) => updates(message as DoubleValue)) - as DoubleValue; - - $pb.BuilderInfo get info_ => _i; - - @$core.pragma('dart2js:noInline') - static DoubleValue create() => DoubleValue._(); - DoubleValue createEmptyInstance() => create(); - static $pb.PbList createRepeated() => $pb.PbList(); - @$core.pragma('dart2js:noInline') - static DoubleValue getDefault() => _defaultInstance ??= - $pb.GeneratedMessage.$_defaultFor(create); - static DoubleValue? _defaultInstance; - - /// The double value. - @$pb.TagNumber(1) - $core.double get value => $_getN(0); - @$pb.TagNumber(1) - set value($core.double v) { - $_setDouble(0, v); - } - - @$pb.TagNumber(1) - $core.bool hasValue() => $_has(0); - @$pb.TagNumber(1) - void clearValue() => clearField(1); -} - -/// Wrapper message for `float`. -/// -/// The JSON representation for `FloatValue` is JSON number. -class FloatValue extends $pb.GeneratedMessage with $mixin.FloatValueMixin { - factory FloatValue({ - $core.double? value, - }) { - final $result = create(); - if (value != null) { - $result.value = value; - } - return $result; - } - FloatValue._() : super(); - factory FloatValue.fromBuffer($core.List<$core.int> i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromBuffer(i, r); - factory FloatValue.fromJson($core.String i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromJson(i, r); - - static final $pb.BuilderInfo _i = $pb.BuilderInfo( - _omitMessageNames ? '' : 'FloatValue', - package: - const $pb.PackageName(_omitMessageNames ? '' : 'google.protobuf'), - createEmptyInstance: create, - toProto3Json: $mixin.FloatValueMixin.toProto3JsonHelper, - fromProto3Json: $mixin.FloatValueMixin.fromProto3JsonHelper) - ..a<$core.double>(1, _omitFieldNames ? '' : 'value', $pb.PbFieldType.OF) - ..hasRequiredFields = false; - - @$core.Deprecated('Using this can add significant overhead to your binary. ' - 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' - 'Will be removed in next major version') - FloatValue clone() => FloatValue()..mergeFromMessage(this); - @$core.Deprecated('Using this can add significant overhead to your binary. ' - 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' - 'Will be removed in next major version') - FloatValue copyWith(void Function(FloatValue) updates) => - super.copyWith((message) => updates(message as FloatValue)) as FloatValue; - - $pb.BuilderInfo get info_ => _i; - - @$core.pragma('dart2js:noInline') - static FloatValue create() => FloatValue._(); - FloatValue createEmptyInstance() => create(); - static $pb.PbList createRepeated() => $pb.PbList(); - @$core.pragma('dart2js:noInline') - static FloatValue getDefault() => _defaultInstance ??= - $pb.GeneratedMessage.$_defaultFor(create); - static FloatValue? _defaultInstance; - - /// The float value. - @$pb.TagNumber(1) - $core.double get value => $_getN(0); - @$pb.TagNumber(1) - set value($core.double v) { - $_setFloat(0, v); - } - - @$pb.TagNumber(1) - $core.bool hasValue() => $_has(0); - @$pb.TagNumber(1) - void clearValue() => clearField(1); -} - -/// Wrapper message for `int64`. -/// -/// The JSON representation for `Int64Value` is JSON string. -class Int64Value extends $pb.GeneratedMessage with $mixin.Int64ValueMixin { - factory Int64Value({ - $fixnum.Int64? value, - }) { - final $result = create(); - if (value != null) { - $result.value = value; - } - return $result; - } - Int64Value._() : super(); - factory Int64Value.fromBuffer($core.List<$core.int> i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromBuffer(i, r); - factory Int64Value.fromJson($core.String i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromJson(i, r); - - static final $pb.BuilderInfo _i = $pb.BuilderInfo( - _omitMessageNames ? '' : 'Int64Value', - package: - const $pb.PackageName(_omitMessageNames ? '' : 'google.protobuf'), - createEmptyInstance: create, - toProto3Json: $mixin.Int64ValueMixin.toProto3JsonHelper, - fromProto3Json: $mixin.Int64ValueMixin.fromProto3JsonHelper) - ..aInt64(1, _omitFieldNames ? '' : 'value') - ..hasRequiredFields = false; - - @$core.Deprecated('Using this can add significant overhead to your binary. ' - 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' - 'Will be removed in next major version') - Int64Value clone() => Int64Value()..mergeFromMessage(this); - @$core.Deprecated('Using this can add significant overhead to your binary. ' - 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' - 'Will be removed in next major version') - Int64Value copyWith(void Function(Int64Value) updates) => - super.copyWith((message) => updates(message as Int64Value)) as Int64Value; - - $pb.BuilderInfo get info_ => _i; - - @$core.pragma('dart2js:noInline') - static Int64Value create() => Int64Value._(); - Int64Value createEmptyInstance() => create(); - static $pb.PbList createRepeated() => $pb.PbList(); - @$core.pragma('dart2js:noInline') - static Int64Value getDefault() => _defaultInstance ??= - $pb.GeneratedMessage.$_defaultFor(create); - static Int64Value? _defaultInstance; - - /// The int64 value. - @$pb.TagNumber(1) - $fixnum.Int64 get value => $_getI64(0); - @$pb.TagNumber(1) - set value($fixnum.Int64 v) { - $_setInt64(0, v); - } - - @$pb.TagNumber(1) - $core.bool hasValue() => $_has(0); - @$pb.TagNumber(1) - void clearValue() => clearField(1); -} - -/// Wrapper message for `uint64`. -/// -/// The JSON representation for `UInt64Value` is JSON string. -class UInt64Value extends $pb.GeneratedMessage with $mixin.UInt64ValueMixin { - factory UInt64Value({ - $fixnum.Int64? value, - }) { - final $result = create(); - if (value != null) { - $result.value = value; - } - return $result; - } - UInt64Value._() : super(); - factory UInt64Value.fromBuffer($core.List<$core.int> i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromBuffer(i, r); - factory UInt64Value.fromJson($core.String i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromJson(i, r); - - static final $pb.BuilderInfo _i = $pb.BuilderInfo( - _omitMessageNames ? '' : 'UInt64Value', - package: - const $pb.PackageName(_omitMessageNames ? '' : 'google.protobuf'), - createEmptyInstance: create, - toProto3Json: $mixin.UInt64ValueMixin.toProto3JsonHelper, - fromProto3Json: $mixin.UInt64ValueMixin.fromProto3JsonHelper) - ..a<$fixnum.Int64>(1, _omitFieldNames ? '' : 'value', $pb.PbFieldType.OU6, - defaultOrMaker: $fixnum.Int64.ZERO) - ..hasRequiredFields = false; - - @$core.Deprecated('Using this can add significant overhead to your binary. ' - 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' - 'Will be removed in next major version') - UInt64Value clone() => UInt64Value()..mergeFromMessage(this); - @$core.Deprecated('Using this can add significant overhead to your binary. ' - 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' - 'Will be removed in next major version') - UInt64Value copyWith(void Function(UInt64Value) updates) => - super.copyWith((message) => updates(message as UInt64Value)) - as UInt64Value; - - $pb.BuilderInfo get info_ => _i; - - @$core.pragma('dart2js:noInline') - static UInt64Value create() => UInt64Value._(); - UInt64Value createEmptyInstance() => create(); - static $pb.PbList createRepeated() => $pb.PbList(); - @$core.pragma('dart2js:noInline') - static UInt64Value getDefault() => _defaultInstance ??= - $pb.GeneratedMessage.$_defaultFor(create); - static UInt64Value? _defaultInstance; - - /// The uint64 value. - @$pb.TagNumber(1) - $fixnum.Int64 get value => $_getI64(0); - @$pb.TagNumber(1) - set value($fixnum.Int64 v) { - $_setInt64(0, v); - } - - @$pb.TagNumber(1) - $core.bool hasValue() => $_has(0); - @$pb.TagNumber(1) - void clearValue() => clearField(1); -} - -/// Wrapper message for `int32`. -/// -/// The JSON representation for `Int32Value` is JSON number. -class Int32Value extends $pb.GeneratedMessage with $mixin.Int32ValueMixin { - factory Int32Value({ - $core.int? value, - }) { - final $result = create(); - if (value != null) { - $result.value = value; - } - return $result; - } - Int32Value._() : super(); - factory Int32Value.fromBuffer($core.List<$core.int> i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromBuffer(i, r); - factory Int32Value.fromJson($core.String i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromJson(i, r); - - static final $pb.BuilderInfo _i = $pb.BuilderInfo( - _omitMessageNames ? '' : 'Int32Value', - package: - const $pb.PackageName(_omitMessageNames ? '' : 'google.protobuf'), - createEmptyInstance: create, - toProto3Json: $mixin.Int32ValueMixin.toProto3JsonHelper, - fromProto3Json: $mixin.Int32ValueMixin.fromProto3JsonHelper) - ..a<$core.int>(1, _omitFieldNames ? '' : 'value', $pb.PbFieldType.O3) - ..hasRequiredFields = false; - - @$core.Deprecated('Using this can add significant overhead to your binary. ' - 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' - 'Will be removed in next major version') - Int32Value clone() => Int32Value()..mergeFromMessage(this); - @$core.Deprecated('Using this can add significant overhead to your binary. ' - 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' - 'Will be removed in next major version') - Int32Value copyWith(void Function(Int32Value) updates) => - super.copyWith((message) => updates(message as Int32Value)) as Int32Value; - - $pb.BuilderInfo get info_ => _i; - - @$core.pragma('dart2js:noInline') - static Int32Value create() => Int32Value._(); - Int32Value createEmptyInstance() => create(); - static $pb.PbList createRepeated() => $pb.PbList(); - @$core.pragma('dart2js:noInline') - static Int32Value getDefault() => _defaultInstance ??= - $pb.GeneratedMessage.$_defaultFor(create); - static Int32Value? _defaultInstance; - - /// The int32 value. - @$pb.TagNumber(1) - $core.int get value => $_getIZ(0); - @$pb.TagNumber(1) - set value($core.int v) { - $_setSignedInt32(0, v); - } - - @$pb.TagNumber(1) - $core.bool hasValue() => $_has(0); - @$pb.TagNumber(1) - void clearValue() => clearField(1); -} - -/// Wrapper message for `uint32`. -/// -/// The JSON representation for `UInt32Value` is JSON number. -class UInt32Value extends $pb.GeneratedMessage with $mixin.UInt32ValueMixin { - factory UInt32Value({ - $core.int? value, - }) { - final $result = create(); - if (value != null) { - $result.value = value; - } - return $result; - } - UInt32Value._() : super(); - factory UInt32Value.fromBuffer($core.List<$core.int> i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromBuffer(i, r); - factory UInt32Value.fromJson($core.String i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromJson(i, r); - - static final $pb.BuilderInfo _i = $pb.BuilderInfo( - _omitMessageNames ? '' : 'UInt32Value', - package: - const $pb.PackageName(_omitMessageNames ? '' : 'google.protobuf'), - createEmptyInstance: create, - toProto3Json: $mixin.UInt32ValueMixin.toProto3JsonHelper, - fromProto3Json: $mixin.UInt32ValueMixin.fromProto3JsonHelper) - ..a<$core.int>(1, _omitFieldNames ? '' : 'value', $pb.PbFieldType.OU3) - ..hasRequiredFields = false; - - @$core.Deprecated('Using this can add significant overhead to your binary. ' - 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' - 'Will be removed in next major version') - UInt32Value clone() => UInt32Value()..mergeFromMessage(this); - @$core.Deprecated('Using this can add significant overhead to your binary. ' - 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' - 'Will be removed in next major version') - UInt32Value copyWith(void Function(UInt32Value) updates) => - super.copyWith((message) => updates(message as UInt32Value)) - as UInt32Value; - - $pb.BuilderInfo get info_ => _i; - - @$core.pragma('dart2js:noInline') - static UInt32Value create() => UInt32Value._(); - UInt32Value createEmptyInstance() => create(); - static $pb.PbList createRepeated() => $pb.PbList(); - @$core.pragma('dart2js:noInline') - static UInt32Value getDefault() => _defaultInstance ??= - $pb.GeneratedMessage.$_defaultFor(create); - static UInt32Value? _defaultInstance; - - /// The uint32 value. - @$pb.TagNumber(1) - $core.int get value => $_getIZ(0); - @$pb.TagNumber(1) - set value($core.int v) { - $_setUnsignedInt32(0, v); - } - - @$pb.TagNumber(1) - $core.bool hasValue() => $_has(0); - @$pb.TagNumber(1) - void clearValue() => clearField(1); -} - -/// Wrapper message for `bool`. -/// -/// The JSON representation for `BoolValue` is JSON `true` and `false`. -class BoolValue extends $pb.GeneratedMessage with $mixin.BoolValueMixin { - factory BoolValue({ - $core.bool? value, - }) { - final $result = create(); - if (value != null) { - $result.value = value; - } - return $result; - } - BoolValue._() : super(); - factory BoolValue.fromBuffer($core.List<$core.int> i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromBuffer(i, r); - factory BoolValue.fromJson($core.String i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromJson(i, r); - - static final $pb.BuilderInfo _i = $pb.BuilderInfo( - _omitMessageNames ? '' : 'BoolValue', - package: - const $pb.PackageName(_omitMessageNames ? '' : 'google.protobuf'), - createEmptyInstance: create, - toProto3Json: $mixin.BoolValueMixin.toProto3JsonHelper, - fromProto3Json: $mixin.BoolValueMixin.fromProto3JsonHelper) - ..aOB(1, _omitFieldNames ? '' : 'value') - ..hasRequiredFields = false; - - @$core.Deprecated('Using this can add significant overhead to your binary. ' - 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' - 'Will be removed in next major version') - BoolValue clone() => BoolValue()..mergeFromMessage(this); - @$core.Deprecated('Using this can add significant overhead to your binary. ' - 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' - 'Will be removed in next major version') - BoolValue copyWith(void Function(BoolValue) updates) => - super.copyWith((message) => updates(message as BoolValue)) as BoolValue; - - $pb.BuilderInfo get info_ => _i; - - @$core.pragma('dart2js:noInline') - static BoolValue create() => BoolValue._(); - BoolValue createEmptyInstance() => create(); - static $pb.PbList createRepeated() => $pb.PbList(); - @$core.pragma('dart2js:noInline') - static BoolValue getDefault() => - _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); - static BoolValue? _defaultInstance; - - /// The bool value. - @$pb.TagNumber(1) - $core.bool get value => $_getBF(0); - @$pb.TagNumber(1) - set value($core.bool v) { - $_setBool(0, v); - } - - @$pb.TagNumber(1) - $core.bool hasValue() => $_has(0); - @$pb.TagNumber(1) - void clearValue() => clearField(1); -} - -/// Wrapper message for `string`. -/// -/// The JSON representation for `StringValue` is JSON string. -class StringValue extends $pb.GeneratedMessage with $mixin.StringValueMixin { - factory StringValue({ - $core.String? value, - }) { - final $result = create(); - if (value != null) { - $result.value = value; - } - return $result; - } - StringValue._() : super(); - factory StringValue.fromBuffer($core.List<$core.int> i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromBuffer(i, r); - factory StringValue.fromJson($core.String i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromJson(i, r); - - static final $pb.BuilderInfo _i = $pb.BuilderInfo( - _omitMessageNames ? '' : 'StringValue', - package: - const $pb.PackageName(_omitMessageNames ? '' : 'google.protobuf'), - createEmptyInstance: create, - toProto3Json: $mixin.StringValueMixin.toProto3JsonHelper, - fromProto3Json: $mixin.StringValueMixin.fromProto3JsonHelper) - ..aOS(1, _omitFieldNames ? '' : 'value') - ..hasRequiredFields = false; - - @$core.Deprecated('Using this can add significant overhead to your binary. ' - 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' - 'Will be removed in next major version') - StringValue clone() => StringValue()..mergeFromMessage(this); - @$core.Deprecated('Using this can add significant overhead to your binary. ' - 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' - 'Will be removed in next major version') - StringValue copyWith(void Function(StringValue) updates) => - super.copyWith((message) => updates(message as StringValue)) - as StringValue; - - $pb.BuilderInfo get info_ => _i; - - @$core.pragma('dart2js:noInline') - static StringValue create() => StringValue._(); - StringValue createEmptyInstance() => create(); - static $pb.PbList createRepeated() => $pb.PbList(); - @$core.pragma('dart2js:noInline') - static StringValue getDefault() => _defaultInstance ??= - $pb.GeneratedMessage.$_defaultFor(create); - static StringValue? _defaultInstance; - - /// The string value. - @$pb.TagNumber(1) - $core.String get value => $_getSZ(0); - @$pb.TagNumber(1) - set value($core.String v) { - $_setString(0, v); - } - - @$pb.TagNumber(1) - $core.bool hasValue() => $_has(0); - @$pb.TagNumber(1) - void clearValue() => clearField(1); -} - -/// Wrapper message for `bytes`. -/// -/// The JSON representation for `BytesValue` is JSON string. -class BytesValue extends $pb.GeneratedMessage with $mixin.BytesValueMixin { - factory BytesValue({ - $core.List<$core.int>? value, - }) { - final $result = create(); - if (value != null) { - $result.value = value; - } - return $result; - } - BytesValue._() : super(); - factory BytesValue.fromBuffer($core.List<$core.int> i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromBuffer(i, r); - factory BytesValue.fromJson($core.String i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromJson(i, r); - - static final $pb.BuilderInfo _i = $pb.BuilderInfo( - _omitMessageNames ? '' : 'BytesValue', - package: - const $pb.PackageName(_omitMessageNames ? '' : 'google.protobuf'), - createEmptyInstance: create, - toProto3Json: $mixin.BytesValueMixin.toProto3JsonHelper, - fromProto3Json: $mixin.BytesValueMixin.fromProto3JsonHelper) - ..a<$core.List<$core.int>>( - 1, _omitFieldNames ? '' : 'value', $pb.PbFieldType.OY) - ..hasRequiredFields = false; - - @$core.Deprecated('Using this can add significant overhead to your binary. ' - 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' - 'Will be removed in next major version') - BytesValue clone() => BytesValue()..mergeFromMessage(this); - @$core.Deprecated('Using this can add significant overhead to your binary. ' - 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' - 'Will be removed in next major version') - BytesValue copyWith(void Function(BytesValue) updates) => - super.copyWith((message) => updates(message as BytesValue)) as BytesValue; - - $pb.BuilderInfo get info_ => _i; - - @$core.pragma('dart2js:noInline') - static BytesValue create() => BytesValue._(); - BytesValue createEmptyInstance() => create(); - static $pb.PbList createRepeated() => $pb.PbList(); - @$core.pragma('dart2js:noInline') - static BytesValue getDefault() => _defaultInstance ??= - $pb.GeneratedMessage.$_defaultFor(create); - static BytesValue? _defaultInstance; - - /// The bytes value. - @$pb.TagNumber(1) - $core.List<$core.int> get value => $_getN(0); - @$pb.TagNumber(1) - set value($core.List<$core.int> v) { - $_setBytes(0, v); - } - - @$pb.TagNumber(1) - $core.bool hasValue() => $_has(0); - @$pb.TagNumber(1) - void clearValue() => clearField(1); -} - -const _omitFieldNames = $core.bool.fromEnvironment('protobuf.omit_field_names'); -const _omitMessageNames = - $core.bool.fromEnvironment('protobuf.omit_message_names'); diff --git a/lib/src/google/protobuf/wrappers.pbjson.dart b/lib/src/google/protobuf/wrappers.pbjson.dart deleted file mode 100644 index c2da7e3..0000000 --- a/lib/src/google/protobuf/wrappers.pbjson.dart +++ /dev/null @@ -1,122 +0,0 @@ -// -// Generated code. Do not modify. -// source: nitric/google/protobuf/wrappers.proto -// -// @dart = 2.12 - -// ignore_for_file: annotate_overrides, camel_case_types, comment_references -// ignore_for_file: constant_identifier_names, library_prefixes -// ignore_for_file: non_constant_identifier_names, prefer_final_fields -// ignore_for_file: unnecessary_import, unnecessary_this, unused_import - -import 'dart:convert' as $convert; -import 'dart:core' as $core; -import 'dart:typed_data' as $typed_data; - -@$core.Deprecated('Use doubleValueDescriptor instead') -const DoubleValue$json = { - '1': 'DoubleValue', - '2': [ - {'1': 'value', '3': 1, '4': 1, '5': 1, '10': 'value'}, - ], -}; - -/// Descriptor for `DoubleValue`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List doubleValueDescriptor = - $convert.base64Decode('CgtEb3VibGVWYWx1ZRIUCgV2YWx1ZRgBIAEoAVIFdmFsdWU='); - -@$core.Deprecated('Use floatValueDescriptor instead') -const FloatValue$json = { - '1': 'FloatValue', - '2': [ - {'1': 'value', '3': 1, '4': 1, '5': 2, '10': 'value'}, - ], -}; - -/// Descriptor for `FloatValue`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List floatValueDescriptor = - $convert.base64Decode('CgpGbG9hdFZhbHVlEhQKBXZhbHVlGAEgASgCUgV2YWx1ZQ=='); - -@$core.Deprecated('Use int64ValueDescriptor instead') -const Int64Value$json = { - '1': 'Int64Value', - '2': [ - {'1': 'value', '3': 1, '4': 1, '5': 3, '10': 'value'}, - ], -}; - -/// Descriptor for `Int64Value`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List int64ValueDescriptor = - $convert.base64Decode('CgpJbnQ2NFZhbHVlEhQKBXZhbHVlGAEgASgDUgV2YWx1ZQ=='); - -@$core.Deprecated('Use uInt64ValueDescriptor instead') -const UInt64Value$json = { - '1': 'UInt64Value', - '2': [ - {'1': 'value', '3': 1, '4': 1, '5': 4, '10': 'value'}, - ], -}; - -/// Descriptor for `UInt64Value`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List uInt64ValueDescriptor = - $convert.base64Decode('CgtVSW50NjRWYWx1ZRIUCgV2YWx1ZRgBIAEoBFIFdmFsdWU='); - -@$core.Deprecated('Use int32ValueDescriptor instead') -const Int32Value$json = { - '1': 'Int32Value', - '2': [ - {'1': 'value', '3': 1, '4': 1, '5': 5, '10': 'value'}, - ], -}; - -/// Descriptor for `Int32Value`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List int32ValueDescriptor = - $convert.base64Decode('CgpJbnQzMlZhbHVlEhQKBXZhbHVlGAEgASgFUgV2YWx1ZQ=='); - -@$core.Deprecated('Use uInt32ValueDescriptor instead') -const UInt32Value$json = { - '1': 'UInt32Value', - '2': [ - {'1': 'value', '3': 1, '4': 1, '5': 13, '10': 'value'}, - ], -}; - -/// Descriptor for `UInt32Value`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List uInt32ValueDescriptor = - $convert.base64Decode('CgtVSW50MzJWYWx1ZRIUCgV2YWx1ZRgBIAEoDVIFdmFsdWU='); - -@$core.Deprecated('Use boolValueDescriptor instead') -const BoolValue$json = { - '1': 'BoolValue', - '2': [ - {'1': 'value', '3': 1, '4': 1, '5': 8, '10': 'value'}, - ], -}; - -/// Descriptor for `BoolValue`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List boolValueDescriptor = - $convert.base64Decode('CglCb29sVmFsdWUSFAoFdmFsdWUYASABKAhSBXZhbHVl'); - -@$core.Deprecated('Use stringValueDescriptor instead') -const StringValue$json = { - '1': 'StringValue', - '2': [ - {'1': 'value', '3': 1, '4': 1, '5': 9, '10': 'value'}, - ], -}; - -/// Descriptor for `StringValue`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List stringValueDescriptor = - $convert.base64Decode('CgtTdHJpbmdWYWx1ZRIUCgV2YWx1ZRgBIAEoCVIFdmFsdWU='); - -@$core.Deprecated('Use bytesValueDescriptor instead') -const BytesValue$json = { - '1': 'BytesValue', - '2': [ - {'1': 'value', '3': 1, '4': 1, '5': 12, '10': 'value'}, - ], -}; - -/// Descriptor for `BytesValue`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List bytesValueDescriptor = - $convert.base64Decode('CgpCeXRlc1ZhbHVlEhQKBXZhbHVlGAEgASgMUgV2YWx1ZQ=='); diff --git a/lib/src/grpc_helper.dart b/lib/src/grpc_helper.dart index f4c1588..a853af8 100644 --- a/lib/src/grpc_helper.dart +++ b/lib/src/grpc_helper.dart @@ -9,7 +9,6 @@ ClientChannel createClientChannelFromEnvVar({int defaultPort = 50051}) { String? envVar = Platform.environment[envVarName]; if (envVar == null) { - print('$envVarName is not set. Using default values.'); return ClientChannel( '127.0.0.1', port: defaultPort, diff --git a/lib/src/nitric.dart b/lib/src/nitric.dart index ae137c0..c91f73d 100644 --- a/lib/src/nitric.dart +++ b/lib/src/nitric.dart @@ -1,3 +1,5 @@ +import 'package:nitric_sdk/resources.dart'; + import 'resources/common.dart'; abstract class Worker { @@ -5,86 +7,60 @@ abstract class Worker { } class Nitric { - static final Nitric _nitric = Nitric._internal(); - static final List _workers = []; + static final Map> _cache = {}; - factory Nitric() { - return _nitric; - } + static Resource _makeResource( + String name, T Function(String name) creator) { + var typename = T.toString(); - // Internal use - static registerWorker(Worker worker) { - _workers.add(worker); - } + if (!_cache.containsKey(typename)) { + _cache[typename] = {}; + } - static run() { - Future.wait(_workers.map((worker) async { - await worker.start(); - })); - } + if (!_cache[typename]!.containsKey(name)) { + _cache[typename]![name] = creator(name); - Nitric._internal(); + var registerFuture = _cache[typename]![name]!.register(); - /// Create a [name]d bucket for storing blobs. - static BucketResource bucket(String name) { - var res = BucketResource(name); - - res.register(); + registerFuture.onError((error, stackTrace) => + print("error occurred registering $typename $name: $error")); + } - return res; + return _cache[typename]![name] as T; } - /// Create a [name]d api for registering HTTP handlers. - static Api api(String name) { - var res = Api(name); - - res.register(); + /// Create a [name]d bucket for storing blobs. + static BucketResource bucket(String name) => + _makeResource(name, BucketResource.new) as BucketResource; - return res; - } + /// Create a [name]d api for registering HTTP handlers. + static Api api(String name, {ApiOptions? opts}) => + _makeResource(name, (name) => Api(name, opts: opts)) as Api; /// Create a [name]d collection for storing documents. - static KeyValueStoreResource store(String name) { - var res = KeyValueStoreResource(name); - - res.register(); - - return res; - } + static KeyValueStoreResource store(String name) => + _makeResource(name, KeyValueStoreResource.new) as KeyValueStoreResource; /// Create a [name]d schedule for running handlers on a set interval. - static Schedule schedule(String name) { - var res = Schedule(name); - - res.register(); - - return res; - } + static Schedule schedule(String name) => + _makeResource(name, Schedule.new) as Schedule; /// Create a [name]d secret for storing encrypted values. - static SecretResource secret(String name) { - var res = SecretResource(name); - - res.register(); - - return res; - } + static SecretResource secret(String name) => + _makeResource(name, SecretResource.new) as SecretResource; /// Create a [name]d topic for registering push-based event handlers. - static Topic topic(String name) { - var res = Topic(name); - - res.register(); - - return res; - } + static Topic topic(String name) => _makeResource(name, Topic.new) as Topic; /// Create a [name]d websocket for registering bidirectional HTTP handlers. - static Websocket websocket(String name) { - var res = Websocket(name); - - res.register(); - - return res; + static Websocket websocket(String name) => + _makeResource(name, Websocket.new) as Websocket; + + /// Create a [name]d oidc rule for attaching security definitions to APIs. + static SecurityOption oidcRule( + String name, String issuer, List audiences) { + return (List scopes) { + return OidcOptions(name, issuer, audiences, scopes); + }; } } diff --git a/lib/src/nitric/proto/deployments/v1/deployments.pb.dart b/lib/src/nitric/proto/deployments/v1/deployments.pb.dart index 01f00b6..d5191f5 100644 --- a/lib/src/nitric/proto/deployments/v1/deployments.pb.dart +++ b/lib/src/nitric/proto/deployments/v1/deployments.pb.dart @@ -13,7 +13,7 @@ import 'dart:core' as $core; import 'package:protobuf/protobuf.dart' as $pb; -import '../../../../google/protobuf/struct.pb.dart' as $12; +import '../../../../google/protobuf/struct.pb.dart' as $13; import '../../resources/v1/resources.pb.dart' as $1; import '../../resources/v1/resources.pbenum.dart' as $1; import '../../storage/v1/storage.pb.dart' as $2; @@ -24,7 +24,7 @@ export 'deployments.pbenum.dart'; class DeploymentUpRequest extends $pb.GeneratedMessage { factory DeploymentUpRequest({ Spec? spec, - $12.Struct? attributes, + $13.Struct? attributes, $core.bool? interactive, }) { final $result = create(); @@ -53,8 +53,8 @@ class DeploymentUpRequest extends $pb.GeneratedMessage { _omitMessageNames ? '' : 'nitric.proto.deployments.v1'), createEmptyInstance: create) ..aOM(1, _omitFieldNames ? '' : 'spec', subBuilder: Spec.create) - ..aOM<$12.Struct>(2, _omitFieldNames ? '' : 'attributes', - subBuilder: $12.Struct.create) + ..aOM<$13.Struct>(2, _omitFieldNames ? '' : 'attributes', + subBuilder: $13.Struct.create) ..aOB(3, _omitFieldNames ? '' : 'interactive') ..hasRequiredFields = false; @@ -99,9 +99,9 @@ class DeploymentUpRequest extends $pb.GeneratedMessage { /// A map of attributes related to the deploy request /// this allows for adding project identifiers etc. @$pb.TagNumber(2) - $12.Struct get attributes => $_getN(1); + $13.Struct get attributes => $_getN(1); @$pb.TagNumber(2) - set attributes($12.Struct v) { + set attributes($13.Struct v) { setField(2, v); } @@ -110,7 +110,7 @@ class DeploymentUpRequest extends $pb.GeneratedMessage { @$pb.TagNumber(2) void clearAttributes() => clearField(2); @$pb.TagNumber(2) - $12.Struct ensureAttributes() => $_ensure(1); + $13.Struct ensureAttributes() => $_ensure(1); /// A hint to the provider of the kind of output that the client can accept /// This will allow provider developers to provider richer output back to clients. @@ -428,7 +428,7 @@ class UpResult extends $pb.GeneratedMessage { createEmptyInstance: create) ..oo(0, [2]) ..aOB(1, _omitFieldNames ? '' : 'success') - ..aOS(2, _omitFieldNames ? '' : 'Text', protoName: 'Text') + ..aOS(2, _omitFieldNames ? '' : 'text') ..hasRequiredFields = false; @$core.Deprecated('Using this can add significant overhead to your binary. ' @@ -484,7 +484,7 @@ class UpResult extends $pb.GeneratedMessage { class DeploymentDownRequest extends $pb.GeneratedMessage { factory DeploymentDownRequest({ - $12.Struct? attributes, + $13.Struct? attributes, $core.bool? interactive, }) { final $result = create(); @@ -509,8 +509,8 @@ class DeploymentDownRequest extends $pb.GeneratedMessage { package: const $pb.PackageName( _omitMessageNames ? '' : 'nitric.proto.deployments.v1'), createEmptyInstance: create) - ..aOM<$12.Struct>(1, _omitFieldNames ? '' : 'attributes', - subBuilder: $12.Struct.create) + ..aOM<$13.Struct>(1, _omitFieldNames ? '' : 'attributes', + subBuilder: $13.Struct.create) ..aOB(2, _omitFieldNames ? '' : 'interactive') ..hasRequiredFields = false; @@ -542,9 +542,9 @@ class DeploymentDownRequest extends $pb.GeneratedMessage { /// A map of attributes related to the deploy request /// this allows for adding project identifiers etc. @$pb.TagNumber(1) - $12.Struct get attributes => $_getN(0); + $13.Struct get attributes => $_getN(0); @$pb.TagNumber(1) - set attributes($12.Struct v) { + set attributes($13.Struct v) { setField(1, v); } @@ -553,7 +553,7 @@ class DeploymentDownRequest extends $pb.GeneratedMessage { @$pb.TagNumber(1) void clearAttributes() => clearField(1); @$pb.TagNumber(1) - $12.Struct ensureAttributes() => $_ensure(0); + $13.Struct ensureAttributes() => $_ensure(0); /// A hint to the provider of the kind of output that the client can accept /// This will allow provider developers to provider richer output back to clients. diff --git a/lib/src/nitric/proto/deployments/v1/deployments.pbjson.dart b/lib/src/nitric/proto/deployments/v1/deployments.pbjson.dart index 5dc57d0..16012d8 100644 --- a/lib/src/nitric/proto/deployments/v1/deployments.pbjson.dart +++ b/lib/src/nitric/proto/deployments/v1/deployments.pbjson.dart @@ -162,7 +162,7 @@ const UpResult$json = { '1': 'UpResult', '2': [ {'1': 'success', '3': 1, '4': 1, '5': 8, '10': 'success'}, - {'1': 'Text', '3': 2, '4': 1, '5': 9, '9': 0, '10': 'Text'}, + {'1': 'text', '3': 2, '4': 1, '5': 9, '9': 0, '10': 'text'}, ], '8': [ {'1': 'content'}, @@ -171,7 +171,7 @@ const UpResult$json = { /// Descriptor for `UpResult`. Decode as a `google.protobuf.DescriptorProto`. final $typed_data.Uint8List upResultDescriptor = $convert.base64Decode( - 'CghVcFJlc3VsdBIYCgdzdWNjZXNzGAEgASgIUgdzdWNjZXNzEhQKBFRleHQYAiABKAlIAFIEVG' + 'CghVcFJlc3VsdBIYCgdzdWNjZXNzGAEgASgIUgdzdWNjZXNzEhQKBHRleHQYAiABKAlIAFIEdG' 'V4dEIJCgdjb250ZW50'); @$core.Deprecated('Use deploymentDownRequestDescriptor instead') diff --git a/lib/src/nitric/proto/keyvalue/v1/keyvalue.pb.dart b/lib/src/nitric/proto/keyvalue/v1/keyvalue.pb.dart index 27ba267..8179c09 100644 --- a/lib/src/nitric/proto/keyvalue/v1/keyvalue.pb.dart +++ b/lib/src/nitric/proto/keyvalue/v1/keyvalue.pb.dart @@ -13,7 +13,7 @@ import 'dart:core' as $core; import 'package:protobuf/protobuf.dart' as $pb; -import '../../../../google/protobuf/struct.pb.dart' as $12; +import '../../../../google/protobuf/struct.pb.dart' as $13; /// Provides a Key/Value Store class Store extends $pb.GeneratedMessage { @@ -161,7 +161,7 @@ class ValueRef extends $pb.GeneratedMessage { class Value extends $pb.GeneratedMessage { factory Value({ ValueRef? ref, - $12.Struct? content, + $13.Struct? content, }) { final $result = create(); if (ref != null) { @@ -187,8 +187,8 @@ class Value extends $pb.GeneratedMessage { createEmptyInstance: create) ..aOM(1, _omitFieldNames ? '' : 'ref', subBuilder: ValueRef.create) - ..aOM<$12.Struct>(2, _omitFieldNames ? '' : 'content', - subBuilder: $12.Struct.create) + ..aOM<$13.Struct>(2, _omitFieldNames ? '' : 'content', + subBuilder: $13.Struct.create) ..hasRequiredFields = false; @$core.Deprecated('Using this can add significant overhead to your binary. ' @@ -229,9 +229,9 @@ class Value extends $pb.GeneratedMessage { /// The content (JSON object) @$pb.TagNumber(2) - $12.Struct get content => $_getN(1); + $13.Struct get content => $_getN(1); @$pb.TagNumber(2) - set content($12.Struct v) { + set content($13.Struct v) { setField(2, v); } @@ -240,7 +240,7 @@ class Value extends $pb.GeneratedMessage { @$pb.TagNumber(2) void clearContent() => clearField(2); @$pb.TagNumber(2) - $12.Struct ensureContent() => $_ensure(1); + $13.Struct ensureContent() => $_ensure(1); } class KeyValueGetRequest extends $pb.GeneratedMessage { @@ -377,7 +377,7 @@ class KeyValueGetResponse extends $pb.GeneratedMessage { class KeyValueSetRequest extends $pb.GeneratedMessage { factory KeyValueSetRequest({ ValueRef? ref, - $12.Struct? content, + $13.Struct? content, }) { final $result = create(); if (ref != null) { @@ -403,8 +403,8 @@ class KeyValueSetRequest extends $pb.GeneratedMessage { createEmptyInstance: create) ..aOM(1, _omitFieldNames ? '' : 'ref', subBuilder: ValueRef.create) - ..aOM<$12.Struct>(3, _omitFieldNames ? '' : 'content', - subBuilder: $12.Struct.create) + ..aOM<$13.Struct>(3, _omitFieldNames ? '' : 'content', + subBuilder: $13.Struct.create) ..hasRequiredFields = false; @$core.Deprecated('Using this can add significant overhead to your binary. ' @@ -447,9 +447,9 @@ class KeyValueSetRequest extends $pb.GeneratedMessage { /// The value content to store (JSON object) @$pb.TagNumber(3) - $12.Struct get content => $_getN(1); + $13.Struct get content => $_getN(1); @$pb.TagNumber(3) - set content($12.Struct v) { + set content($13.Struct v) { setField(3, v); } @@ -458,7 +458,7 @@ class KeyValueSetRequest extends $pb.GeneratedMessage { @$pb.TagNumber(3) void clearContent() => clearField(3); @$pb.TagNumber(3) - $12.Struct ensureContent() => $_ensure(1); + $13.Struct ensureContent() => $_ensure(1); } class KeyValueSetResponse extends $pb.GeneratedMessage { diff --git a/lib/src/nitric/proto/kvstore/v1/kvstore.pb.dart b/lib/src/nitric/proto/kvstore/v1/kvstore.pb.dart new file mode 100644 index 0000000..dc121de --- /dev/null +++ b/lib/src/nitric/proto/kvstore/v1/kvstore.pb.dart @@ -0,0 +1,776 @@ +// +// Generated code. Do not modify. +// source: nitric/proto/kvstore/v1/kvstore.proto +// +// @dart = 2.12 + +// ignore_for_file: annotate_overrides, camel_case_types, comment_references +// ignore_for_file: constant_identifier_names, library_prefixes +// ignore_for_file: non_constant_identifier_names, prefer_final_fields +// ignore_for_file: unnecessary_import, unnecessary_this, unused_import + +import 'dart:core' as $core; + +import 'package:protobuf/protobuf.dart' as $pb; + +import '../../../../google/protobuf/struct.pb.dart' as $13; + +/// Provides a Key/Value Store +class Store extends $pb.GeneratedMessage { + factory Store({ + $core.String? name, + }) { + final $result = create(); + if (name != null) { + $result.name = name; + } + return $result; + } + Store._() : super(); + factory Store.fromBuffer($core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + factory Store.fromJson($core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'Store', + package: const $pb.PackageName( + _omitMessageNames ? '' : 'nitric.proto.kvstore.v1'), + createEmptyInstance: create) + ..aOS(1, _omitFieldNames ? '' : 'name') + ..hasRequiredFields = false; + + @$core.Deprecated('Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') + Store clone() => Store()..mergeFromMessage(this); + @$core.Deprecated('Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + Store copyWith(void Function(Store) updates) => + super.copyWith((message) => updates(message as Store)) as Store; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static Store create() => Store._(); + Store createEmptyInstance() => create(); + static $pb.PbList createRepeated() => $pb.PbList(); + @$core.pragma('dart2js:noInline') + static Store getDefault() => + _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static Store? _defaultInstance; + + /// The store name + @$pb.TagNumber(1) + $core.String get name => $_getSZ(0); + @$pb.TagNumber(1) + set name($core.String v) { + $_setString(0, v); + } + + @$pb.TagNumber(1) + $core.bool hasName() => $_has(0); + @$pb.TagNumber(1) + void clearName() => clearField(1); +} + +/// ValueRef provides a unique identifier for a value +class ValueRef extends $pb.GeneratedMessage { + factory ValueRef({ + $core.String? store, + $core.String? key, + }) { + final $result = create(); + if (store != null) { + $result.store = store; + } + if (key != null) { + $result.key = key; + } + return $result; + } + ValueRef._() : super(); + factory ValueRef.fromBuffer($core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + factory ValueRef.fromJson($core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'ValueRef', + package: const $pb.PackageName( + _omitMessageNames ? '' : 'nitric.proto.kvstore.v1'), + createEmptyInstance: create) + ..aOS(1, _omitFieldNames ? '' : 'store') + ..aOS(2, _omitFieldNames ? '' : 'key') + ..hasRequiredFields = false; + + @$core.Deprecated('Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') + ValueRef clone() => ValueRef()..mergeFromMessage(this); + @$core.Deprecated('Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + ValueRef copyWith(void Function(ValueRef) updates) => + super.copyWith((message) => updates(message as ValueRef)) as ValueRef; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static ValueRef create() => ValueRef._(); + ValueRef createEmptyInstance() => create(); + static $pb.PbList createRepeated() => $pb.PbList(); + @$core.pragma('dart2js:noInline') + static ValueRef getDefault() => + _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static ValueRef? _defaultInstance; + + /// The key/value store name + @$pb.TagNumber(1) + $core.String get store => $_getSZ(0); + @$pb.TagNumber(1) + set store($core.String v) { + $_setString(0, v); + } + + @$pb.TagNumber(1) + $core.bool hasStore() => $_has(0); + @$pb.TagNumber(1) + void clearStore() => clearField(1); + + /// The item's unique key within the store + @$pb.TagNumber(2) + $core.String get key => $_getSZ(1); + @$pb.TagNumber(2) + set key($core.String v) { + $_setString(1, v); + } + + @$pb.TagNumber(2) + $core.bool hasKey() => $_has(1); + @$pb.TagNumber(2) + void clearKey() => clearField(2); +} + +/// Value provides a return value type +class Value extends $pb.GeneratedMessage { + factory Value({ + ValueRef? ref, + $13.Struct? content, + }) { + final $result = create(); + if (ref != null) { + $result.ref = ref; + } + if (content != null) { + $result.content = content; + } + return $result; + } + Value._() : super(); + factory Value.fromBuffer($core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + factory Value.fromJson($core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'Value', + package: const $pb.PackageName( + _omitMessageNames ? '' : 'nitric.proto.kvstore.v1'), + createEmptyInstance: create) + ..aOM(1, _omitFieldNames ? '' : 'ref', + subBuilder: ValueRef.create) + ..aOM<$13.Struct>(2, _omitFieldNames ? '' : 'content', + subBuilder: $13.Struct.create) + ..hasRequiredFields = false; + + @$core.Deprecated('Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') + Value clone() => Value()..mergeFromMessage(this); + @$core.Deprecated('Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + Value copyWith(void Function(Value) updates) => + super.copyWith((message) => updates(message as Value)) as Value; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static Value create() => Value._(); + Value createEmptyInstance() => create(); + static $pb.PbList createRepeated() => $pb.PbList(); + @$core.pragma('dart2js:noInline') + static Value getDefault() => + _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static Value? _defaultInstance; + + /// ValueRef of the key/value pair, which includes the store and key + @$pb.TagNumber(1) + ValueRef get ref => $_getN(0); + @$pb.TagNumber(1) + set ref(ValueRef v) { + setField(1, v); + } + + @$pb.TagNumber(1) + $core.bool hasRef() => $_has(0); + @$pb.TagNumber(1) + void clearRef() => clearField(1); + @$pb.TagNumber(1) + ValueRef ensureRef() => $_ensure(0); + + /// The content (JSON object) + @$pb.TagNumber(2) + $13.Struct get content => $_getN(1); + @$pb.TagNumber(2) + set content($13.Struct v) { + setField(2, v); + } + + @$pb.TagNumber(2) + $core.bool hasContent() => $_has(1); + @$pb.TagNumber(2) + void clearContent() => clearField(2); + @$pb.TagNumber(2) + $13.Struct ensureContent() => $_ensure(1); +} + +class KvStoreGetValueRequest extends $pb.GeneratedMessage { + factory KvStoreGetValueRequest({ + ValueRef? ref, + }) { + final $result = create(); + if (ref != null) { + $result.ref = ref; + } + return $result; + } + KvStoreGetValueRequest._() : super(); + factory KvStoreGetValueRequest.fromBuffer($core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + factory KvStoreGetValueRequest.fromJson($core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'KvStoreGetValueRequest', + package: const $pb.PackageName( + _omitMessageNames ? '' : 'nitric.proto.kvstore.v1'), + createEmptyInstance: create) + ..aOM(1, _omitFieldNames ? '' : 'ref', + subBuilder: ValueRef.create) + ..hasRequiredFields = false; + + @$core.Deprecated('Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') + KvStoreGetValueRequest clone() => + KvStoreGetValueRequest()..mergeFromMessage(this); + @$core.Deprecated('Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + KvStoreGetValueRequest copyWith( + void Function(KvStoreGetValueRequest) updates) => + super.copyWith((message) => updates(message as KvStoreGetValueRequest)) + as KvStoreGetValueRequest; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static KvStoreGetValueRequest create() => KvStoreGetValueRequest._(); + KvStoreGetValueRequest createEmptyInstance() => create(); + static $pb.PbList createRepeated() => + $pb.PbList(); + @$core.pragma('dart2js:noInline') + static KvStoreGetValueRequest getDefault() => _defaultInstance ??= + $pb.GeneratedMessage.$_defaultFor(create); + static KvStoreGetValueRequest? _defaultInstance; + + /// ValueRef of the key/value pair to get, which includes the store and key + @$pb.TagNumber(1) + ValueRef get ref => $_getN(0); + @$pb.TagNumber(1) + set ref(ValueRef v) { + setField(1, v); + } + + @$pb.TagNumber(1) + $core.bool hasRef() => $_has(0); + @$pb.TagNumber(1) + void clearRef() => clearField(1); + @$pb.TagNumber(1) + ValueRef ensureRef() => $_ensure(0); +} + +class KvStoreGetValueResponse extends $pb.GeneratedMessage { + factory KvStoreGetValueResponse({ + Value? value, + }) { + final $result = create(); + if (value != null) { + $result.value = value; + } + return $result; + } + KvStoreGetValueResponse._() : super(); + factory KvStoreGetValueResponse.fromBuffer($core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + factory KvStoreGetValueResponse.fromJson($core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'KvStoreGetValueResponse', + package: const $pb.PackageName( + _omitMessageNames ? '' : 'nitric.proto.kvstore.v1'), + createEmptyInstance: create) + ..aOM(1, _omitFieldNames ? '' : 'value', subBuilder: Value.create) + ..hasRequiredFields = false; + + @$core.Deprecated('Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') + KvStoreGetValueResponse clone() => + KvStoreGetValueResponse()..mergeFromMessage(this); + @$core.Deprecated('Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + KvStoreGetValueResponse copyWith( + void Function(KvStoreGetValueResponse) updates) => + super.copyWith((message) => updates(message as KvStoreGetValueResponse)) + as KvStoreGetValueResponse; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static KvStoreGetValueResponse create() => KvStoreGetValueResponse._(); + KvStoreGetValueResponse createEmptyInstance() => create(); + static $pb.PbList createRepeated() => + $pb.PbList(); + @$core.pragma('dart2js:noInline') + static KvStoreGetValueResponse getDefault() => _defaultInstance ??= + $pb.GeneratedMessage.$_defaultFor(create); + static KvStoreGetValueResponse? _defaultInstance; + + /// The retrieved value + @$pb.TagNumber(1) + Value get value => $_getN(0); + @$pb.TagNumber(1) + set value(Value v) { + setField(1, v); + } + + @$pb.TagNumber(1) + $core.bool hasValue() => $_has(0); + @$pb.TagNumber(1) + void clearValue() => clearField(1); + @$pb.TagNumber(1) + Value ensureValue() => $_ensure(0); +} + +class KvStoreSetValueRequest extends $pb.GeneratedMessage { + factory KvStoreSetValueRequest({ + ValueRef? ref, + $13.Struct? content, + }) { + final $result = create(); + if (ref != null) { + $result.ref = ref; + } + if (content != null) { + $result.content = content; + } + return $result; + } + KvStoreSetValueRequest._() : super(); + factory KvStoreSetValueRequest.fromBuffer($core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + factory KvStoreSetValueRequest.fromJson($core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'KvStoreSetValueRequest', + package: const $pb.PackageName( + _omitMessageNames ? '' : 'nitric.proto.kvstore.v1'), + createEmptyInstance: create) + ..aOM(1, _omitFieldNames ? '' : 'ref', + subBuilder: ValueRef.create) + ..aOM<$13.Struct>(3, _omitFieldNames ? '' : 'content', + subBuilder: $13.Struct.create) + ..hasRequiredFields = false; + + @$core.Deprecated('Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') + KvStoreSetValueRequest clone() => + KvStoreSetValueRequest()..mergeFromMessage(this); + @$core.Deprecated('Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + KvStoreSetValueRequest copyWith( + void Function(KvStoreSetValueRequest) updates) => + super.copyWith((message) => updates(message as KvStoreSetValueRequest)) + as KvStoreSetValueRequest; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static KvStoreSetValueRequest create() => KvStoreSetValueRequest._(); + KvStoreSetValueRequest createEmptyInstance() => create(); + static $pb.PbList createRepeated() => + $pb.PbList(); + @$core.pragma('dart2js:noInline') + static KvStoreSetValueRequest getDefault() => _defaultInstance ??= + $pb.GeneratedMessage.$_defaultFor(create); + static KvStoreSetValueRequest? _defaultInstance; + + /// ValueRef of the key/value pair to set, which includes the store and key + @$pb.TagNumber(1) + ValueRef get ref => $_getN(0); + @$pb.TagNumber(1) + set ref(ValueRef v) { + setField(1, v); + } + + @$pb.TagNumber(1) + $core.bool hasRef() => $_has(0); + @$pb.TagNumber(1) + void clearRef() => clearField(1); + @$pb.TagNumber(1) + ValueRef ensureRef() => $_ensure(0); + + /// The value content to store (JSON object) + @$pb.TagNumber(3) + $13.Struct get content => $_getN(1); + @$pb.TagNumber(3) + set content($13.Struct v) { + setField(3, v); + } + + @$pb.TagNumber(3) + $core.bool hasContent() => $_has(1); + @$pb.TagNumber(3) + void clearContent() => clearField(3); + @$pb.TagNumber(3) + $13.Struct ensureContent() => $_ensure(1); +} + +class KvStoreSetValueResponse extends $pb.GeneratedMessage { + factory KvStoreSetValueResponse() => create(); + KvStoreSetValueResponse._() : super(); + factory KvStoreSetValueResponse.fromBuffer($core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + factory KvStoreSetValueResponse.fromJson($core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'KvStoreSetValueResponse', + package: const $pb.PackageName( + _omitMessageNames ? '' : 'nitric.proto.kvstore.v1'), + createEmptyInstance: create) + ..hasRequiredFields = false; + + @$core.Deprecated('Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') + KvStoreSetValueResponse clone() => + KvStoreSetValueResponse()..mergeFromMessage(this); + @$core.Deprecated('Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + KvStoreSetValueResponse copyWith( + void Function(KvStoreSetValueResponse) updates) => + super.copyWith((message) => updates(message as KvStoreSetValueResponse)) + as KvStoreSetValueResponse; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static KvStoreSetValueResponse create() => KvStoreSetValueResponse._(); + KvStoreSetValueResponse createEmptyInstance() => create(); + static $pb.PbList createRepeated() => + $pb.PbList(); + @$core.pragma('dart2js:noInline') + static KvStoreSetValueResponse getDefault() => _defaultInstance ??= + $pb.GeneratedMessage.$_defaultFor(create); + static KvStoreSetValueResponse? _defaultInstance; +} + +class KvStoreDeleteKeyRequest extends $pb.GeneratedMessage { + factory KvStoreDeleteKeyRequest({ + ValueRef? ref, + }) { + final $result = create(); + if (ref != null) { + $result.ref = ref; + } + return $result; + } + KvStoreDeleteKeyRequest._() : super(); + factory KvStoreDeleteKeyRequest.fromBuffer($core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + factory KvStoreDeleteKeyRequest.fromJson($core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'KvStoreDeleteKeyRequest', + package: const $pb.PackageName( + _omitMessageNames ? '' : 'nitric.proto.kvstore.v1'), + createEmptyInstance: create) + ..aOM(1, _omitFieldNames ? '' : 'ref', + subBuilder: ValueRef.create) + ..hasRequiredFields = false; + + @$core.Deprecated('Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') + KvStoreDeleteKeyRequest clone() => + KvStoreDeleteKeyRequest()..mergeFromMessage(this); + @$core.Deprecated('Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + KvStoreDeleteKeyRequest copyWith( + void Function(KvStoreDeleteKeyRequest) updates) => + super.copyWith((message) => updates(message as KvStoreDeleteKeyRequest)) + as KvStoreDeleteKeyRequest; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static KvStoreDeleteKeyRequest create() => KvStoreDeleteKeyRequest._(); + KvStoreDeleteKeyRequest createEmptyInstance() => create(); + static $pb.PbList createRepeated() => + $pb.PbList(); + @$core.pragma('dart2js:noInline') + static KvStoreDeleteKeyRequest getDefault() => _defaultInstance ??= + $pb.GeneratedMessage.$_defaultFor(create); + static KvStoreDeleteKeyRequest? _defaultInstance; + + /// ValueRef of the key/value pair to delete, which includes the store and key + @$pb.TagNumber(1) + ValueRef get ref => $_getN(0); + @$pb.TagNumber(1) + set ref(ValueRef v) { + setField(1, v); + } + + @$pb.TagNumber(1) + $core.bool hasRef() => $_has(0); + @$pb.TagNumber(1) + void clearRef() => clearField(1); + @$pb.TagNumber(1) + ValueRef ensureRef() => $_ensure(0); +} + +class KvStoreDeleteKeyResponse extends $pb.GeneratedMessage { + factory KvStoreDeleteKeyResponse() => create(); + KvStoreDeleteKeyResponse._() : super(); + factory KvStoreDeleteKeyResponse.fromBuffer($core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + factory KvStoreDeleteKeyResponse.fromJson($core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'KvStoreDeleteKeyResponse', + package: const $pb.PackageName( + _omitMessageNames ? '' : 'nitric.proto.kvstore.v1'), + createEmptyInstance: create) + ..hasRequiredFields = false; + + @$core.Deprecated('Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') + KvStoreDeleteKeyResponse clone() => + KvStoreDeleteKeyResponse()..mergeFromMessage(this); + @$core.Deprecated('Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + KvStoreDeleteKeyResponse copyWith( + void Function(KvStoreDeleteKeyResponse) updates) => + super.copyWith((message) => updates(message as KvStoreDeleteKeyResponse)) + as KvStoreDeleteKeyResponse; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static KvStoreDeleteKeyResponse create() => KvStoreDeleteKeyResponse._(); + KvStoreDeleteKeyResponse createEmptyInstance() => create(); + static $pb.PbList createRepeated() => + $pb.PbList(); + @$core.pragma('dart2js:noInline') + static KvStoreDeleteKeyResponse getDefault() => _defaultInstance ??= + $pb.GeneratedMessage.$_defaultFor(create); + static KvStoreDeleteKeyResponse? _defaultInstance; +} + +class KvStoreScanKeysRequest extends $pb.GeneratedMessage { + factory KvStoreScanKeysRequest({ + Store? store, + $core.String? prefix, + }) { + final $result = create(); + if (store != null) { + $result.store = store; + } + if (prefix != null) { + $result.prefix = prefix; + } + return $result; + } + KvStoreScanKeysRequest._() : super(); + factory KvStoreScanKeysRequest.fromBuffer($core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + factory KvStoreScanKeysRequest.fromJson($core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'KvStoreScanKeysRequest', + package: const $pb.PackageName( + _omitMessageNames ? '' : 'nitric.proto.kvstore.v1'), + createEmptyInstance: create) + ..aOM(1, _omitFieldNames ? '' : 'store', subBuilder: Store.create) + ..aOS(2, _omitFieldNames ? '' : 'prefix') + ..hasRequiredFields = false; + + @$core.Deprecated('Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') + KvStoreScanKeysRequest clone() => + KvStoreScanKeysRequest()..mergeFromMessage(this); + @$core.Deprecated('Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + KvStoreScanKeysRequest copyWith( + void Function(KvStoreScanKeysRequest) updates) => + super.copyWith((message) => updates(message as KvStoreScanKeysRequest)) + as KvStoreScanKeysRequest; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static KvStoreScanKeysRequest create() => KvStoreScanKeysRequest._(); + KvStoreScanKeysRequest createEmptyInstance() => create(); + static $pb.PbList createRepeated() => + $pb.PbList(); + @$core.pragma('dart2js:noInline') + static KvStoreScanKeysRequest getDefault() => _defaultInstance ??= + $pb.GeneratedMessage.$_defaultFor(create); + static KvStoreScanKeysRequest? _defaultInstance; + + /// The store to iterate over + @$pb.TagNumber(1) + Store get store => $_getN(0); + @$pb.TagNumber(1) + set store(Store v) { + setField(1, v); + } + + @$pb.TagNumber(1) + $core.bool hasStore() => $_has(0); + @$pb.TagNumber(1) + void clearStore() => clearField(1); + @$pb.TagNumber(1) + Store ensureStore() => $_ensure(0); + + /// The prefix to filter keys by + @$pb.TagNumber(2) + $core.String get prefix => $_getSZ(1); + @$pb.TagNumber(2) + set prefix($core.String v) { + $_setString(1, v); + } + + @$pb.TagNumber(2) + $core.bool hasPrefix() => $_has(1); + @$pb.TagNumber(2) + void clearPrefix() => clearField(2); +} + +class KvStoreScanKeysResponse extends $pb.GeneratedMessage { + factory KvStoreScanKeysResponse({ + $core.String? key, + }) { + final $result = create(); + if (key != null) { + $result.key = key; + } + return $result; + } + KvStoreScanKeysResponse._() : super(); + factory KvStoreScanKeysResponse.fromBuffer($core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + factory KvStoreScanKeysResponse.fromJson($core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'KvStoreScanKeysResponse', + package: const $pb.PackageName( + _omitMessageNames ? '' : 'nitric.proto.kvstore.v1'), + createEmptyInstance: create) + ..aOS(1, _omitFieldNames ? '' : 'key') + ..hasRequiredFields = false; + + @$core.Deprecated('Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') + KvStoreScanKeysResponse clone() => + KvStoreScanKeysResponse()..mergeFromMessage(this); + @$core.Deprecated('Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + KvStoreScanKeysResponse copyWith( + void Function(KvStoreScanKeysResponse) updates) => + super.copyWith((message) => updates(message as KvStoreScanKeysResponse)) + as KvStoreScanKeysResponse; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static KvStoreScanKeysResponse create() => KvStoreScanKeysResponse._(); + KvStoreScanKeysResponse createEmptyInstance() => create(); + static $pb.PbList createRepeated() => + $pb.PbList(); + @$core.pragma('dart2js:noInline') + static KvStoreScanKeysResponse getDefault() => _defaultInstance ??= + $pb.GeneratedMessage.$_defaultFor(create); + static KvStoreScanKeysResponse? _defaultInstance; + + /// The key of the key/value pair + @$pb.TagNumber(1) + $core.String get key => $_getSZ(0); + @$pb.TagNumber(1) + set key($core.String v) { + $_setString(0, v); + } + + @$pb.TagNumber(1) + $core.bool hasKey() => $_has(0); + @$pb.TagNumber(1) + void clearKey() => clearField(1); +} + +const _omitFieldNames = $core.bool.fromEnvironment('protobuf.omit_field_names'); +const _omitMessageNames = + $core.bool.fromEnvironment('protobuf.omit_message_names'); diff --git a/lib/src/nitric/proto/kvstore/v1/kvstore.pbenum.dart b/lib/src/nitric/proto/kvstore/v1/kvstore.pbenum.dart new file mode 100644 index 0000000..84243b6 --- /dev/null +++ b/lib/src/nitric/proto/kvstore/v1/kvstore.pbenum.dart @@ -0,0 +1,10 @@ +// +// Generated code. Do not modify. +// source: nitric/proto/kvstore/v1/kvstore.proto +// +// @dart = 2.12 + +// ignore_for_file: annotate_overrides, camel_case_types, comment_references +// ignore_for_file: constant_identifier_names, library_prefixes +// ignore_for_file: non_constant_identifier_names, prefer_final_fields +// ignore_for_file: unnecessary_import, unnecessary_this, unused_import diff --git a/lib/src/nitric/proto/kvstore/v1/kvstore.pbgrpc.dart b/lib/src/nitric/proto/kvstore/v1/kvstore.pbgrpc.dart new file mode 100644 index 0000000..c5bd4c9 --- /dev/null +++ b/lib/src/nitric/proto/kvstore/v1/kvstore.pbgrpc.dart @@ -0,0 +1,153 @@ +// +// Generated code. Do not modify. +// source: nitric/proto/kvstore/v1/kvstore.proto +// +// @dart = 2.12 + +// ignore_for_file: annotate_overrides, camel_case_types, comment_references +// ignore_for_file: constant_identifier_names, library_prefixes +// ignore_for_file: non_constant_identifier_names, prefer_final_fields +// ignore_for_file: unnecessary_import, unnecessary_this, unused_import + +import 'dart:async' as $async; +import 'dart:core' as $core; + +import 'package:grpc/service_api.dart' as $grpc; +import 'package:protobuf/protobuf.dart' as $pb; + +import 'kvstore.pb.dart' as $6; + +export 'kvstore.pb.dart'; + +@$pb.GrpcServiceName('nitric.proto.kvstore.v1.KvStore') +class KvStoreClient extends $grpc.Client { + static final _$getValue = + $grpc.ClientMethod<$6.KvStoreGetValueRequest, $6.KvStoreGetValueResponse>( + '/nitric.proto.kvstore.v1.KvStore/GetValue', + ($6.KvStoreGetValueRequest value) => value.writeToBuffer(), + ($core.List<$core.int> value) => + $6.KvStoreGetValueResponse.fromBuffer(value)); + static final _$setValue = + $grpc.ClientMethod<$6.KvStoreSetValueRequest, $6.KvStoreSetValueResponse>( + '/nitric.proto.kvstore.v1.KvStore/SetValue', + ($6.KvStoreSetValueRequest value) => value.writeToBuffer(), + ($core.List<$core.int> value) => + $6.KvStoreSetValueResponse.fromBuffer(value)); + static final _$deleteKey = $grpc.ClientMethod<$6.KvStoreDeleteKeyRequest, + $6.KvStoreDeleteKeyResponse>( + '/nitric.proto.kvstore.v1.KvStore/DeleteKey', + ($6.KvStoreDeleteKeyRequest value) => value.writeToBuffer(), + ($core.List<$core.int> value) => + $6.KvStoreDeleteKeyResponse.fromBuffer(value)); + static final _$scanKeys = + $grpc.ClientMethod<$6.KvStoreScanKeysRequest, $6.KvStoreScanKeysResponse>( + '/nitric.proto.kvstore.v1.KvStore/ScanKeys', + ($6.KvStoreScanKeysRequest value) => value.writeToBuffer(), + ($core.List<$core.int> value) => + $6.KvStoreScanKeysResponse.fromBuffer(value)); + + KvStoreClient($grpc.ClientChannel channel, + {$grpc.CallOptions? options, + $core.Iterable<$grpc.ClientInterceptor>? interceptors}) + : super(channel, options: options, interceptors: interceptors); + + $grpc.ResponseFuture<$6.KvStoreGetValueResponse> getValue( + $6.KvStoreGetValueRequest request, + {$grpc.CallOptions? options}) { + return $createUnaryCall(_$getValue, request, options: options); + } + + $grpc.ResponseFuture<$6.KvStoreSetValueResponse> setValue( + $6.KvStoreSetValueRequest request, + {$grpc.CallOptions? options}) { + return $createUnaryCall(_$setValue, request, options: options); + } + + $grpc.ResponseFuture<$6.KvStoreDeleteKeyResponse> deleteKey( + $6.KvStoreDeleteKeyRequest request, + {$grpc.CallOptions? options}) { + return $createUnaryCall(_$deleteKey, request, options: options); + } + + $grpc.ResponseStream<$6.KvStoreScanKeysResponse> scanKeys( + $6.KvStoreScanKeysRequest request, + {$grpc.CallOptions? options}) { + return $createStreamingCall( + _$scanKeys, $async.Stream.fromIterable([request]), + options: options); + } +} + +@$pb.GrpcServiceName('nitric.proto.kvstore.v1.KvStore') +abstract class KvStoreServiceBase extends $grpc.Service { + $core.String get $name => 'nitric.proto.kvstore.v1.KvStore'; + + KvStoreServiceBase() { + $addMethod($grpc.ServiceMethod<$6.KvStoreGetValueRequest, + $6.KvStoreGetValueResponse>( + 'GetValue', + getValue_Pre, + false, + false, + ($core.List<$core.int> value) => + $6.KvStoreGetValueRequest.fromBuffer(value), + ($6.KvStoreGetValueResponse value) => value.writeToBuffer())); + $addMethod($grpc.ServiceMethod<$6.KvStoreSetValueRequest, + $6.KvStoreSetValueResponse>( + 'SetValue', + setValue_Pre, + false, + false, + ($core.List<$core.int> value) => + $6.KvStoreSetValueRequest.fromBuffer(value), + ($6.KvStoreSetValueResponse value) => value.writeToBuffer())); + $addMethod($grpc.ServiceMethod<$6.KvStoreDeleteKeyRequest, + $6.KvStoreDeleteKeyResponse>( + 'DeleteKey', + deleteKey_Pre, + false, + false, + ($core.List<$core.int> value) => + $6.KvStoreDeleteKeyRequest.fromBuffer(value), + ($6.KvStoreDeleteKeyResponse value) => value.writeToBuffer())); + $addMethod($grpc.ServiceMethod<$6.KvStoreScanKeysRequest, + $6.KvStoreScanKeysResponse>( + 'ScanKeys', + scanKeys_Pre, + false, + true, + ($core.List<$core.int> value) => + $6.KvStoreScanKeysRequest.fromBuffer(value), + ($6.KvStoreScanKeysResponse value) => value.writeToBuffer())); + } + + $async.Future<$6.KvStoreGetValueResponse> getValue_Pre($grpc.ServiceCall call, + $async.Future<$6.KvStoreGetValueRequest> request) async { + return getValue(call, await request); + } + + $async.Future<$6.KvStoreSetValueResponse> setValue_Pre($grpc.ServiceCall call, + $async.Future<$6.KvStoreSetValueRequest> request) async { + return setValue(call, await request); + } + + $async.Future<$6.KvStoreDeleteKeyResponse> deleteKey_Pre( + $grpc.ServiceCall call, + $async.Future<$6.KvStoreDeleteKeyRequest> request) async { + return deleteKey(call, await request); + } + + $async.Stream<$6.KvStoreScanKeysResponse> scanKeys_Pre($grpc.ServiceCall call, + $async.Future<$6.KvStoreScanKeysRequest> request) async* { + yield* scanKeys(call, await request); + } + + $async.Future<$6.KvStoreGetValueResponse> getValue( + $grpc.ServiceCall call, $6.KvStoreGetValueRequest request); + $async.Future<$6.KvStoreSetValueResponse> setValue( + $grpc.ServiceCall call, $6.KvStoreSetValueRequest request); + $async.Future<$6.KvStoreDeleteKeyResponse> deleteKey( + $grpc.ServiceCall call, $6.KvStoreDeleteKeyRequest request); + $async.Stream<$6.KvStoreScanKeysResponse> scanKeys( + $grpc.ServiceCall call, $6.KvStoreScanKeysRequest request); +} diff --git a/lib/src/nitric/proto/kvstore/v1/kvstore.pbjson.dart b/lib/src/nitric/proto/kvstore/v1/kvstore.pbjson.dart new file mode 100644 index 0000000..4fc2839 --- /dev/null +++ b/lib/src/nitric/proto/kvstore/v1/kvstore.pbjson.dart @@ -0,0 +1,212 @@ +// +// Generated code. Do not modify. +// source: nitric/proto/kvstore/v1/kvstore.proto +// +// @dart = 2.12 + +// ignore_for_file: annotate_overrides, camel_case_types, comment_references +// ignore_for_file: constant_identifier_names, library_prefixes +// ignore_for_file: non_constant_identifier_names, prefer_final_fields +// ignore_for_file: unnecessary_import, unnecessary_this, unused_import + +import 'dart:convert' as $convert; +import 'dart:core' as $core; +import 'dart:typed_data' as $typed_data; + +@$core.Deprecated('Use storeDescriptor instead') +const Store$json = { + '1': 'Store', + '2': [ + {'1': 'name', '3': 1, '4': 1, '5': 9, '10': 'name'}, + ], +}; + +/// Descriptor for `Store`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List storeDescriptor = + $convert.base64Decode('CgVTdG9yZRISCgRuYW1lGAEgASgJUgRuYW1l'); + +@$core.Deprecated('Use valueRefDescriptor instead') +const ValueRef$json = { + '1': 'ValueRef', + '2': [ + {'1': 'store', '3': 1, '4': 1, '5': 9, '10': 'store'}, + {'1': 'key', '3': 2, '4': 1, '5': 9, '10': 'key'}, + ], +}; + +/// Descriptor for `ValueRef`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List valueRefDescriptor = $convert.base64Decode( + 'CghWYWx1ZVJlZhIUCgVzdG9yZRgBIAEoCVIFc3RvcmUSEAoDa2V5GAIgASgJUgNrZXk='); + +@$core.Deprecated('Use valueDescriptor instead') +const Value$json = { + '1': 'Value', + '2': [ + { + '1': 'ref', + '3': 1, + '4': 1, + '5': 11, + '6': '.nitric.proto.kvstore.v1.ValueRef', + '10': 'ref' + }, + { + '1': 'content', + '3': 2, + '4': 1, + '5': 11, + '6': '.google.protobuf.Struct', + '10': 'content' + }, + ], +}; + +/// Descriptor for `Value`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List valueDescriptor = $convert.base64Decode( + 'CgVWYWx1ZRIzCgNyZWYYASABKAsyIS5uaXRyaWMucHJvdG8ua3ZzdG9yZS52MS5WYWx1ZVJlZl' + 'IDcmVmEjEKB2NvbnRlbnQYAiABKAsyFy5nb29nbGUucHJvdG9idWYuU3RydWN0Ugdjb250ZW50'); + +@$core.Deprecated('Use kvStoreGetValueRequestDescriptor instead') +const KvStoreGetValueRequest$json = { + '1': 'KvStoreGetValueRequest', + '2': [ + { + '1': 'ref', + '3': 1, + '4': 1, + '5': 11, + '6': '.nitric.proto.kvstore.v1.ValueRef', + '10': 'ref' + }, + ], +}; + +/// Descriptor for `KvStoreGetValueRequest`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List kvStoreGetValueRequestDescriptor = + $convert.base64Decode( + 'ChZLdlN0b3JlR2V0VmFsdWVSZXF1ZXN0EjMKA3JlZhgBIAEoCzIhLm5pdHJpYy5wcm90by5rdn' + 'N0b3JlLnYxLlZhbHVlUmVmUgNyZWY='); + +@$core.Deprecated('Use kvStoreGetValueResponseDescriptor instead') +const KvStoreGetValueResponse$json = { + '1': 'KvStoreGetValueResponse', + '2': [ + { + '1': 'value', + '3': 1, + '4': 1, + '5': 11, + '6': '.nitric.proto.kvstore.v1.Value', + '10': 'value' + }, + ], +}; + +/// Descriptor for `KvStoreGetValueResponse`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List kvStoreGetValueResponseDescriptor = + $convert.base64Decode( + 'ChdLdlN0b3JlR2V0VmFsdWVSZXNwb25zZRI0CgV2YWx1ZRgBIAEoCzIeLm5pdHJpYy5wcm90by' + '5rdnN0b3JlLnYxLlZhbHVlUgV2YWx1ZQ=='); + +@$core.Deprecated('Use kvStoreSetValueRequestDescriptor instead') +const KvStoreSetValueRequest$json = { + '1': 'KvStoreSetValueRequest', + '2': [ + { + '1': 'ref', + '3': 1, + '4': 1, + '5': 11, + '6': '.nitric.proto.kvstore.v1.ValueRef', + '10': 'ref' + }, + { + '1': 'content', + '3': 3, + '4': 1, + '5': 11, + '6': '.google.protobuf.Struct', + '10': 'content' + }, + ], +}; + +/// Descriptor for `KvStoreSetValueRequest`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List kvStoreSetValueRequestDescriptor = $convert.base64Decode( + 'ChZLdlN0b3JlU2V0VmFsdWVSZXF1ZXN0EjMKA3JlZhgBIAEoCzIhLm5pdHJpYy5wcm90by5rdn' + 'N0b3JlLnYxLlZhbHVlUmVmUgNyZWYSMQoHY29udGVudBgDIAEoCzIXLmdvb2dsZS5wcm90b2J1' + 'Zi5TdHJ1Y3RSB2NvbnRlbnQ='); + +@$core.Deprecated('Use kvStoreSetValueResponseDescriptor instead') +const KvStoreSetValueResponse$json = { + '1': 'KvStoreSetValueResponse', +}; + +/// Descriptor for `KvStoreSetValueResponse`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List kvStoreSetValueResponseDescriptor = + $convert.base64Decode('ChdLdlN0b3JlU2V0VmFsdWVSZXNwb25zZQ=='); + +@$core.Deprecated('Use kvStoreDeleteKeyRequestDescriptor instead') +const KvStoreDeleteKeyRequest$json = { + '1': 'KvStoreDeleteKeyRequest', + '2': [ + { + '1': 'ref', + '3': 1, + '4': 1, + '5': 11, + '6': '.nitric.proto.kvstore.v1.ValueRef', + '10': 'ref' + }, + ], +}; + +/// Descriptor for `KvStoreDeleteKeyRequest`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List kvStoreDeleteKeyRequestDescriptor = + $convert.base64Decode( + 'ChdLdlN0b3JlRGVsZXRlS2V5UmVxdWVzdBIzCgNyZWYYASABKAsyIS5uaXRyaWMucHJvdG8ua3' + 'ZzdG9yZS52MS5WYWx1ZVJlZlIDcmVm'); + +@$core.Deprecated('Use kvStoreDeleteKeyResponseDescriptor instead') +const KvStoreDeleteKeyResponse$json = { + '1': 'KvStoreDeleteKeyResponse', +}; + +/// Descriptor for `KvStoreDeleteKeyResponse`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List kvStoreDeleteKeyResponseDescriptor = + $convert.base64Decode('ChhLdlN0b3JlRGVsZXRlS2V5UmVzcG9uc2U='); + +@$core.Deprecated('Use kvStoreScanKeysRequestDescriptor instead') +const KvStoreScanKeysRequest$json = { + '1': 'KvStoreScanKeysRequest', + '2': [ + { + '1': 'store', + '3': 1, + '4': 1, + '5': 11, + '6': '.nitric.proto.kvstore.v1.Store', + '10': 'store' + }, + {'1': 'prefix', '3': 2, '4': 1, '5': 9, '10': 'prefix'}, + ], +}; + +/// Descriptor for `KvStoreScanKeysRequest`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List kvStoreScanKeysRequestDescriptor = + $convert.base64Decode( + 'ChZLdlN0b3JlU2NhbktleXNSZXF1ZXN0EjQKBXN0b3JlGAEgASgLMh4ubml0cmljLnByb3RvLm' + 't2c3RvcmUudjEuU3RvcmVSBXN0b3JlEhYKBnByZWZpeBgCIAEoCVIGcHJlZml4'); + +@$core.Deprecated('Use kvStoreScanKeysResponseDescriptor instead') +const KvStoreScanKeysResponse$json = { + '1': 'KvStoreScanKeysResponse', + '2': [ + {'1': 'key', '3': 1, '4': 1, '5': 9, '10': 'key'}, + ], +}; + +/// Descriptor for `KvStoreScanKeysResponse`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List kvStoreScanKeysResponseDescriptor = + $convert.base64Decode( + 'ChdLdlN0b3JlU2NhbktleXNSZXNwb25zZRIQCgNrZXkYASABKAlSA2tleQ=='); diff --git a/lib/src/nitric/proto/queues/v1/queues.pb.dart b/lib/src/nitric/proto/queues/v1/queues.pb.dart index 3e7b50c..fd7b2a2 100644 --- a/lib/src/nitric/proto/queues/v1/queues.pb.dart +++ b/lib/src/nitric/proto/queues/v1/queues.pb.dart @@ -13,7 +13,7 @@ import 'dart:core' as $core; import 'package:protobuf/protobuf.dart' as $pb; -import '../../../../google/protobuf/struct.pb.dart' as $12; +import '../../../../google/protobuf/struct.pb.dart' as $13; class QueueEnqueueRequest extends $pb.GeneratedMessage { factory QueueEnqueueRequest({ @@ -417,7 +417,7 @@ enum QueueMessage_Content { structPayload, notSet } /// An message to be sent to a queue. class QueueMessage extends $pb.GeneratedMessage { factory QueueMessage({ - $12.Struct? structPayload, + $13.Struct? structPayload, }) { final $result = create(); if (structPayload != null) { @@ -444,8 +444,8 @@ class QueueMessage extends $pb.GeneratedMessage { _omitMessageNames ? '' : 'nitric.proto.queues.v1'), createEmptyInstance: create) ..oo(0, [1]) - ..aOM<$12.Struct>(1, _omitFieldNames ? '' : 'structPayload', - subBuilder: $12.Struct.create) + ..aOM<$13.Struct>(1, _omitFieldNames ? '' : 'structPayload', + subBuilder: $13.Struct.create) ..hasRequiredFields = false; @$core.Deprecated('Using this can add significant overhead to your binary. ' @@ -476,9 +476,9 @@ class QueueMessage extends $pb.GeneratedMessage { void clearContent() => clearField($_whichOneof(0)); @$pb.TagNumber(1) - $12.Struct get structPayload => $_getN(0); + $13.Struct get structPayload => $_getN(0); @$pb.TagNumber(1) - set structPayload($12.Struct v) { + set structPayload($13.Struct v) { setField(1, v); } @@ -487,7 +487,7 @@ class QueueMessage extends $pb.GeneratedMessage { @$pb.TagNumber(1) void clearStructPayload() => clearField(1); @$pb.TagNumber(1) - $12.Struct ensureStructPayload() => $_ensure(0); + $13.Struct ensureStructPayload() => $_ensure(0); } class DequeuedMessage extends $pb.GeneratedMessage { diff --git a/lib/src/nitric/proto/queues/v1/queues.pbgrpc.dart b/lib/src/nitric/proto/queues/v1/queues.pbgrpc.dart index e45007f..576c1c9 100644 --- a/lib/src/nitric/proto/queues/v1/queues.pbgrpc.dart +++ b/lib/src/nitric/proto/queues/v1/queues.pbgrpc.dart @@ -15,50 +15,50 @@ import 'dart:core' as $core; import 'package:grpc/service_api.dart' as $grpc; import 'package:protobuf/protobuf.dart' as $pb; -import 'queues.pb.dart' as $6; +import 'queues.pb.dart' as $7; export 'queues.pb.dart'; @$pb.GrpcServiceName('nitric.proto.queues.v1.Queues') class QueuesClient extends $grpc.Client { static final _$enqueue = - $grpc.ClientMethod<$6.QueueEnqueueRequest, $6.QueueEnqueueResponse>( + $grpc.ClientMethod<$7.QueueEnqueueRequest, $7.QueueEnqueueResponse>( '/nitric.proto.queues.v1.Queues/Enqueue', - ($6.QueueEnqueueRequest value) => value.writeToBuffer(), + ($7.QueueEnqueueRequest value) => value.writeToBuffer(), ($core.List<$core.int> value) => - $6.QueueEnqueueResponse.fromBuffer(value)); + $7.QueueEnqueueResponse.fromBuffer(value)); static final _$dequeue = - $grpc.ClientMethod<$6.QueueDequeueRequest, $6.QueueDequeueResponse>( + $grpc.ClientMethod<$7.QueueDequeueRequest, $7.QueueDequeueResponse>( '/nitric.proto.queues.v1.Queues/Dequeue', - ($6.QueueDequeueRequest value) => value.writeToBuffer(), + ($7.QueueDequeueRequest value) => value.writeToBuffer(), ($core.List<$core.int> value) => - $6.QueueDequeueResponse.fromBuffer(value)); + $7.QueueDequeueResponse.fromBuffer(value)); static final _$complete = - $grpc.ClientMethod<$6.QueueCompleteRequest, $6.QueueCompleteResponse>( + $grpc.ClientMethod<$7.QueueCompleteRequest, $7.QueueCompleteResponse>( '/nitric.proto.queues.v1.Queues/Complete', - ($6.QueueCompleteRequest value) => value.writeToBuffer(), + ($7.QueueCompleteRequest value) => value.writeToBuffer(), ($core.List<$core.int> value) => - $6.QueueCompleteResponse.fromBuffer(value)); + $7.QueueCompleteResponse.fromBuffer(value)); QueuesClient($grpc.ClientChannel channel, {$grpc.CallOptions? options, $core.Iterable<$grpc.ClientInterceptor>? interceptors}) : super(channel, options: options, interceptors: interceptors); - $grpc.ResponseFuture<$6.QueueEnqueueResponse> enqueue( - $6.QueueEnqueueRequest request, + $grpc.ResponseFuture<$7.QueueEnqueueResponse> enqueue( + $7.QueueEnqueueRequest request, {$grpc.CallOptions? options}) { return $createUnaryCall(_$enqueue, request, options: options); } - $grpc.ResponseFuture<$6.QueueDequeueResponse> dequeue( - $6.QueueDequeueRequest request, + $grpc.ResponseFuture<$7.QueueDequeueResponse> dequeue( + $7.QueueDequeueRequest request, {$grpc.CallOptions? options}) { return $createUnaryCall(_$dequeue, request, options: options); } - $grpc.ResponseFuture<$6.QueueCompleteResponse> complete( - $6.QueueCompleteRequest request, + $grpc.ResponseFuture<$7.QueueCompleteResponse> complete( + $7.QueueCompleteRequest request, {$grpc.CallOptions? options}) { return $createUnaryCall(_$complete, request, options: options); } @@ -70,53 +70,53 @@ abstract class QueuesServiceBase extends $grpc.Service { QueuesServiceBase() { $addMethod( - $grpc.ServiceMethod<$6.QueueEnqueueRequest, $6.QueueEnqueueResponse>( + $grpc.ServiceMethod<$7.QueueEnqueueRequest, $7.QueueEnqueueResponse>( 'Enqueue', enqueue_Pre, false, false, ($core.List<$core.int> value) => - $6.QueueEnqueueRequest.fromBuffer(value), - ($6.QueueEnqueueResponse value) => value.writeToBuffer())); + $7.QueueEnqueueRequest.fromBuffer(value), + ($7.QueueEnqueueResponse value) => value.writeToBuffer())); $addMethod( - $grpc.ServiceMethod<$6.QueueDequeueRequest, $6.QueueDequeueResponse>( + $grpc.ServiceMethod<$7.QueueDequeueRequest, $7.QueueDequeueResponse>( 'Dequeue', dequeue_Pre, false, false, ($core.List<$core.int> value) => - $6.QueueDequeueRequest.fromBuffer(value), - ($6.QueueDequeueResponse value) => value.writeToBuffer())); + $7.QueueDequeueRequest.fromBuffer(value), + ($7.QueueDequeueResponse value) => value.writeToBuffer())); $addMethod( - $grpc.ServiceMethod<$6.QueueCompleteRequest, $6.QueueCompleteResponse>( + $grpc.ServiceMethod<$7.QueueCompleteRequest, $7.QueueCompleteResponse>( 'Complete', complete_Pre, false, false, ($core.List<$core.int> value) => - $6.QueueCompleteRequest.fromBuffer(value), - ($6.QueueCompleteResponse value) => value.writeToBuffer())); + $7.QueueCompleteRequest.fromBuffer(value), + ($7.QueueCompleteResponse value) => value.writeToBuffer())); } - $async.Future<$6.QueueEnqueueResponse> enqueue_Pre($grpc.ServiceCall call, - $async.Future<$6.QueueEnqueueRequest> request) async { + $async.Future<$7.QueueEnqueueResponse> enqueue_Pre($grpc.ServiceCall call, + $async.Future<$7.QueueEnqueueRequest> request) async { return enqueue(call, await request); } - $async.Future<$6.QueueDequeueResponse> dequeue_Pre($grpc.ServiceCall call, - $async.Future<$6.QueueDequeueRequest> request) async { + $async.Future<$7.QueueDequeueResponse> dequeue_Pre($grpc.ServiceCall call, + $async.Future<$7.QueueDequeueRequest> request) async { return dequeue(call, await request); } - $async.Future<$6.QueueCompleteResponse> complete_Pre($grpc.ServiceCall call, - $async.Future<$6.QueueCompleteRequest> request) async { + $async.Future<$7.QueueCompleteResponse> complete_Pre($grpc.ServiceCall call, + $async.Future<$7.QueueCompleteRequest> request) async { return complete(call, await request); } - $async.Future<$6.QueueEnqueueResponse> enqueue( - $grpc.ServiceCall call, $6.QueueEnqueueRequest request); - $async.Future<$6.QueueDequeueResponse> dequeue( - $grpc.ServiceCall call, $6.QueueDequeueRequest request); - $async.Future<$6.QueueCompleteResponse> complete( - $grpc.ServiceCall call, $6.QueueCompleteRequest request); + $async.Future<$7.QueueEnqueueResponse> enqueue( + $grpc.ServiceCall call, $7.QueueEnqueueRequest request); + $async.Future<$7.QueueDequeueResponse> dequeue( + $grpc.ServiceCall call, $7.QueueDequeueRequest request); + $async.Future<$7.QueueCompleteResponse> complete( + $grpc.ServiceCall call, $7.QueueCompleteRequest request); } diff --git a/lib/src/nitric/proto/schedules/v1/schedules.pbgrpc.dart b/lib/src/nitric/proto/schedules/v1/schedules.pbgrpc.dart index a7c01c3..520acf6 100644 --- a/lib/src/nitric/proto/schedules/v1/schedules.pbgrpc.dart +++ b/lib/src/nitric/proto/schedules/v1/schedules.pbgrpc.dart @@ -15,25 +15,25 @@ import 'dart:core' as $core; import 'package:grpc/service_api.dart' as $grpc; import 'package:protobuf/protobuf.dart' as $pb; -import 'schedules.pb.dart' as $7; +import 'schedules.pb.dart' as $8; export 'schedules.pb.dart'; @$pb.GrpcServiceName('nitric.proto.schedules.v1.Schedules') class SchedulesClient extends $grpc.Client { static final _$schedule = - $grpc.ClientMethod<$7.ClientMessage, $7.ServerMessage>( + $grpc.ClientMethod<$8.ClientMessage, $8.ServerMessage>( '/nitric.proto.schedules.v1.Schedules/Schedule', - ($7.ClientMessage value) => value.writeToBuffer(), - ($core.List<$core.int> value) => $7.ServerMessage.fromBuffer(value)); + ($8.ClientMessage value) => value.writeToBuffer(), + ($core.List<$core.int> value) => $8.ServerMessage.fromBuffer(value)); SchedulesClient($grpc.ClientChannel channel, {$grpc.CallOptions? options, $core.Iterable<$grpc.ClientInterceptor>? interceptors}) : super(channel, options: options, interceptors: interceptors); - $grpc.ResponseStream<$7.ServerMessage> schedule( - $async.Stream<$7.ClientMessage> request, + $grpc.ResponseStream<$8.ServerMessage> schedule( + $async.Stream<$8.ClientMessage> request, {$grpc.CallOptions? options}) { return $createStreamingCall(_$schedule, request, options: options); } @@ -44,15 +44,15 @@ abstract class SchedulesServiceBase extends $grpc.Service { $core.String get $name => 'nitric.proto.schedules.v1.Schedules'; SchedulesServiceBase() { - $addMethod($grpc.ServiceMethod<$7.ClientMessage, $7.ServerMessage>( + $addMethod($grpc.ServiceMethod<$8.ClientMessage, $8.ServerMessage>( 'Schedule', schedule, true, true, - ($core.List<$core.int> value) => $7.ClientMessage.fromBuffer(value), - ($7.ServerMessage value) => value.writeToBuffer())); + ($core.List<$core.int> value) => $8.ClientMessage.fromBuffer(value), + ($8.ServerMessage value) => value.writeToBuffer())); } - $async.Stream<$7.ServerMessage> schedule( - $grpc.ServiceCall call, $async.Stream<$7.ClientMessage> request); + $async.Stream<$8.ServerMessage> schedule( + $grpc.ServiceCall call, $async.Stream<$8.ClientMessage> request); } diff --git a/lib/src/nitric/proto/secrets/v1/secrets.pbgrpc.dart b/lib/src/nitric/proto/secrets/v1/secrets.pbgrpc.dart index a1b7344..761d28c 100644 --- a/lib/src/nitric/proto/secrets/v1/secrets.pbgrpc.dart +++ b/lib/src/nitric/proto/secrets/v1/secrets.pbgrpc.dart @@ -15,37 +15,37 @@ import 'dart:core' as $core; import 'package:grpc/service_api.dart' as $grpc; import 'package:protobuf/protobuf.dart' as $pb; -import 'secrets.pb.dart' as $8; +import 'secrets.pb.dart' as $9; export 'secrets.pb.dart'; @$pb.GrpcServiceName('nitric.proto.secrets.v1.SecretManager') class SecretManagerClient extends $grpc.Client { static final _$put = - $grpc.ClientMethod<$8.SecretPutRequest, $8.SecretPutResponse>( + $grpc.ClientMethod<$9.SecretPutRequest, $9.SecretPutResponse>( '/nitric.proto.secrets.v1.SecretManager/Put', - ($8.SecretPutRequest value) => value.writeToBuffer(), + ($9.SecretPutRequest value) => value.writeToBuffer(), ($core.List<$core.int> value) => - $8.SecretPutResponse.fromBuffer(value)); + $9.SecretPutResponse.fromBuffer(value)); static final _$access = - $grpc.ClientMethod<$8.SecretAccessRequest, $8.SecretAccessResponse>( + $grpc.ClientMethod<$9.SecretAccessRequest, $9.SecretAccessResponse>( '/nitric.proto.secrets.v1.SecretManager/Access', - ($8.SecretAccessRequest value) => value.writeToBuffer(), + ($9.SecretAccessRequest value) => value.writeToBuffer(), ($core.List<$core.int> value) => - $8.SecretAccessResponse.fromBuffer(value)); + $9.SecretAccessResponse.fromBuffer(value)); SecretManagerClient($grpc.ClientChannel channel, {$grpc.CallOptions? options, $core.Iterable<$grpc.ClientInterceptor>? interceptors}) : super(channel, options: options, interceptors: interceptors); - $grpc.ResponseFuture<$8.SecretPutResponse> put($8.SecretPutRequest request, + $grpc.ResponseFuture<$9.SecretPutResponse> put($9.SecretPutRequest request, {$grpc.CallOptions? options}) { return $createUnaryCall(_$put, request, options: options); } - $grpc.ResponseFuture<$8.SecretAccessResponse> access( - $8.SecretAccessRequest request, + $grpc.ResponseFuture<$9.SecretAccessResponse> access( + $9.SecretAccessRequest request, {$grpc.CallOptions? options}) { return $createUnaryCall(_$access, request, options: options); } @@ -56,36 +56,36 @@ abstract class SecretManagerServiceBase extends $grpc.Service { $core.String get $name => 'nitric.proto.secrets.v1.SecretManager'; SecretManagerServiceBase() { - $addMethod($grpc.ServiceMethod<$8.SecretPutRequest, $8.SecretPutResponse>( + $addMethod($grpc.ServiceMethod<$9.SecretPutRequest, $9.SecretPutResponse>( 'Put', put_Pre, false, false, - ($core.List<$core.int> value) => $8.SecretPutRequest.fromBuffer(value), - ($8.SecretPutResponse value) => value.writeToBuffer())); + ($core.List<$core.int> value) => $9.SecretPutRequest.fromBuffer(value), + ($9.SecretPutResponse value) => value.writeToBuffer())); $addMethod( - $grpc.ServiceMethod<$8.SecretAccessRequest, $8.SecretAccessResponse>( + $grpc.ServiceMethod<$9.SecretAccessRequest, $9.SecretAccessResponse>( 'Access', access_Pre, false, false, ($core.List<$core.int> value) => - $8.SecretAccessRequest.fromBuffer(value), - ($8.SecretAccessResponse value) => value.writeToBuffer())); + $9.SecretAccessRequest.fromBuffer(value), + ($9.SecretAccessResponse value) => value.writeToBuffer())); } - $async.Future<$8.SecretPutResponse> put_Pre($grpc.ServiceCall call, - $async.Future<$8.SecretPutRequest> request) async { + $async.Future<$9.SecretPutResponse> put_Pre($grpc.ServiceCall call, + $async.Future<$9.SecretPutRequest> request) async { return put(call, await request); } - $async.Future<$8.SecretAccessResponse> access_Pre($grpc.ServiceCall call, - $async.Future<$8.SecretAccessRequest> request) async { + $async.Future<$9.SecretAccessResponse> access_Pre($grpc.ServiceCall call, + $async.Future<$9.SecretAccessRequest> request) async { return access(call, await request); } - $async.Future<$8.SecretPutResponse> put( - $grpc.ServiceCall call, $8.SecretPutRequest request); - $async.Future<$8.SecretAccessResponse> access( - $grpc.ServiceCall call, $8.SecretAccessRequest request); + $async.Future<$9.SecretPutResponse> put( + $grpc.ServiceCall call, $9.SecretPutRequest request); + $async.Future<$9.SecretAccessResponse> access( + $grpc.ServiceCall call, $9.SecretAccessRequest request); } diff --git a/lib/src/nitric/proto/storage/v1/storage.pb.dart b/lib/src/nitric/proto/storage/v1/storage.pb.dart index e64e99a..ae72692 100644 --- a/lib/src/nitric/proto/storage/v1/storage.pb.dart +++ b/lib/src/nitric/proto/storage/v1/storage.pb.dart @@ -13,7 +13,7 @@ import 'dart:core' as $core; import 'package:protobuf/protobuf.dart' as $pb; -import '../../../../google/protobuf/duration.pb.dart' as $11; +import '../../../../google/protobuf/duration.pb.dart' as $12; import 'storage.pbenum.dart'; export 'storage.pbenum.dart'; @@ -1088,7 +1088,7 @@ class StoragePreSignUrlRequest extends $pb.GeneratedMessage { $core.String? bucketName, $core.String? key, StoragePreSignUrlRequest_Operation? operation, - $11.Duration? expiry, + $12.Duration? expiry, }) { final $result = create(); if (bucketName != null) { @@ -1125,8 +1125,8 @@ class StoragePreSignUrlRequest extends $pb.GeneratedMessage { defaultOrMaker: StoragePreSignUrlRequest_Operation.READ, valueOf: StoragePreSignUrlRequest_Operation.valueOf, enumValues: StoragePreSignUrlRequest_Operation.values) - ..aOM<$11.Duration>(4, _omitFieldNames ? '' : 'expiry', - subBuilder: $11.Duration.create) + ..aOM<$12.Duration>(4, _omitFieldNames ? '' : 'expiry', + subBuilder: $12.Duration.create) ..hasRequiredFields = false; @$core.Deprecated('Using this can add significant overhead to your binary. ' @@ -1196,9 +1196,9 @@ class StoragePreSignUrlRequest extends $pb.GeneratedMessage { /// Expiry defined as as protobuf duration @$pb.TagNumber(4) - $11.Duration get expiry => $_getN(3); + $12.Duration get expiry => $_getN(3); @$pb.TagNumber(4) - set expiry($11.Duration v) { + set expiry($12.Duration v) { setField(4, v); } @@ -1207,7 +1207,7 @@ class StoragePreSignUrlRequest extends $pb.GeneratedMessage { @$pb.TagNumber(4) void clearExpiry() => clearField(4); @$pb.TagNumber(4) - $11.Duration ensureExpiry() => $_ensure(3); + $12.Duration ensureExpiry() => $_ensure(3); } class StoragePreSignUrlResponse extends $pb.GeneratedMessage { diff --git a/lib/src/nitric/proto/topics/v1/topics.pb.dart b/lib/src/nitric/proto/topics/v1/topics.pb.dart index 78eb37a..d24df30 100644 --- a/lib/src/nitric/proto/topics/v1/topics.pb.dart +++ b/lib/src/nitric/proto/topics/v1/topics.pb.dart @@ -13,8 +13,8 @@ import 'dart:core' as $core; import 'package:protobuf/protobuf.dart' as $pb; -import '../../../../google/protobuf/duration.pb.dart' as $11; -import '../../../../google/protobuf/struct.pb.dart' as $12; +import '../../../../google/protobuf/duration.pb.dart' as $12; +import '../../../../google/protobuf/struct.pb.dart' as $13; enum ClientMessage_Content { registrationRequest, messageResponse, notSet } @@ -508,7 +508,7 @@ enum TopicMessage_Content { structPayload, notSet } class TopicMessage extends $pb.GeneratedMessage { factory TopicMessage({ - $12.Struct? structPayload, + $13.Struct? structPayload, }) { final $result = create(); if (structPayload != null) { @@ -535,8 +535,8 @@ class TopicMessage extends $pb.GeneratedMessage { _omitMessageNames ? '' : 'nitric.proto.topics.v1'), createEmptyInstance: create) ..oo(0, [1]) - ..aOM<$12.Struct>(1, _omitFieldNames ? '' : 'structPayload', - subBuilder: $12.Struct.create) + ..aOM<$13.Struct>(1, _omitFieldNames ? '' : 'structPayload', + subBuilder: $13.Struct.create) ..hasRequiredFields = false; @$core.Deprecated('Using this can add significant overhead to your binary. ' @@ -567,9 +567,9 @@ class TopicMessage extends $pb.GeneratedMessage { void clearContent() => clearField($_whichOneof(0)); @$pb.TagNumber(1) - $12.Struct get structPayload => $_getN(0); + $13.Struct get structPayload => $_getN(0); @$pb.TagNumber(1) - set structPayload($12.Struct v) { + set structPayload($13.Struct v) { setField(1, v); } @@ -578,7 +578,7 @@ class TopicMessage extends $pb.GeneratedMessage { @$pb.TagNumber(1) void clearStructPayload() => clearField(1); @$pb.TagNumber(1) - $12.Struct ensureStructPayload() => $_ensure(0); + $13.Struct ensureStructPayload() => $_ensure(0); } /// Request to publish a message to a topic @@ -586,7 +586,7 @@ class TopicPublishRequest extends $pb.GeneratedMessage { factory TopicPublishRequest({ $core.String? topicName, TopicMessage? message, - $11.Duration? delay, + $12.Duration? delay, }) { final $result = create(); if (topicName != null) { @@ -616,8 +616,8 @@ class TopicPublishRequest extends $pb.GeneratedMessage { ..aOS(1, _omitFieldNames ? '' : 'topicName') ..aOM(2, _omitFieldNames ? '' : 'message', subBuilder: TopicMessage.create) - ..aOM<$11.Duration>(3, _omitFieldNames ? '' : 'delay', - subBuilder: $11.Duration.create) + ..aOM<$12.Duration>(3, _omitFieldNames ? '' : 'delay', + subBuilder: $12.Duration.create) ..hasRequiredFields = false; @$core.Deprecated('Using this can add significant overhead to your binary. ' @@ -673,9 +673,9 @@ class TopicPublishRequest extends $pb.GeneratedMessage { /// An optional delay specified in seconds (minimum 10 seconds) @$pb.TagNumber(3) - $11.Duration get delay => $_getN(2); + $12.Duration get delay => $_getN(2); @$pb.TagNumber(3) - set delay($11.Duration v) { + set delay($12.Duration v) { setField(3, v); } @@ -684,7 +684,7 @@ class TopicPublishRequest extends $pb.GeneratedMessage { @$pb.TagNumber(3) void clearDelay() => clearField(3); @$pb.TagNumber(3) - $11.Duration ensureDelay() => $_ensure(2); + $12.Duration ensureDelay() => $_ensure(2); } /// Result of publishing an topic diff --git a/lib/src/nitric/proto/topics/v1/topics.pbgrpc.dart b/lib/src/nitric/proto/topics/v1/topics.pbgrpc.dart index d5a49c8..12cf727 100644 --- a/lib/src/nitric/proto/topics/v1/topics.pbgrpc.dart +++ b/lib/src/nitric/proto/topics/v1/topics.pbgrpc.dart @@ -15,26 +15,26 @@ import 'dart:core' as $core; import 'package:grpc/service_api.dart' as $grpc; import 'package:protobuf/protobuf.dart' as $pb; -import 'topics.pb.dart' as $9; +import 'topics.pb.dart' as $10; export 'topics.pb.dart'; @$pb.GrpcServiceName('nitric.proto.topics.v1.Topics') class TopicsClient extends $grpc.Client { static final _$publish = - $grpc.ClientMethod<$9.TopicPublishRequest, $9.TopicPublishResponse>( + $grpc.ClientMethod<$10.TopicPublishRequest, $10.TopicPublishResponse>( '/nitric.proto.topics.v1.Topics/Publish', - ($9.TopicPublishRequest value) => value.writeToBuffer(), + ($10.TopicPublishRequest value) => value.writeToBuffer(), ($core.List<$core.int> value) => - $9.TopicPublishResponse.fromBuffer(value)); + $10.TopicPublishResponse.fromBuffer(value)); TopicsClient($grpc.ClientChannel channel, {$grpc.CallOptions? options, $core.Iterable<$grpc.ClientInterceptor>? interceptors}) : super(channel, options: options, interceptors: interceptors); - $grpc.ResponseFuture<$9.TopicPublishResponse> publish( - $9.TopicPublishRequest request, + $grpc.ResponseFuture<$10.TopicPublishResponse> publish( + $10.TopicPublishRequest request, {$grpc.CallOptions? options}) { return $createUnaryCall(_$publish, request, options: options); } @@ -46,40 +46,40 @@ abstract class TopicsServiceBase extends $grpc.Service { TopicsServiceBase() { $addMethod( - $grpc.ServiceMethod<$9.TopicPublishRequest, $9.TopicPublishResponse>( + $grpc.ServiceMethod<$10.TopicPublishRequest, $10.TopicPublishResponse>( 'Publish', publish_Pre, false, false, ($core.List<$core.int> value) => - $9.TopicPublishRequest.fromBuffer(value), - ($9.TopicPublishResponse value) => value.writeToBuffer())); + $10.TopicPublishRequest.fromBuffer(value), + ($10.TopicPublishResponse value) => value.writeToBuffer())); } - $async.Future<$9.TopicPublishResponse> publish_Pre($grpc.ServiceCall call, - $async.Future<$9.TopicPublishRequest> request) async { + $async.Future<$10.TopicPublishResponse> publish_Pre($grpc.ServiceCall call, + $async.Future<$10.TopicPublishRequest> request) async { return publish(call, await request); } - $async.Future<$9.TopicPublishResponse> publish( - $grpc.ServiceCall call, $9.TopicPublishRequest request); + $async.Future<$10.TopicPublishResponse> publish( + $grpc.ServiceCall call, $10.TopicPublishRequest request); } @$pb.GrpcServiceName('nitric.proto.topics.v1.Subscriber') class SubscriberClient extends $grpc.Client { static final _$subscribe = - $grpc.ClientMethod<$9.ClientMessage, $9.ServerMessage>( + $grpc.ClientMethod<$10.ClientMessage, $10.ServerMessage>( '/nitric.proto.topics.v1.Subscriber/Subscribe', - ($9.ClientMessage value) => value.writeToBuffer(), - ($core.List<$core.int> value) => $9.ServerMessage.fromBuffer(value)); + ($10.ClientMessage value) => value.writeToBuffer(), + ($core.List<$core.int> value) => $10.ServerMessage.fromBuffer(value)); SubscriberClient($grpc.ClientChannel channel, {$grpc.CallOptions? options, $core.Iterable<$grpc.ClientInterceptor>? interceptors}) : super(channel, options: options, interceptors: interceptors); - $grpc.ResponseStream<$9.ServerMessage> subscribe( - $async.Stream<$9.ClientMessage> request, + $grpc.ResponseStream<$10.ServerMessage> subscribe( + $async.Stream<$10.ClientMessage> request, {$grpc.CallOptions? options}) { return $createStreamingCall(_$subscribe, request, options: options); } @@ -90,15 +90,15 @@ abstract class SubscriberServiceBase extends $grpc.Service { $core.String get $name => 'nitric.proto.topics.v1.Subscriber'; SubscriberServiceBase() { - $addMethod($grpc.ServiceMethod<$9.ClientMessage, $9.ServerMessage>( + $addMethod($grpc.ServiceMethod<$10.ClientMessage, $10.ServerMessage>( 'Subscribe', subscribe, true, true, - ($core.List<$core.int> value) => $9.ClientMessage.fromBuffer(value), - ($9.ServerMessage value) => value.writeToBuffer())); + ($core.List<$core.int> value) => $10.ClientMessage.fromBuffer(value), + ($10.ServerMessage value) => value.writeToBuffer())); } - $async.Stream<$9.ServerMessage> subscribe( - $grpc.ServiceCall call, $async.Stream<$9.ClientMessage> request); + $async.Stream<$10.ServerMessage> subscribe( + $grpc.ServiceCall call, $async.Stream<$10.ClientMessage> request); } diff --git a/lib/src/nitric/proto/websockets/v1/websockets.pb.dart b/lib/src/nitric/proto/websockets/v1/websockets.pb.dart index 94c60e8..15416f8 100644 --- a/lib/src/nitric/proto/websockets/v1/websockets.pb.dart +++ b/lib/src/nitric/proto/websockets/v1/websockets.pb.dart @@ -730,7 +730,7 @@ class WebsocketEventRequest extends $pb.GeneratedMessage { createEmptyInstance: create) ..oo(0, [10, 11, 12]) ..aOS(1, _omitFieldNames ? '' : 'socketName') - ..aOS(2, _omitFieldNames ? '' : 'connectionId', protoName: 'connectionId') + ..aOS(2, _omitFieldNames ? '' : 'connectionId') ..aOM(10, _omitFieldNames ? '' : 'connection', subBuilder: WebsocketConnectionEvent.create) ..aOM( diff --git a/lib/src/nitric/proto/websockets/v1/websockets.pbgrpc.dart b/lib/src/nitric/proto/websockets/v1/websockets.pbgrpc.dart index 15f800a..a37c4ce 100644 --- a/lib/src/nitric/proto/websockets/v1/websockets.pbgrpc.dart +++ b/lib/src/nitric/proto/websockets/v1/websockets.pbgrpc.dart @@ -15,51 +15,51 @@ import 'dart:core' as $core; import 'package:grpc/service_api.dart' as $grpc; import 'package:protobuf/protobuf.dart' as $pb; -import 'websockets.pb.dart' as $10; +import 'websockets.pb.dart' as $11; export 'websockets.pb.dart'; @$pb.GrpcServiceName('nitric.proto.websockets.v1.Websocket') class WebsocketClient extends $grpc.Client { static final _$sendMessage = - $grpc.ClientMethod<$10.WebsocketSendRequest, $10.WebsocketSendResponse>( + $grpc.ClientMethod<$11.WebsocketSendRequest, $11.WebsocketSendResponse>( '/nitric.proto.websockets.v1.Websocket/SendMessage', - ($10.WebsocketSendRequest value) => value.writeToBuffer(), + ($11.WebsocketSendRequest value) => value.writeToBuffer(), ($core.List<$core.int> value) => - $10.WebsocketSendResponse.fromBuffer(value)); + $11.WebsocketSendResponse.fromBuffer(value)); static final _$closeConnection = $grpc.ClientMethod< - $10.WebsocketCloseConnectionRequest, - $10.WebsocketCloseConnectionResponse>( + $11.WebsocketCloseConnectionRequest, + $11.WebsocketCloseConnectionResponse>( '/nitric.proto.websockets.v1.Websocket/CloseConnection', - ($10.WebsocketCloseConnectionRequest value) => value.writeToBuffer(), + ($11.WebsocketCloseConnectionRequest value) => value.writeToBuffer(), ($core.List<$core.int> value) => - $10.WebsocketCloseConnectionResponse.fromBuffer(value)); - static final _$socketDetails = $grpc.ClientMethod<$10.WebsocketDetailsRequest, - $10.WebsocketDetailsResponse>( + $11.WebsocketCloseConnectionResponse.fromBuffer(value)); + static final _$socketDetails = $grpc.ClientMethod<$11.WebsocketDetailsRequest, + $11.WebsocketDetailsResponse>( '/nitric.proto.websockets.v1.Websocket/SocketDetails', - ($10.WebsocketDetailsRequest value) => value.writeToBuffer(), + ($11.WebsocketDetailsRequest value) => value.writeToBuffer(), ($core.List<$core.int> value) => - $10.WebsocketDetailsResponse.fromBuffer(value)); + $11.WebsocketDetailsResponse.fromBuffer(value)); WebsocketClient($grpc.ClientChannel channel, {$grpc.CallOptions? options, $core.Iterable<$grpc.ClientInterceptor>? interceptors}) : super(channel, options: options, interceptors: interceptors); - $grpc.ResponseFuture<$10.WebsocketSendResponse> sendMessage( - $10.WebsocketSendRequest request, + $grpc.ResponseFuture<$11.WebsocketSendResponse> sendMessage( + $11.WebsocketSendRequest request, {$grpc.CallOptions? options}) { return $createUnaryCall(_$sendMessage, request, options: options); } - $grpc.ResponseFuture<$10.WebsocketCloseConnectionResponse> closeConnection( - $10.WebsocketCloseConnectionRequest request, + $grpc.ResponseFuture<$11.WebsocketCloseConnectionResponse> closeConnection( + $11.WebsocketCloseConnectionRequest request, {$grpc.CallOptions? options}) { return $createUnaryCall(_$closeConnection, request, options: options); } - $grpc.ResponseFuture<$10.WebsocketDetailsResponse> socketDetails( - $10.WebsocketDetailsRequest request, + $grpc.ResponseFuture<$11.WebsocketDetailsResponse> socketDetails( + $11.WebsocketDetailsRequest request, {$grpc.CallOptions? options}) { return $createUnaryCall(_$socketDetails, request, options: options); } @@ -70,76 +70,76 @@ abstract class WebsocketServiceBase extends $grpc.Service { $core.String get $name => 'nitric.proto.websockets.v1.Websocket'; WebsocketServiceBase() { - $addMethod($grpc.ServiceMethod<$10.WebsocketSendRequest, - $10.WebsocketSendResponse>( + $addMethod($grpc.ServiceMethod<$11.WebsocketSendRequest, + $11.WebsocketSendResponse>( 'SendMessage', sendMessage_Pre, false, false, ($core.List<$core.int> value) => - $10.WebsocketSendRequest.fromBuffer(value), - ($10.WebsocketSendResponse value) => value.writeToBuffer())); - $addMethod($grpc.ServiceMethod<$10.WebsocketCloseConnectionRequest, - $10.WebsocketCloseConnectionResponse>( + $11.WebsocketSendRequest.fromBuffer(value), + ($11.WebsocketSendResponse value) => value.writeToBuffer())); + $addMethod($grpc.ServiceMethod<$11.WebsocketCloseConnectionRequest, + $11.WebsocketCloseConnectionResponse>( 'CloseConnection', closeConnection_Pre, false, false, ($core.List<$core.int> value) => - $10.WebsocketCloseConnectionRequest.fromBuffer(value), - ($10.WebsocketCloseConnectionResponse value) => value.writeToBuffer())); - $addMethod($grpc.ServiceMethod<$10.WebsocketDetailsRequest, - $10.WebsocketDetailsResponse>( + $11.WebsocketCloseConnectionRequest.fromBuffer(value), + ($11.WebsocketCloseConnectionResponse value) => value.writeToBuffer())); + $addMethod($grpc.ServiceMethod<$11.WebsocketDetailsRequest, + $11.WebsocketDetailsResponse>( 'SocketDetails', socketDetails_Pre, false, false, ($core.List<$core.int> value) => - $10.WebsocketDetailsRequest.fromBuffer(value), - ($10.WebsocketDetailsResponse value) => value.writeToBuffer())); + $11.WebsocketDetailsRequest.fromBuffer(value), + ($11.WebsocketDetailsResponse value) => value.writeToBuffer())); } - $async.Future<$10.WebsocketSendResponse> sendMessage_Pre( + $async.Future<$11.WebsocketSendResponse> sendMessage_Pre( $grpc.ServiceCall call, - $async.Future<$10.WebsocketSendRequest> request) async { + $async.Future<$11.WebsocketSendRequest> request) async { return sendMessage(call, await request); } - $async.Future<$10.WebsocketCloseConnectionResponse> closeConnection_Pre( + $async.Future<$11.WebsocketCloseConnectionResponse> closeConnection_Pre( $grpc.ServiceCall call, - $async.Future<$10.WebsocketCloseConnectionRequest> request) async { + $async.Future<$11.WebsocketCloseConnectionRequest> request) async { return closeConnection(call, await request); } - $async.Future<$10.WebsocketDetailsResponse> socketDetails_Pre( + $async.Future<$11.WebsocketDetailsResponse> socketDetails_Pre( $grpc.ServiceCall call, - $async.Future<$10.WebsocketDetailsRequest> request) async { + $async.Future<$11.WebsocketDetailsRequest> request) async { return socketDetails(call, await request); } - $async.Future<$10.WebsocketSendResponse> sendMessage( - $grpc.ServiceCall call, $10.WebsocketSendRequest request); - $async.Future<$10.WebsocketCloseConnectionResponse> closeConnection( - $grpc.ServiceCall call, $10.WebsocketCloseConnectionRequest request); - $async.Future<$10.WebsocketDetailsResponse> socketDetails( - $grpc.ServiceCall call, $10.WebsocketDetailsRequest request); + $async.Future<$11.WebsocketSendResponse> sendMessage( + $grpc.ServiceCall call, $11.WebsocketSendRequest request); + $async.Future<$11.WebsocketCloseConnectionResponse> closeConnection( + $grpc.ServiceCall call, $11.WebsocketCloseConnectionRequest request); + $async.Future<$11.WebsocketDetailsResponse> socketDetails( + $grpc.ServiceCall call, $11.WebsocketDetailsRequest request); } @$pb.GrpcServiceName('nitric.proto.websockets.v1.WebsocketHandler') class WebsocketHandlerClient extends $grpc.Client { static final _$handleEvents = - $grpc.ClientMethod<$10.ClientMessage, $10.ServerMessage>( + $grpc.ClientMethod<$11.ClientMessage, $11.ServerMessage>( '/nitric.proto.websockets.v1.WebsocketHandler/HandleEvents', - ($10.ClientMessage value) => value.writeToBuffer(), - ($core.List<$core.int> value) => $10.ServerMessage.fromBuffer(value)); + ($11.ClientMessage value) => value.writeToBuffer(), + ($core.List<$core.int> value) => $11.ServerMessage.fromBuffer(value)); WebsocketHandlerClient($grpc.ClientChannel channel, {$grpc.CallOptions? options, $core.Iterable<$grpc.ClientInterceptor>? interceptors}) : super(channel, options: options, interceptors: interceptors); - $grpc.ResponseStream<$10.ServerMessage> handleEvents( - $async.Stream<$10.ClientMessage> request, + $grpc.ResponseStream<$11.ServerMessage> handleEvents( + $async.Stream<$11.ClientMessage> request, {$grpc.CallOptions? options}) { return $createStreamingCall(_$handleEvents, request, options: options); } @@ -150,15 +150,15 @@ abstract class WebsocketHandlerServiceBase extends $grpc.Service { $core.String get $name => 'nitric.proto.websockets.v1.WebsocketHandler'; WebsocketHandlerServiceBase() { - $addMethod($grpc.ServiceMethod<$10.ClientMessage, $10.ServerMessage>( + $addMethod($grpc.ServiceMethod<$11.ClientMessage, $11.ServerMessage>( 'HandleEvents', handleEvents, true, true, - ($core.List<$core.int> value) => $10.ClientMessage.fromBuffer(value), - ($10.ServerMessage value) => value.writeToBuffer())); + ($core.List<$core.int> value) => $11.ClientMessage.fromBuffer(value), + ($11.ServerMessage value) => value.writeToBuffer())); } - $async.Stream<$10.ServerMessage> handleEvents( - $grpc.ServiceCall call, $async.Stream<$10.ClientMessage> request); + $async.Stream<$11.ServerMessage> handleEvents( + $grpc.ServiceCall call, $async.Stream<$11.ClientMessage> request); } diff --git a/lib/src/nitric/proto/websockets/v1/websockets.pbjson.dart b/lib/src/nitric/proto/websockets/v1/websockets.pbjson.dart index 10c3662..b11810e 100644 --- a/lib/src/nitric/proto/websockets/v1/websockets.pbjson.dart +++ b/lib/src/nitric/proto/websockets/v1/websockets.pbjson.dart @@ -177,7 +177,7 @@ const WebsocketEventRequest$json = { '1': 'WebsocketEventRequest', '2': [ {'1': 'socket_name', '3': 1, '4': 1, '5': 9, '10': 'socketName'}, - {'1': 'connectionId', '3': 2, '4': 1, '5': 9, '10': 'connectionId'}, + {'1': 'connection_id', '3': 2, '4': 1, '5': 9, '10': 'connectionId'}, { '1': 'connection', '3': 10, @@ -214,12 +214,12 @@ const WebsocketEventRequest$json = { /// Descriptor for `WebsocketEventRequest`. Decode as a `google.protobuf.DescriptorProto`. final $typed_data.Uint8List websocketEventRequestDescriptor = $convert.base64Decode( 'ChVXZWJzb2NrZXRFdmVudFJlcXVlc3QSHwoLc29ja2V0X25hbWUYASABKAlSCnNvY2tldE5hbW' - 'USIgoMY29ubmVjdGlvbklkGAIgASgJUgxjb25uZWN0aW9uSWQSVgoKY29ubmVjdGlvbhgKIAEo' - 'CzI0Lm5pdHJpYy5wcm90by53ZWJzb2NrZXRzLnYxLldlYnNvY2tldENvbm5lY3Rpb25FdmVudE' - 'gAUgpjb25uZWN0aW9uEl8KDWRpc2Nvbm5lY3Rpb24YCyABKAsyNy5uaXRyaWMucHJvdG8ud2Vi' - 'c29ja2V0cy52MS5XZWJzb2NrZXREaXNjb25uZWN0aW9uRXZlbnRIAFINZGlzY29ubmVjdGlvbh' - 'JNCgdtZXNzYWdlGAwgASgLMjEubml0cmljLnByb3RvLndlYnNvY2tldHMudjEuV2Vic29ja2V0' - 'TWVzc2FnZUV2ZW50SABSB21lc3NhZ2VCEQoPd2Vic29ja2V0X2V2ZW50'); + 'USIwoNY29ubmVjdGlvbl9pZBgCIAEoCVIMY29ubmVjdGlvbklkElYKCmNvbm5lY3Rpb24YCiAB' + 'KAsyNC5uaXRyaWMucHJvdG8ud2Vic29ja2V0cy52MS5XZWJzb2NrZXRDb25uZWN0aW9uRXZlbn' + 'RIAFIKY29ubmVjdGlvbhJfCg1kaXNjb25uZWN0aW9uGAsgASgLMjcubml0cmljLnByb3RvLndl' + 'YnNvY2tldHMudjEuV2Vic29ja2V0RGlzY29ubmVjdGlvbkV2ZW50SABSDWRpc2Nvbm5lY3Rpb2' + '4STQoHbWVzc2FnZRgMIAEoCzIxLm5pdHJpYy5wcm90by53ZWJzb2NrZXRzLnYxLldlYnNvY2tl' + 'dE1lc3NhZ2VFdmVudEgAUgdtZXNzYWdlQhEKD3dlYnNvY2tldF9ldmVudA=='); @$core.Deprecated('Use queryValueDescriptor instead') const QueryValue$json = { diff --git a/lib/src/resources/api.dart b/lib/src/resources/api.dart index 487443b..4e72ab8 100644 --- a/lib/src/resources/api.dart +++ b/lib/src/resources/api.dart @@ -8,75 +8,86 @@ enum HttpMethod { options, } +class ApiOptions { + List security; + String basePath; + + ApiOptions({this.security = const [], this.basePath = ""}); +} + /// An API resource. class Api extends Resource { - Api(String name) : super(name); + late ApiOptions opts; + + Api(String name, {ApiOptions? opts, $p.ResourcesClient? client}) + : super(name, client) { + this.opts = opts ?? ApiOptions(); + } @override - Future register() async { + ResourceDeclareRequest asRequest() { var resource = $p.ResourceIdentifier( name: name, type: $p.ResourceType.Api, ); - //var apiScopes = $p.ApiScopes(); - var apiResource = $p.ApiResource(security: {}); // TODO security + var apiResource = $p.ApiResource(); - await client - .declare($p.ResourceDeclareRequest(id: resource, api: apiResource)); + for (var opt in opts.security) { + _attachOidc(name, opt); + + apiResource.security[opt.name] = $p.ApiScopes(scopes: opt.scopes); + } + + return $p.ResourceDeclareRequest(id: resource, api: apiResource); } /// A GET request [handler] that [match]es a specific route. - Future get( - String match, - HttpMiddleware handler, - ) async { - Route(this, match).get(handler); + Future get(String match, HttpHandler handler, + {List? security}) async { + Route(this, opts.basePath + match, security: security ?? opts.security) + .get(handler); } /// A POST request [handler] that [match]es a specific route. - Future post( - String match, - HttpMiddleware handler, - ) async { - Route(this, match).post(handler); + Future post(String match, HttpHandler handler, + {List? security}) async { + Route(this, opts.basePath + match, security: security ?? opts.security) + .post(handler); } /// A PUT request [handler] that [match]es a specific route. - Future put( - String match, - HttpMiddleware handler, - ) async { - Route(this, match).put(handler); + Future put(String match, HttpHandler handler, + {List? security}) async { + Route(this, opts.basePath + match, security: security ?? opts.security) + .put(handler); } /// A DELETE request [handler] that [match]es a specific route. - Future delete( - String match, - HttpMiddleware handler, - ) async { - Route(this, match).delete(handler); + Future delete(String match, HttpHandler handler, + {List? security}) async { + Route(this, opts.basePath + match, security: security ?? opts.security) + .delete(handler); } /// A OPTIONS request [handler] that [match]es a specific route. - Future options( - String match, - HttpMiddleware handler, - ) async { - Route(this, match).options(handler); + Future options(String match, HttpHandler handler, + {List? security}) async { + Route(this, opts.basePath + match, security: security ?? opts.security) + .options(handler); } /// A request [handler] that [match]es a specific route on all HTTP methods. - Future all( - String match, - HttpMiddleware handler, - ) async { - Route(this, match).all(handler); + Future all(String match, HttpHandler handler, + {List? security}) async { + Route(this, opts.basePath + match, security: security ?? opts.security) + .all(handler); } /// Create a route that [match]es on a specific path. - Route route(String match) { - return Route(this, match); + Route route(String match, {List? security}) { + return Route(this, opts.basePath + match, + security: security ?? opts.security); } } @@ -88,48 +99,55 @@ class Route { /// The path that this route will match on. String match; - Route(this.api, this.match); + /// The security to apply to the route. + List security; + + Route(this.api, this.match, {this.security = const []}); /// A GET request [handler] for this route. - Future get(HttpMiddleware handler) async { - var worker = ApiWorker(this, handler, [HttpMethod.get]); + Future get(HttpHandler handler) async { + var worker = ApiWorker(this, handler, [HttpMethod.get], security: security); - Nitric.registerWorker(worker); + worker.start(); } /// A POST request [handler] for this route. - Future post(HttpMiddleware handler) async { - var worker = ApiWorker(this, handler, [HttpMethod.post]); + Future post(HttpHandler handler) async { + var worker = + ApiWorker(this, handler, [HttpMethod.post], security: security); - Nitric.registerWorker(worker); + worker.start(); } /// A PUT request [handler] for this route. - Future put(HttpMiddleware handler) async { - var worker = ApiWorker(this, handler, [HttpMethod.put]); + Future put(HttpHandler handler) async { + var worker = ApiWorker(this, handler, [HttpMethod.put], security: security); - Nitric.registerWorker(worker); + worker.start(); } /// A DELETE request [handler] for this route. - Future delete(HttpMiddleware handler) async { - var worker = ApiWorker(this, handler, [HttpMethod.delete]); + Future delete(HttpHandler handler) async { + var worker = + ApiWorker(this, handler, [HttpMethod.delete], security: security); - Nitric.registerWorker(worker); + worker.start(); } /// An OPTIONS request [handler] for this route. - Future options(HttpMiddleware handler) async { - var worker = ApiWorker(this, handler, [HttpMethod.options]); + Future options(HttpHandler handler) async { + var worker = + ApiWorker(this, handler, [HttpMethod.options], security: security); - Nitric.registerWorker(worker); + worker.start(); } /// A request [handler] for this route that matches all HTTP methods. - Future all(HttpMiddleware handler) async { - var worker = ApiWorker(this, handler, HttpMethod.values); + Future all(HttpHandler handler) async { + var worker = + ApiWorker(this, handler, HttpMethod.values, security: security); - Nitric.registerWorker(worker); + worker.start(); } } @@ -139,12 +157,15 @@ class ApiWorker implements Worker { Route route; /// The handler that will run on a request. - HttpMiddleware handler; + HttpHandler handler; /// The HTTP methods that will be accepted for this trigger. List methods; - ApiWorker(this.route, this.handler, this.methods); + /// The security to apply to this api worker. + List security; + + ApiWorker(this.route, this.handler, this.methods, {this.security = const []}); /// Start the route handler. @override @@ -153,12 +174,20 @@ class ApiWorker implements Worker { final channel = createClientChannelFromEnvVar(); final client = $ap.ApiClient(channel); + var options = $ap.ApiWorkerOptions(securityDisabled: security.isEmpty); + + for (var s in security) { + await _attachOidc(route.api.name, s); + + options.security[s.name] = $ap.ApiWorkerScopes(scopes: s.scopes); + } + // Create the request to register the API with the membrane final registrationRequest = $ap.RegistrationRequest( api: route.api.name, path: route.match, methods: methods.map((e) => e.name.toUpperCase()), - options: $ap.ApiWorkerOptions(securityDisabled: true), + options: options, ); final initMsg = $ap.ClientMessage(registrationRequest: registrationRequest); @@ -170,28 +199,27 @@ class ApiWorker implements Worker { requestStream.stream, ); - try { - await for (final msg in response) { - if (msg.hasRegistrationResponse()) { - print("Function connected with membrane"); - } else if (msg.hasHttpRequest()) { - var ctx = HttpContext.fromRequest(msg); + await for (final msg in response) { + if (msg.hasRegistrationResponse()) { + // Function connected with Nitric server + } else if (msg.hasHttpRequest()) { + var ctx = HttpContext.fromRequest(msg); + try { ctx = await handler(ctx); + } on GrpcError catch (e) { + print("caught a GrpcError: $e"); + } catch (e) { + // Program has experienced an unexpected programatic error + print("unhandled application error: $e"); - var resp = ctx.toResponse(); - - requestStream.add(resp); + ctx.resp.withError(e); } - } - } on GrpcError catch (e) { - print("caught a GrpcError: $e"); - } on Error catch (e) { - print(e); - - var resp = HttpResponse.withError(e); - requestStream.add($ap.ClientMessage(httpResponse: resp.toWire())); + requestStream.add(ctx.toResponse()); + } } + + await channel.shutdown(); } } diff --git a/lib/src/resources/bucket.dart b/lib/src/resources/bucket.dart index 4c30b70..74ae67a 100644 --- a/lib/src/resources/bucket.dart +++ b/lib/src/resources/bucket.dart @@ -3,18 +3,17 @@ part of 'common.dart'; enum BucketPermission { reading, writing, deleting } class BucketResource extends SecureResource { - BucketResource(String name) : super(name); + BucketResource(String name, {$p.ResourcesClient? client}) + : super(name, client); @override - Future register() async { + ResourceDeclareRequest asRequest() { var resource = $p.ResourceIdentifier( type: $p.ResourceType.Bucket, name: name, ); - await client.declare($p.ResourceDeclareRequest(id: resource)); - - registrationCompletion.complete(resource); + return $p.ResourceDeclareRequest(id: resource, bucket: $p.BucketResource()); } @override diff --git a/lib/src/resources/common.dart b/lib/src/resources/common.dart index 4f0225f..d3c7ff6 100644 --- a/lib/src/resources/common.dart +++ b/lib/src/resources/common.dart @@ -9,7 +9,6 @@ import 'package:nitric_sdk/src/nitric.dart'; import 'package:nitric_sdk/src/nitric/proto/resources/v1/resources.pb.dart'; import 'package:nitric_sdk/src/nitric/proto/schedules/v1/schedules.pb.dart' as $s; -import 'package:nitric_sdk/src/nitric/proto/websockets/v1/websockets.pb.dart'; import 'package:grpc/grpc.dart'; import 'package:nitric_sdk/src/context/common.dart'; import 'package:nitric_sdk/src/api/topic.dart' as $t; @@ -33,6 +32,8 @@ part 'bucket.dart'; part 'api.dart'; part 'topic.dart'; part 'websocket.dart'; +part 'queue.dart'; +part 'oidc.dart'; /// A representation of a resource that can be registered with the Nitric server. abstract class Resource { @@ -40,35 +41,47 @@ abstract class Resource { final String name; // Used to resolve the given resource for policy creation - @protected - final Completer registrationCompletion = + final Completer _registrationCompletion = Completer(); /// Internal resource client to declare the resource. - @protected - late final $p.ResourcesClient client; + late final $p.ResourcesClient _client; - @protected - Resource(this.name) { - final channel = createClientChannelFromEnvVar(); + final ClientChannel _channel = createClientChannelFromEnvVar(); - client = $p.ResourcesClient(channel); + @protected + Resource(this.name, $p.ResourcesClient? client) { + if (client == null) { + _client = $p.ResourcesClient(_channel); + } else { + _client = client; + } } - /// Register the resource with the Nitric server. - Future register(); + ResourceDeclareRequest asRequest(); + + /// Register the resource with the Nitric server. Handles shutting down the channel. + Future register() async { + var res = asRequest(); + + await _client.declare(res); + + await _channel.shutdown(); + + _registrationCompletion.complete(res.id); + } } /// A resource that requires permissions to access it. abstract class SecureResource extends Resource { - SecureResource(String name) : super(name); + SecureResource(String name, $p.ResourcesClient? client) : super(name, client); /// Convert a list of permissions to gRPC actions. List<$p.Action> permissionsToActions(List permissions); - /// Register a policy with the Nitric server to secure the resource with least-privilege. + /// Register a policy with the Nitric server to secure the resource with least-privilege. Handles shutting down the channel. Future registerPolicy(List permissions) async { - var resourceIdentifier = await registrationCompletion.future; + var resourceIdentifier = await _registrationCompletion.future; var policyResource = $p.ResourceIdentifier(type: $p.ResourceType.Policy); @@ -77,7 +90,19 @@ abstract class SecureResource extends Resource { resources: [resourceIdentifier], actions: permissionsToActions(permissions)); - await client + await _client .declare($p.ResourceDeclareRequest(policy: policy, id: policyResource)); + + await _channel.shutdown(); + } + + /// Register the resource with the Nitric server. + @override + Future register() async { + var res = asRequest(); + + await _client.declare(res); + + _registrationCompletion.complete(res.id); } } diff --git a/lib/src/resources/keyvalue.dart b/lib/src/resources/keyvalue.dart index 04f020a..93cf8d1 100644 --- a/lib/src/resources/keyvalue.dart +++ b/lib/src/resources/keyvalue.dart @@ -2,19 +2,19 @@ part of 'common.dart'; enum KeyValueStorePermission { getting, setting, deleting } -class KeyValueStoreResource extends SecureResource { - KeyValueStoreResource(String name) : super(name); +class KeyValueStoreResource extends SecureResource { + KeyValueStoreResource(String name, {$p.ResourcesClient? client}) + : super(name, client); @override - Future register() async { + ResourceDeclareRequest asRequest() { var resource = $p.ResourceIdentifier( type: $p.ResourceType.KeyValueStore, name: name, ); - await client.declare($p.ResourceDeclareRequest(id: resource)); - - registrationCompletion.complete(resource); + return $p.ResourceDeclareRequest( + id: resource, keyValueStore: $p.KeyValueStoreResource()); } @override @@ -40,13 +40,13 @@ class KeyValueStoreResource extends SecureResource { return actions; } - KeyValueStore requires(List permissions) { + KeyValueStore requires(List permissions) { if (permissions.isEmpty) { throw "Must supply at least one permission for key value store $name"; } registerPolicy(permissions); - return KeyValueStore(name); + return KeyValueStore(name); } } diff --git a/lib/src/resources/oidc.dart b/lib/src/resources/oidc.dart new file mode 100644 index 0000000..ccb3e3b --- /dev/null +++ b/lib/src/resources/oidc.dart @@ -0,0 +1,50 @@ +part of 'common.dart'; + +class OidcOptions { + String name; + String issuer; + List audiences; + List scopes; + + OidcOptions(this.name, this.issuer, this.audiences, this.scopes); +} + +typedef SecurityOption = OidcOptions Function(List scopes); + +Future _attachOidc( + String apiName, OidcOptions options) async { + var secDef = OidcSecurityDefinition(apiName, options); + await secDef.register(); + return secDef; +} + +class OidcSecurityDefinition extends Resource { + String apiName; + late String ruleName; + late String issuer; + late List audiences; + + OidcSecurityDefinition(this.apiName, OidcOptions options, + {$p.ResourcesClient? client}) + : super("${options.name}-$apiName", client) { + ruleName = options.name; + issuer = options.issuer; + audiences = options.audiences; + } + + @override + ResourceDeclareRequest asRequest() { + var resource = $p.ResourceIdentifier( + name: ruleName, + type: $p.ResourceType.ApiSecurityDefinition, + ); + + var oidc = + ApiOpenIdConnectionDefinition(issuer: issuer, audiences: audiences); + var securityDefinition = + ApiSecurityDefinitionResource(apiName: apiName, oidc: oidc); + + return $p.ResourceDeclareRequest( + id: resource, apiSecurityDefinition: securityDefinition); + } +} diff --git a/lib/src/resources/queue.dart b/lib/src/resources/queue.dart new file mode 100644 index 0000000..4c0b213 --- /dev/null +++ b/lib/src/resources/queue.dart @@ -0,0 +1,47 @@ +part of 'common.dart'; + +enum QueuePermission { enqueueing, dequeueing } + +class QueueResource extends SecureResource { + QueueResource(String name, {$p.ResourcesClient? client}) + : super(name, client); + + @override + ResourceDeclareRequest asRequest() { + var resource = $p.ResourceIdentifier( + type: $p.ResourceType.Queue, + name: name, + ); + + return $p.ResourceDeclareRequest(id: resource, queue: $p.QueueResource()); + } + + @override + List<$p.Action> permissionsToActions(List permissions) { + List<$p.Action> actions = permissions.fold( + [], + (actions, permission) => switch (permission) { + QueuePermission.enqueueing => [ + ...actions, + $p.Action.QueueEnqueue, + ], + QueuePermission.dequeueing => [ + ...actions, + $p.Action.QueueDequeue + ], + }); + + return actions; + } + + /// Set the function's required [permissions] to the queue. + Queue requires(List permissions) { + if (permissions.isEmpty) { + throw "Must supply at least one permission for queue $name"; + } + + registerPolicy(permissions); + + return Queue(name); + } +} diff --git a/lib/src/resources/schedule.dart b/lib/src/resources/schedule.dart index d4f337b..df382f3 100644 --- a/lib/src/resources/schedule.dart +++ b/lib/src/resources/schedule.dart @@ -1,27 +1,27 @@ part of 'common.dart'; class Schedule extends Resource { - Schedule(String name) : super(name); + Schedule(String name, {$p.ResourcesClient? client}) : super(name, client); @override - Future register() async { + ResourceDeclareRequest asRequest() { var res = $p.ResourceIdentifier(name: name, type: $p.ResourceType.Schedule); - await client.declare($p.ResourceDeclareRequest(id: res)); + + return $p.ResourceDeclareRequest(id: res); } /// Run [middleware] at a certain interval defined by the [rate]. E.g. '7 days', '3 hours', '30 minutes'. - Future every(String rate, IntervalMiddleware middleware) async { + Future every(String rate, IntervalHandler middleware) async { var registrationRequest = $sp.RegistrationRequest( scheduleName: name, every: $s.ScheduleEvery(rate: rate)); var worker = IntervalWorker(registrationRequest, middleware); - Nitric.registerWorker(worker); + await worker.start(); } /// Run [middleware] at a certain interval defined by the [cronExpression]. - Future cron( - String cronExpression, IntervalMiddleware middleware) async { + Future cron(String cronExpression, IntervalHandler middleware) async { var registrationRequest = $sp.RegistrationRequest( scheduleName: name, cron: $sp.ScheduleCron(expression: cronExpression), @@ -29,13 +29,13 @@ class Schedule extends Resource { var worker = IntervalWorker(registrationRequest, middleware); - Nitric.registerWorker(worker); + await worker.start(); } } -class IntervalWorker extends Worker { +class IntervalWorker implements Worker { $sp.RegistrationRequest registrationRequest; - IntervalMiddleware middleware; + IntervalHandler middleware; IntervalWorker(this.registrationRequest, this.middleware); @@ -56,28 +56,26 @@ class IntervalWorker extends Worker { requestStream.stream, ); - try { - await for (final msg in response) { - if (msg.hasRegistrationResponse()) { - print("Function connected with membrane"); - } else if (msg.hasIntervalRequest()) { - var ctx = IntervalContext.fromRequest(msg); + await for (final msg in response) { + if (msg.hasRegistrationResponse()) { + // Schedule connected with Nitric server + } else if (msg.hasIntervalRequest()) { + var ctx = IntervalContext.fromRequest(msg); + try { ctx = await middleware(ctx); + } on GrpcError catch (e) { + print("caught a GrpcError: $e"); + } catch (e) { + print("unhandled application error: $e"); - var resp = ctx.toResponse(); - - requestStream.add(resp); + ctx.resp.success = false; } - } - } on GrpcError catch (e) { - print("caught a GrpcError: $e"); - } on Error catch (e) { - print(e); - var resp = IntervalResponse(success: false); - - requestStream.add($sp.ClientMessage(intervalResponse: resp.toWire())); + requestStream.add(ctx.toResponse()); + } } + + await channel.shutdown(); } } diff --git a/lib/src/resources/secret.dart b/lib/src/resources/secret.dart index d6afa0d..8b6764e 100644 --- a/lib/src/resources/secret.dart +++ b/lib/src/resources/secret.dart @@ -3,18 +3,17 @@ part of 'common.dart'; enum SecretPermission { accessing, putting } class SecretResource extends SecureResource { - SecretResource(String name) : super(name); + SecretResource(String name, {$p.ResourcesClient? client}) + : super(name, client); @override - Future register() async { + ResourceDeclareRequest asRequest() { var resource = $p.ResourceIdentifier( name: name, type: $p.ResourceType.Secret, ); - await client.declare($p.ResourceDeclareRequest(id: resource)); - - registrationCompletion.complete(resource); + return $p.ResourceDeclareRequest(id: resource, secret: $p.SecretResource()); } @override diff --git a/lib/src/resources/topic.dart b/lib/src/resources/topic.dart index 570a117..7a66be5 100644 --- a/lib/src/resources/topic.dart +++ b/lib/src/resources/topic.dart @@ -3,21 +3,25 @@ part of 'common.dart'; enum TopicPermission { publishing } class Topic extends SecureResource { - Topic(String name) : super(name); + Topic(String name, {$p.ResourcesClient? client}) : super(name, client); /// Register a [handler] to subscribe to messages sent to the topic. - Future subscribe(MessageMiddleware handler) async {} + Future subscribe(MessageHandler middleware) async { + var registrationRequest = $tp.RegistrationRequest(topicName: name); + + var worker = SubscriptionWorker(registrationRequest, middleware); + + await worker.start(); + } @override - Future register() async { + ResourceDeclareRequest asRequest() { var resource = $p.ResourceIdentifier( name: name, type: $p.ResourceType.Topic, ); - await client.declare($p.ResourceDeclareRequest(id: resource)); - - registrationCompletion.complete(resource); + return $p.ResourceDeclareRequest(id: resource, topic: $p.TopicResource()); } @override @@ -46,9 +50,9 @@ class Topic extends SecureResource { } } -class SubscriptionWorker extends Worker { +class SubscriptionWorker implements Worker { $tp.RegistrationRequest registrationRequest; - MessageMiddleware middleware; + MessageHandler middleware; SubscriptionWorker(this.registrationRequest, this.middleware); @@ -69,28 +73,26 @@ class SubscriptionWorker extends Worker { requestStream.stream, ); - try { - await for (final msg in response) { - if (msg.hasRegistrationResponse()) { - print("Function connected with membrane"); - } else if (msg.hasMessageRequest()) { - var ctx = MessageContext.fromRequest(msg); + await for (final msg in response) { + if (msg.hasRegistrationResponse()) { + // Topic connected with Nitric server + } else if (msg.hasMessageRequest()) { + var ctx = MessageContext.fromRequest(msg); + try { ctx = await middleware(ctx); + } on GrpcError catch (e) { + print("caught a GrpcError: $e"); + } catch (e) { + print("unhandled application error: $e"); - var resp = ctx.toResponse(); - - requestStream.add(resp); + ctx.resp.success = false; } - } - } on GrpcError catch (e) { - print("caught a GrpcError: $e"); - } on Error catch (e) { - print(e); - - var resp = MessageResponse(false); - requestStream.add($tp.ClientMessage(messageResponse: resp.toWire())); + requestStream.add(ctx.toResponse()); + } } + + await channel.shutdown(); } } diff --git a/lib/src/resources/websocket.dart b/lib/src/resources/websocket.dart index 5a8562f..47788c7 100644 --- a/lib/src/resources/websocket.dart +++ b/lib/src/resources/websocket.dart @@ -3,20 +3,20 @@ part of 'common.dart'; class Websocket extends Resource { late $wp.WebsocketClient _websocketClient; - Websocket(String name) : super(name) { + Websocket(String name, {$p.ResourcesClient? client}) : super(name, client) { final channel = createClientChannelFromEnvVar(); _websocketClient = $wp.WebsocketClient(channel); } @override - Future register() async { + ResourceDeclareRequest asRequest() { var resource = $p.ResourceIdentifier( name: name, - type: $p.ResourceType.Api, + type: $p.ResourceType.Websocket, ); - await client.declare($p.ResourceDeclareRequest(id: resource)); + return $p.ResourceDeclareRequest(id: resource); } /// Send message [data] to a connection, referenced by its [connectionId]. @@ -34,42 +34,39 @@ class Websocket extends Resource { } /// Set a [handler] for connection requests to the socket. - Future onConnect(WebsocketConnectMiddleware handler) async { + Future onConnect(WebsocketHandler handler) async { var registrationRequest = $wp.RegistrationRequest( eventType: $wp.WebsocketEventType.Connect, socketName: name); - var worker = - WebsocketWorker(registrationRequest, handler as WebsocketMiddleware); + var worker = WebsocketWorker(registrationRequest, handler); - Nitric.registerWorker(worker); + worker.start(); } /// Set a [handler] for disconnection requests to the socket. - Future onDisconnect(WebsocketConnectMiddleware handler) async { + Future onDisconnect(WebsocketHandler handler) async { var registrationRequest = $wp.RegistrationRequest( eventType: $wp.WebsocketEventType.Disconnect, socketName: name); - var worker = - WebsocketWorker(registrationRequest, handler as WebsocketMiddleware); + var worker = WebsocketWorker(registrationRequest, handler); - Nitric.registerWorker(worker); + worker.start(); } /// Set a [handler] for messages to the socket. - Future onMessage(WebsocketConnectMiddleware handler) async { + Future onMessage(WebsocketHandler handler) async { var registrationRequest = $wp.RegistrationRequest( eventType: $wp.WebsocketEventType.Message, socketName: name); - var worker = - WebsocketWorker(registrationRequest, handler as WebsocketMiddleware); + var worker = WebsocketWorker(registrationRequest, handler); - Nitric.registerWorker(worker); + worker.start(); } } -class WebsocketWorker extends Worker { +class WebsocketWorker implements Worker { $wp.RegistrationRequest registrationRequest; - WebsocketMiddleware middleware; + WebsocketHandler middleware; WebsocketWorker(this.registrationRequest, this.middleware); @@ -89,37 +86,24 @@ class WebsocketWorker extends Worker { requestStream.stream, ); - try { - await for (final msg in response) { - if (msg.hasRegistrationResponse()) { - print("Function connected with membrane"); - } else if (msg.hasWebsocketEventRequest()) { - var ctx = switch (registrationRequest.eventType) { - $wp.WebsocketEventType.Connect => - WebsocketConnectContext.fromRequest(msg), - $wp.WebsocketEventType.Disconnect => - WebsocketDisconnectContext.fromRequest(msg), - $wp.WebsocketEventType.Message => - WebsocketMessageContext.fromRequest(msg), - WebsocketEventType() => null, - }; - - ctx = await middleware(ctx!); - - var resp = ctx.toResponse(); - - requestStream.add(resp); + await for (final msg in response) { + if (msg.hasRegistrationResponse()) { + // Websocket connected with Nitric server + } else if (msg.hasWebsocketEventRequest()) { + var ctx = WebsocketContext.fromRequest(msg); + + try { + ctx = await middleware(ctx); + } on GrpcError catch (e) { + print("caught a GrpcError: $e"); + } catch (e) { + print("unhandled application error: $e"); } - } - } on GrpcError catch (e) { - print("caught a GrpcError: $e"); - } on Error catch (e) { - print(e); - - var resp = WebsocketResponse(); - requestStream - .add($wp.ClientMessage(websocketEventResponse: resp.toWire())); + requestStream.add(ctx.toResponse()); + } } + + await channel.shutdown(); } } diff --git a/makefile b/makefile index a0a5be8..8a53874 100644 --- a/makefile +++ b/makefile @@ -1,17 +1,27 @@ clean: rm -rf lib/src/nitric + rm -rf lib/src/google -build: download +NITRIC_VERSION := 1.1.1 +GRPC_VERSION := 3.2.4 + +download-nitric: + curl -L https://github.com/nitrictech/nitric/releases/download/v${NITRIC_VERSION}/proto.tgz -o nitric.tgz + tar xvzf nitric.tgz + rm nitric.tgz + +download-google_well_known: + curl -L https://github.com/grpc/grpc-dart/archive/refs/tags/v${GRPC_VERSION}.zip -o google.tgz + tar xvzf google.tgz + rm google.tgz + mkdir -p ./lib/src/google/protobuf + mv grpc-dart-${GRPC_VERSION}/example/googleapis/lib/src/generated/google/protobuf ./lib/src/google + rm -rf grpc-dart-${GRPC_VERSION} + +build: download-nitric download-google_well_known mkdir -p lib/src/nitric/proto mkdir -p lib/src/nitric/google protoc -I ./ --dart_out=grpc:lib/src/ ./nitric/proto/*/*/*.proto # relocate well known types as their relative location is not generated correctly on first build mv lib/src/nitric/google lib/src/google - dart format lib/src/nitric lib/src/google - -NITRIC_VERSION := 1.0.0 - -download: - curl -L https://github.com/nitrictech/nitric/releases/download/v${NITRIC_VERSION}/proto.tgz -o nitric.tgz - tar xvzf nitric.tgz - rm nitric.tgz + dart format lib/src/nitric lib/src/google \ No newline at end of file diff --git a/pubspec.yaml b/pubspec.yaml index a86b7ad..9912bd7 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -10,14 +10,13 @@ environment: dependencies: fixnum: ^1.1.0 grpc: ^3.2.4 + http: ^1.2.1 meta: ^1.11.0 protobuf: ^3.1.0 - protobuf_wellknown: ^0.1.1 uuid: ^4.3.2 # path: ^1.8.0 dev_dependencies: - build_runner: ^2.4.8 lints: ^2.1.0 - mockito: ^5.4.4 + mocktail: ^1.0.3 test: ^1.24.0 diff --git a/test/src/api/bucket_test.dart b/test/src/api/bucket_test.dart new file mode 100644 index 0000000..a0093c6 --- /dev/null +++ b/test/src/api/bucket_test.dart @@ -0,0 +1,202 @@ +import 'dart:convert'; + +import 'package:fixnum/fixnum.dart'; +import 'package:mocktail/mocktail.dart'; +import 'package:nitric_sdk/api.dart'; +import 'package:nitric_sdk/src/google/protobuf/duration.pb.dart'; +import 'package:nitric_sdk/src/nitric/proto/storage/v1/storage.pbgrpc.dart'; +import 'package:test/test.dart'; + +import '../common.dart'; + +class MockStorageClient extends Mock implements StorageClient {} + +void main() { + late MockStorageClient storageClient; + + setUp(() => storageClient = MockStorageClient()); + + tearDown(() => reset(storageClient)); + + test('Test build bucket', () { + var bucket = Bucket("bucketName", client: storageClient); + + expect(bucket.name, "bucketName"); + }); + + test('Test get file reference', () { + var bucket = Bucket("bucketName", client: storageClient); + + var file = bucket.file("fileName"); + + expect(file.key, "fileName"); + }); + + test('Test write to file', () async { + var req = StorageWriteRequest( + bucketName: "bucketName", + key: "fileName", + body: utf8.encode("contents")); + + var resp = StorageWriteResponse(); + + when(() => storageClient.write(req)) + .thenAnswer((_) => MockResponseFuture.value(resp)); + + var bucket = Bucket("bucketName", client: storageClient); + + await bucket.file("fileName").write("contents"); + + verify(() => storageClient.write(req)).called(1); + }); + + test('Test read from file', () async { + var req = StorageReadRequest( + bucketName: "bucketName", + key: "fileName", + ); + + var resp = StorageReadResponse( + body: utf8.encode("bucket contents"), + ); + + when(() => storageClient.read(req)) + .thenAnswer((_) => MockResponseFuture.value(resp)); + + var bucket = Bucket("bucketName", client: storageClient); + + var contents = await bucket.file("fileName").read(); + + verify(() => storageClient.read(req)).called(1); + + expect(contents, "bucket contents"); + }); + + test('Test delete file', () async { + var req = StorageDeleteRequest( + bucketName: "bucketName", + key: "fileName", + ); + + var resp = StorageDeleteResponse(); + + when(() => storageClient.delete(req)) + .thenAnswer((_) => MockResponseFuture.value(resp)); + + var bucket = Bucket("bucketName", client: storageClient); + + await bucket.file("fileName").delete(); + + verify(() => storageClient.delete(req)).called(1); + }); + + test('Test get download url with default expiry', () async { + var req = StoragePreSignUrlRequest( + bucketName: "bucketName", + key: "fileName", + operation: StoragePreSignUrlRequest_Operation.READ, + expiry: Duration(seconds: Int64(600))); + + var resp = StoragePreSignUrlResponse(url: "https://test.com/image"); + + when(() => storageClient.preSignUrl(req)) + .thenAnswer((_) => MockResponseFuture.value(resp)); + + var bucket = Bucket("bucketName", client: storageClient); + + var url = await bucket.file("fileName").getDownloadUrl(); + + verify(() => storageClient.preSignUrl(req)).called(1); + + expect(url, "https://test.com/image"); + }); + + test('Test get download url with valid expiry', () async { + var req = StoragePreSignUrlRequest( + bucketName: "bucketName", + key: "fileName", + operation: StoragePreSignUrlRequest_Operation.READ, + expiry: Duration(seconds: Int64(3600))); + + var resp = StoragePreSignUrlResponse(url: "https://test.com/image"); + + when(() => storageClient.preSignUrl(req)) + .thenAnswer((_) => MockResponseFuture.value(resp)); + + var bucket = Bucket("bucketName", client: storageClient); + + var url = await bucket.file("fileName").getDownloadUrl(3600); + + verify(() => storageClient.preSignUrl(req)).called(1); + + expect(url, "https://test.com/image"); + }); + + test('Test get download url with out of bounds expiry', () async { + var bucket = Bucket("bucketName", client: storageClient); + + try { + await bucket.file("fileName").getDownloadUrl(604801); + + expect(true, false); // expecting to throw error + } on ArgumentError catch (e) { + expect(e.toString(), + "Invalid argument (expiry): presigned url expiry must be between 0 and 604800: 604801"); + } + }); + + test('Test get upload url with default expiry', () async { + var req = StoragePreSignUrlRequest( + bucketName: "bucketName", + key: "fileName", + operation: StoragePreSignUrlRequest_Operation.WRITE, + expiry: Duration(seconds: Int64(600))); + + var resp = StoragePreSignUrlResponse(url: "https://test.com/image"); + + when(() => storageClient.preSignUrl(req)) + .thenAnswer((_) => MockResponseFuture.value(resp)); + + var bucket = Bucket("bucketName", client: storageClient); + + var url = await bucket.file("fileName").getUploadUrl(); + + verify(() => storageClient.preSignUrl(req)).called(1); + + expect(url, "https://test.com/image"); + }); + + test('Test get upload url with valid expiry', () async { + var req = StoragePreSignUrlRequest( + bucketName: "bucketName", + key: "fileName", + operation: StoragePreSignUrlRequest_Operation.WRITE, + expiry: Duration(seconds: Int64(3600))); + + var resp = StoragePreSignUrlResponse(url: "https://test.com/image"); + + when(() => storageClient.preSignUrl(req)) + .thenAnswer((_) => MockResponseFuture.value(resp)); + + var bucket = Bucket("bucketName", client: storageClient); + + var url = await bucket.file("fileName").getUploadUrl(3600); + + verify(() => storageClient.preSignUrl(req)).called(1); + + expect(url, "https://test.com/image"); + }); + + test('Test get upload url with out of bounds expiry', () async { + var bucket = Bucket("bucketName", client: storageClient); + + try { + await bucket.file("fileName").getUploadUrl(604801); + + expect(true, false); // expecting to throw error + } on ArgumentError catch (e) { + expect(e.toString(), + "Invalid argument (expiry): presigned url expiry must be between 0 and 604800: 604801"); + } + }); +} diff --git a/test/src/api/keyvalue_test.dart b/test/src/api/keyvalue_test.dart new file mode 100644 index 0000000..9673aa4 --- /dev/null +++ b/test/src/api/keyvalue_test.dart @@ -0,0 +1,108 @@ +import 'package:mocktail/mocktail.dart'; +import 'package:nitric_sdk/src/api/api.dart'; +import 'package:nitric_sdk/src/google/protobuf/struct.pb.dart' as $p; +import 'package:nitric_sdk/src/nitric/proto/kvstore/v1/kvstore.pbgrpc.dart'; +import 'package:test/test.dart'; + +import '../common.dart'; + +class MockKeyValueClient extends Mock implements KvStoreClient {} + +void main() { + late MockKeyValueClient keyValueClient; + + setUp(() => keyValueClient = MockKeyValueClient()); + + tearDown(() => reset(keyValueClient)); + + test('Test build key value store', () { + var kv = KeyValueStore("keyvalueName", client: keyValueClient); + + expect(kv.name, "keyvalueName"); + }); + + test('Test set to key value store', () async { + var contents = $p.Struct(); + contents.fields["message"] = $p.Value(stringValue: "test"); + + var req = KvStoreSetValueRequest( + ref: ValueRef(store: "keyvalueName", key: "keyName"), + content: contents); + + var resp = KvStoreSetValueResponse(); + + when(() => keyValueClient.setValue(req)) + .thenAnswer((_) => MockResponseFuture.value(resp)); + + var kvStore = KeyValueStore("keyvalueName", client: keyValueClient); + + await kvStore.set("keyName", {'message': 'test'}); + + verify(() => keyValueClient.setValue(req)).called(1); + }); + + test('Test get to key value store', () async { + var contents = $p.Struct(); + contents.fields["message"] = $p.Value(stringValue: "test"); + + var req = KvStoreGetValueRequest( + ref: ValueRef(store: "keyvalueName", key: "keyName"), + ); + + var resp = KvStoreGetValueResponse( + value: Value( + ref: ValueRef(store: "keyvalueName", key: "keyName"), + content: contents)); + + when(() => keyValueClient.getValue(req)) + .thenAnswer((_) => MockResponseFuture.value(resp)); + + var kvStore = KeyValueStore("keyvalueName", client: keyValueClient); + + var keyContents = await kvStore.get("keyName"); + + verify(() => keyValueClient.getValue(req)).called(1); + + expect(keyContents, Map.from({'message': 'test'})); + }); + + test('Test delete from key value store', () async { + var req = KvStoreDeleteKeyRequest( + ref: ValueRef(store: "keyvalueName", key: "keyName"), + ); + + var resp = KvStoreDeleteKeyResponse(); + + when(() => keyValueClient.deleteKey(req)) + .thenAnswer((_) => MockResponseFuture.value(resp)); + + var kvStore = KeyValueStore("keyvalueName", client: keyValueClient); + + await kvStore.delete("keyName"); + + verify(() => keyValueClient.deleteKey(req)).called(1); + }); + + // test('Test get keys from key value store with empty prefix', () async { + // var req = KvStoreScanKeysRequest( + // store: Store(name: "keyvalueName"), + // prefix: "", + // ); + + // var resp = ["first", "second", "third", "fourth", "fifth"] + // .map((key) => KvStoreScanKeysResponse(key: key)) + // .toList(); + + // when(() => keyValueClient.scanKeys(req)) + // .thenAnswer((_) => MockResponseStream.fromIterable(resp)); + + // var kvStore = KeyValueStore("keyvalueName", client: keyValueClient); + + // var keys = kvStore.keys(); + + // verify(() => keyValueClient.scanKeys(req)).called(1); + + // expect(keys.single, "fifth"); + // expect(keys.single, "fourth"); + // }); +} diff --git a/test/src/api/proto_test.dart b/test/src/api/proto_test.dart new file mode 100644 index 0000000..57eebe5 --- /dev/null +++ b/test/src/api/proto_test.dart @@ -0,0 +1,134 @@ +import 'package:nitric_sdk/src/api/api.dart'; +import 'package:nitric_sdk/src/google/protobuf/struct.pb.dart'; +import 'package:test/test.dart'; + +void main() { + test("Test struct from map", () async { + var map = { + "stringValue": "test", + "intValue": 1, + "doubleValue": 1.0, + "boolValue": true, + "listValue": ["stringValue", 1, 1.0, true], + "structValue": {"message": "test"}, + "nullValue": null, + }; + + var struct = Proto.structFromMap(map); + + expect(struct.fields["stringValue"], Value(stringValue: "test")); + expect(struct.fields["intValue"], Value(numberValue: 1)); + expect(struct.fields["doubleValue"], Value(numberValue: 1.0)); + expect(struct.fields["boolValue"], Value(boolValue: true)); + expect( + struct.fields["listValue"], + Value( + listValue: ListValue(values: [ + Value(stringValue: "stringValue"), + Value(numberValue: 1), + Value(numberValue: 1.0), + Value(boolValue: true) + ]))); + expect( + struct.fields["structValue"], + Value( + structValue: + Struct(fields: {"message": Value(stringValue: "test")}))); + expect(struct.fields["nullValue"], Value(nullValue: null)); + }); + + test("Test value from dynamic", () async { + var stringValue = Proto.valueFromDynamic("stringValue"); + expect(stringValue, Value(stringValue: "stringValue")); + + var intValue = Proto.valueFromDynamic(1); + expect(intValue, Value(numberValue: 1)); + + var doubleValue = Proto.valueFromDynamic(1.0); + expect(doubleValue, Value(numberValue: 1.0)); + + var boolValue = Proto.valueFromDynamic(true); + expect(boolValue, Value(boolValue: true)); + + var nullValue = Proto.valueFromDynamic(null); + expect(nullValue, Value(nullValue: null)); + + var listValue = Proto.valueFromDynamic(["stringValue", 1, 1.0, true]); + expect( + listValue, + Value( + listValue: ListValue(values: [ + Value(stringValue: "stringValue"), + Value(numberValue: 1), + Value(numberValue: 1.0), + Value(boolValue: true) + ]))); + + var structValue = Proto.valueFromDynamic({'message': 'test'}); + expect( + structValue, + Value( + structValue: + Struct(fields: {'message': Value(stringValue: "test")}))); + }); + + test("Test dynamic from value", () async { + var stringValue = Proto.dynamicFromValue(Value(stringValue: "stringValue")); + expect(stringValue, "stringValue"); + + var intValue = Proto.dynamicFromValue(Value(numberValue: 1)); + expect(intValue, 1); + + var doubleValue = Proto.dynamicFromValue(Value(numberValue: 1.0)); + expect(doubleValue, 1.0); + + var boolValue = Proto.dynamicFromValue(Value(boolValue: true)); + expect(boolValue, true); + + var nullValue = Proto.dynamicFromValue(Value(nullValue: null)); + expect(nullValue, null); + + var listValue = Proto.dynamicFromValue(Value( + listValue: ListValue(values: [ + Value(stringValue: "stringValue"), + Value(numberValue: 1), + Value(numberValue: 1.0), + Value(boolValue: true) + ]))); + expect(listValue, ["stringValue", 1, 1.0, true]); + + var structValue = Proto.dynamicFromValue(Value( + structValue: Struct(fields: {"message": Value(stringValue: "test")}))); + expect(structValue, {'message': 'test'}); + }); + + test("test map from struct", () async { + var struct = Struct(); + struct.fields["stringValue"] = Value(stringValue: "test"); + struct.fields["intValue"] = Value(numberValue: 1); + struct.fields["doubleValue"] = Value(numberValue: 1.0); + struct.fields["boolValue"] = Value(boolValue: true); + struct.fields["listValue"] = Value( + listValue: ListValue(values: [ + Value(stringValue: "stringValue"), + Value(numberValue: 1), + Value(numberValue: 1.0), + Value(boolValue: true) + ])); + struct.fields["structValue"] = Value( + structValue: Struct(fields: {'message': Value(stringValue: 'test')})); + struct.fields["nullValue"] = Value(nullValue: null); + + var map = Proto.mapFromStruct(struct); + + expect({ + "stringValue": "test", + "intValue": 1, + "doubleValue": 1.0, + "boolValue": true, + "listValue": ["stringValue", 1, 1.0, true], + "structValue": {"message": "test"}, + "nullValue": null, + }, map); + }); +} diff --git a/test/src/api/secret_test.dart b/test/src/api/secret_test.dart new file mode 100644 index 0000000..c22b1e4 --- /dev/null +++ b/test/src/api/secret_test.dart @@ -0,0 +1,83 @@ +import 'dart:convert'; + +import 'package:mocktail/mocktail.dart'; +import 'package:nitric_sdk/api.dart'; +import 'package:nitric_sdk/src/nitric/proto/secrets/v1/secrets.pbgrpc.dart' + as $p; +import 'package:test/test.dart'; + +import '../common.dart'; + +class MockSecretClient extends Mock implements $p.SecretManagerClient {} + +void main() { + late MockSecretClient secretClient; + + setUp(() => secretClient = MockSecretClient()); + + tearDown(() => reset(secretClient)); + + test('Test build secret', () { + var secret = Secret("secretName", client: secretClient); + + expect(secret.name, "secretName"); + }); + + test('Test get secret version', () { + var secret = Secret("secretName", client: secretClient); + + var version = secret.version("versionID"); + + expect(version.version, "versionID"); + }); + + test('Test get latest secret version', () { + var secret = Secret("secretName", client: secretClient); + + var latest = secret.latest(); + + expect(latest.version, "latest"); + }); + + test('Test set new secret', () async { + var req = $p.SecretPutRequest( + secret: $p.Secret(name: "secretName"), value: utf8.encode("contents")); + + var resp = $p.SecretPutResponse( + secretVersion: $p.SecretVersion( + secret: $p.Secret(name: "secretName"), version: "versionID")); + + when(() => secretClient.put(req)) + .thenAnswer((_) => MockResponseFuture.value(resp)); + + var secret = Secret("secretName", client: secretClient); + + await secret.put("contents"); + + verify(() => secretClient.put(req)).called(1); + }); + + test('Test access a secret', () async { + var req = $p.SecretAccessRequest( + secretVersion: $p.SecretVersion( + secret: $p.Secret(name: "secretName"), version: "secretVersion")); + + var resp = $p.SecretAccessResponse( + secretVersion: $p.SecretVersion( + secret: $p.Secret(name: "secretName"), version: "secretVersion"), + value: utf8.encode("secret contents"), + ); + + when(() => secretClient.access(req)) + .thenAnswer((_) => MockResponseFuture.value(resp)); + + var secret = Secret("secretName", client: secretClient); + + var contents = await secret.version("secretVersion").access(); + + verify(() => secretClient.access(req)).called(1); + + expect(contents.value, "secret contents"); + expect(contents.version, "secretVersion"); + }); +} diff --git a/test/src/api/topic_test.dart b/test/src/api/topic_test.dart new file mode 100644 index 0000000..f46fba0 --- /dev/null +++ b/test/src/api/topic_test.dart @@ -0,0 +1,85 @@ +import 'package:fixnum/fixnum.dart'; +import 'package:mocktail/mocktail.dart'; +import 'package:nitric_sdk/api.dart'; +import 'package:nitric_sdk/src/google/protobuf/duration.pb.dart'; +import 'package:nitric_sdk/src/google/protobuf/struct.pb.dart'; +import 'package:nitric_sdk/src/nitric/proto/topics/v1/topics.pbgrpc.dart' as $p; +import 'package:test/test.dart'; + +import '../common.dart'; + +class MockTopicsClient extends Mock implements $p.TopicsClient {} + +void main() { + late MockTopicsClient topicsClient; + + setUp(() => topicsClient = MockTopicsClient()); + + tearDown(() => reset(topicsClient)); + + test('Test build topic', () { + var topic = Topic("topicName", client: topicsClient); + + expect(topic.name, "topicName"); + }); + + test('Test publish event from topic', () async { + var contents = Struct(); + contents.fields["message"] = Value(stringValue: "test"); + + var req = $p.TopicPublishRequest( + topicName: "topicName", + message: $p.TopicMessage(structPayload: contents), + delay: Duration(seconds: Int64())); + + var resp = $p.TopicPublishResponse(); + + when(() => topicsClient.publish(req)) + .thenAnswer((_) => MockResponseFuture.value(resp)); + + var secret = Topic("topicName", client: topicsClient); + + await secret.publish({"message": "test"}); + + verify(() => topicsClient.publish(req)).called(1); + }); + + test('Test publish empty event', () async { + var req = $p.TopicPublishRequest( + topicName: "topicName", + message: $p.TopicMessage(structPayload: Struct()), + delay: Duration(seconds: Int64())); + + var resp = $p.TopicPublishResponse(); + + when(() => topicsClient.publish(req)) + .thenAnswer((_) => MockResponseFuture.value(resp)); + + var secret = Topic("topicName", client: topicsClient); + + await secret.publish({}); + + verify(() => topicsClient.publish(req)).called(1); + }); + + test('Test publish event with 30 second delay', () async { + var contents = Struct(); + contents.fields["message"] = Value(stringValue: "test"); + + var req = $p.TopicPublishRequest( + topicName: "topicName", + message: $p.TopicMessage(structPayload: contents), + delay: Duration(seconds: Int64(30))); + + var resp = $p.TopicPublishResponse(); + + when(() => topicsClient.publish(req)) + .thenAnswer((_) => MockResponseFuture.value(resp)); + + var secret = Topic("topicName", client: topicsClient); + + await secret.publish({"message": "test"}, delay: 30); + + verify(() => topicsClient.publish(req)).called(1); + }); +} diff --git a/test/src/common.dart b/test/src/common.dart new file mode 100644 index 0000000..ecee4b3 --- /dev/null +++ b/test/src/common.dart @@ -0,0 +1,39 @@ +import 'dart:async'; + +import 'package:grpc/grpc.dart'; +import 'package:mocktail/mocktail.dart'; +import 'package:nitric_sdk/src/nitric/proto/resources/v1/resources.pbgrpc.dart'; + +class MockResponseFuture extends Mock implements ResponseFuture { + final Future future; + + MockResponseFuture.value(T value) : future = Future.value(value); + + MockResponseFuture.error(Object error) : future = Future.error(error); + + MockResponseFuture.future(this.future); + + @override + Future then(FutureOr Function(T) onValue, {Function? onError}) => + Future.value(future).then(onValue, onError: onError); +} + +/// A gRPC response producing a stream of values. +class MockResponseStream extends Mock + with Stream + implements ResponseStream { + List contents; + + MockResponseStream.fromIterable(this.contents); + + @override + MockResponseFuture get single { + var content = contents.last; + + contents.removeLast(); + + return MockResponseFuture.value(content); + } +} + +class MockResourceClient extends Mock implements ResourcesClient {} diff --git a/test/src/context/blobevent_test.dart b/test/src/context/blobevent_test.dart new file mode 100644 index 0000000..f732f0f --- /dev/null +++ b/test/src/context/blobevent_test.dart @@ -0,0 +1,40 @@ +import 'package:mocktail/mocktail.dart'; +import 'package:nitric_sdk/api.dart'; +import 'package:nitric_sdk/src/context/common.dart'; +import 'package:nitric_sdk/src/nitric/proto/storage/v1/storage.pbgrpc.dart' + as $pb; +import 'package:test/test.dart'; + +class MockStorageClient extends Mock implements $pb.StorageClient {} + +void main() { + test('Blob Event Context from ServerMessage', () { + var msg = $pb.ServerMessage( + id: 'id', + blobEventRequest: $pb.BlobEventRequest( + bucketName: 'bucketName', + blobEvent: + $pb.BlobEvent(key: "key", type: $pb.BlobEventType.Created)), + ); + + final bucket = Bucket("bucket", client: MockStorageClient()); + + final ctx = BlobEventContext.fromRequest(msg, bucket); + + expect(ctx.req.file.key, msg.blobEventRequest.blobEvent.key); + }); + + test('ClientMessage from Blob Event Context', () { + final ctx = BlobEventContext( + "id", + BlobEventRequest( + File(Bucket("bucket", client: MockStorageClient()), "key")), + BlobEventResponse(true)); + + final clientMessage = ctx.toResponse(); + + expect(clientMessage.id, "id"); + expect(clientMessage.hasBlobEventResponse(), true); + expect(clientMessage.blobEventResponse.success, true); + }); +} diff --git a/test/src/context/http_test.dart b/test/src/context/http_test.dart new file mode 100644 index 0000000..eee9f76 --- /dev/null +++ b/test/src/context/http_test.dart @@ -0,0 +1,51 @@ +import 'dart:convert'; + +import 'package:nitric_sdk/src/context/common.dart'; +import 'package:nitric_sdk/src/nitric/proto/apis/v1/apis.pbgrpc.dart' as $pb; +import 'package:test/test.dart'; + +void main() { + test('HTTP Context from ServerMessage', () { + var msg = $pb.ServerMessage( + id: 'id', + httpRequest: $pb.HttpRequest( + body: utf8.encode("application testing"), + method: "GET", + path: "/test", + headers: { + "Content-Type": + $pb.HeaderValue(value: ["application/test", "test/plain"]) + }, + queryParams: { + "application": $pb.QueryValue(value: ["test", "http"]) + }, + pathParams: { + "id": "testing-1234" + })); + + final ctx = HttpContext.fromRequest(msg); + + expect(ctx.req.body, "application testing"); + expect(ctx.req.path, "/test"); + expect(ctx.req.method, "GET"); + expect(ctx.req.headers, { + "Content-Type": ["application/test", "test/plain"] + }); + expect(ctx.req.pathParams, {"id": "testing-1234"}); + expect(ctx.req.queryParams, { + "application": ["test", "http"] + }); + }); + + test('ClientMessage from HTTP Context', () { + final ctx = HttpContext( + "id", HttpRequest(), HttpResponse("successful response", 400)); + + final clientMessage = ctx.toResponse(); + + expect(clientMessage.id, "id"); + expect(clientMessage.httpResponse.body, utf8.encode("successful response")); + expect(clientMessage.httpResponse.status, 400); + expect(clientMessage.httpResponse.headers, {}); + }); +} diff --git a/test/src/context/interval_test.dart b/test/src/context/interval_test.dart index dab319c..b96df1c 100644 --- a/test/src/context/interval_test.dart +++ b/test/src/context/interval_test.dart @@ -4,14 +4,26 @@ import 'package:nitric_sdk/src/nitric/proto/schedules/v1/schedules.pbgrpc.dart' import 'package:test/test.dart'; void main() { - test('Interval Request from ServerMessage', () { + test('Interval Context from ServerMessage', () { var msg = $pb.ServerMessage( id: 'id', intervalRequest: $pb.IntervalRequest(scheduleName: 'scheduleName'), ); - IntervalContext req = IntervalContext.fromRequest(msg); + final ctx = IntervalContext.fromRequest(msg); - expect(req.req.scheduleName, msg.intervalRequest.scheduleName); + expect(ctx.req.scheduleName, msg.intervalRequest.scheduleName); + }); + + test('ClientMessage from Interval Context', () { + final ctx = IntervalContext( + "id", + IntervalRequest(scheduleName: "scheduleName"), + IntervalResponse(success: true)); + + final clientMessage = ctx.toResponse(); + + expect(clientMessage.id, "id"); + expect(clientMessage.hasIntervalResponse(), true); }); } diff --git a/test/src/context/message_test.dart b/test/src/context/message_test.dart new file mode 100644 index 0000000..8544643 --- /dev/null +++ b/test/src/context/message_test.dart @@ -0,0 +1,36 @@ +import 'package:nitric_sdk/src/context/common.dart'; +import 'package:nitric_sdk/src/google/protobuf/struct.pb.dart'; +import 'package:nitric_sdk/src/nitric/proto/topics/v1/topics.pbgrpc.dart' + as $pb; +import 'package:test/test.dart'; + +void main() { + test('Message Context from ServerMessage', () { + var structPayload = Struct(); + structPayload.fields["message"] = Value(stringValue: "test"); + + var msg = $pb.ServerMessage( + id: 'id', + messageRequest: $pb.MessageRequest( + topicName: 'topicName', + message: $pb.TopicMessage(structPayload: structPayload))); + + final ctx = MessageContext.fromRequest(msg); + + expect(ctx.req.message, {'message': 'test'}); + expect(ctx.req.topicName, msg.messageRequest.topicName); + }); + + test('ClientMessage from Message Context', () { + final ctx = MessageContext( + "id", + MessageRequest("topicName", {"message": "test"}), + MessageResponse(true)); + + final clientMessage = ctx.toResponse(); + + expect(clientMessage.id, "id"); + expect(clientMessage.hasMessageResponse(), true); + expect(clientMessage.messageResponse.success, true); + }); +} diff --git a/test/src/context/websocket_test.dart b/test/src/context/websocket_test.dart new file mode 100644 index 0000000..3103ad0 --- /dev/null +++ b/test/src/context/websocket_test.dart @@ -0,0 +1,39 @@ +import 'dart:convert'; + +import 'package:nitric_sdk/src/context/common.dart'; +import 'package:nitric_sdk/src/nitric/proto/websockets/v1/websockets.pbgrpc.dart' + as $pb; +import 'package:test/test.dart'; + +void main() { + test('Websocket Message Context from ServerMessage', () { + var msg = $pb.ServerMessage( + id: 'id', + websocketEventRequest: $pb.WebsocketEventRequest( + socketName: 'socketName', + connectionId: "connectionId", + message: $pb.WebsocketMessageEvent( + body: utf8.encode("application message")), + )); + + final ctx = WebsocketContext.fromRequest(msg); + + expect(ctx.req.socketName, "socketName"); + expect(ctx.req.connectionId, "connectionId"); + expect(ctx.req.message, "application message"); + expect(ctx.req.eventType, WebsocketEvent.message); + }); + + test('ClientMessage from Websocket Context', () { + final ctx = MessageContext( + "id", + MessageRequest("topicName", {"message": "test"}), + MessageResponse(true)); + + final clientMessage = ctx.toResponse(); + + expect(clientMessage.id, "id"); + expect(clientMessage.hasMessageResponse(), true); + expect(clientMessage.messageResponse.success, true); + }); +} diff --git a/test/src/resources/api_test.dart b/test/src/resources/api_test.dart new file mode 100644 index 0000000..9172dff --- /dev/null +++ b/test/src/resources/api_test.dart @@ -0,0 +1,37 @@ +import 'package:mocktail/mocktail.dart'; +import 'package:nitric_sdk/src/nitric/proto/resources/v1/resources.pb.dart'; +import 'package:nitric_sdk/src/resources/common.dart'; +import 'package:test/test.dart'; + +import '../common.dart'; + +void main() { + late MockResourceClient resourceClient; + + setUp(() => resourceClient = MockResourceClient()); + + tearDown(() => reset(resourceClient)); + + test("Test build api", () async { + var api = Api("apiName", client: resourceClient); + + expect(api.name, "apiName"); + }); + + test("Test register api", () async { + var api = Api("apiName", client: resourceClient); + + var req = ResourceDeclareRequest( + id: ResourceIdentifier(name: "apiName", type: ResourceType.Api), + api: ApiResource(security: {})); + + var resp = ResourceDeclareResponse(); + + when(() => resourceClient.declare(req)) + .thenAnswer((_) => MockResponseFuture.value(resp)); + + await api.register(); + + verify(() => resourceClient.declare(req)).called(1); + }); +} diff --git a/test/src/resources/bucket_test.dart b/test/src/resources/bucket_test.dart new file mode 100644 index 0000000..359b433 --- /dev/null +++ b/test/src/resources/bucket_test.dart @@ -0,0 +1,66 @@ +import 'package:mocktail/mocktail.dart'; +import 'package:nitric_sdk/resources.dart'; +import 'package:nitric_sdk/src/nitric/proto/resources/v1/resources.pb.dart' + as $p; +import 'package:nitric_sdk/src/resources/common.dart'; +import 'package:test/test.dart'; + +import '../common.dart'; + +void main() { + late MockResourceClient resourceClient; + + setUp(() => resourceClient = MockResourceClient()); + + tearDown(() => reset(resourceClient)); + + test("Test build bucket resource", () async { + var bucket = BucketResource("bucketName", client: resourceClient); + + expect(bucket.name, "bucketName"); + }); + + test("Test register bucket resource", () async { + var bucket = BucketResource("bucketName", client: resourceClient); + + var req = $p.ResourceDeclareRequest( + id: $p.ResourceIdentifier( + name: "bucketName", type: $p.ResourceType.Bucket), + bucket: $p.BucketResource()); + + var resp = $p.ResourceDeclareResponse(); + + when(() => resourceClient.declare(req)) + .thenAnswer((_) => MockResponseFuture.value(resp)); + + await bucket.register(); + + verify(() => resourceClient.declare(req)).called(1); + }); + + test("Test converting bucket permissions to actions", () async { + var bucket = BucketResource("bucketName", client: resourceClient); + + var readActions = bucket.permissionsToActions([BucketPermission.reading]); + expect(readActions, [$p.Action.BucketFileGet, $p.Action.BucketFileList]); + + var writeActions = bucket.permissionsToActions([BucketPermission.writing]); + expect(writeActions, [$p.Action.BucketFilePut]); + + var deleteActions = + bucket.permissionsToActions([BucketPermission.deleting]); + expect(deleteActions, [$p.Action.BucketFileDelete]); + + var allActions = bucket.permissionsToActions([ + BucketPermission.reading, + BucketPermission.writing, + BucketPermission.deleting + ]); + expect(allActions, [ + $p.Action.BucketFileGet, + $p.Action.BucketFileList, + $p.Action.BucketFilePut, + $p.Action.BucketFileDelete, + ]); + }); +} diff --git a/test/src/resources/keyvalue_test.dart b/test/src/resources/keyvalue_test.dart new file mode 100644 index 0000000..6677ade --- /dev/null +++ b/test/src/resources/keyvalue_test.dart @@ -0,0 +1,65 @@ +import 'package:mocktail/mocktail.dart'; +import 'package:nitric_sdk/resources.dart'; +import 'package:nitric_sdk/src/nitric/proto/resources/v1/resources.pb.dart' + as $p; +import 'package:nitric_sdk/src/resources/common.dart'; +import 'package:test/test.dart'; + +import '../common.dart'; + +void main() { + late MockResourceClient resourceClient; + + setUp(() => resourceClient = MockResourceClient()); + + tearDown(() => reset(resourceClient)); + + test("Test build key value resource", () async { + var kv = KeyValueStoreResource("kvStoreName", client: resourceClient); + + expect(kv.name, "kvStoreName"); + }); + + test("Test register key value resource", () async { + var kv = KeyValueStoreResource("kvStoreName", client: resourceClient); + + var req = $p.ResourceDeclareRequest( + id: $p.ResourceIdentifier( + name: "kvStoreName", type: $p.ResourceType.KeyValueStore), + keyValueStore: $p.KeyValueStoreResource()); + + var resp = $p.ResourceDeclareResponse(); + + when(() => resourceClient.declare(req)) + .thenAnswer((_) => MockResponseFuture.value(resp)); + + await kv.register(); + + verify(() => resourceClient.declare(req)).called(1); + }); + + test("Test converting key value permissions to actions", () async { + var kv = KeyValueStoreResource("kvStoreName", client: resourceClient); + + var getActions = kv.permissionsToActions([KeyValueStorePermission.getting]); + expect(getActions, [$p.Action.KeyValueStoreRead]); + + var setActions = kv.permissionsToActions([KeyValueStorePermission.setting]); + expect(setActions, [$p.Action.KeyValueStoreWrite]); + + var deleteActions = + kv.permissionsToActions([KeyValueStorePermission.deleting]); + expect(deleteActions, [$p.Action.KeyValueStoreDelete]); + + var allActions = kv.permissionsToActions([ + KeyValueStorePermission.getting, + KeyValueStorePermission.setting, + KeyValueStorePermission.deleting + ]); + expect(allActions, [ + $p.Action.KeyValueStoreRead, + $p.Action.KeyValueStoreWrite, + $p.Action.KeyValueStoreDelete, + ]); + }); +} diff --git a/test/src/resources/oidc_test.dart b/test/src/resources/oidc_test.dart new file mode 100644 index 0000000..69d74fc --- /dev/null +++ b/test/src/resources/oidc_test.dart @@ -0,0 +1,48 @@ +import 'package:mocktail/mocktail.dart'; +import 'package:nitric_sdk/src/nitric/proto/resources/v1/resources.pb.dart'; +import 'package:nitric_sdk/src/resources/common.dart'; +import 'package:test/test.dart'; + +import '../common.dart'; + +void main() { + late MockResourceClient resourceClient; + + setUp(() => resourceClient = MockResourceClient()); + + tearDown(() => reset(resourceClient)); + + test("Test build oidc", () async { + var opts = + OidcOptions("oidcName", "http://test-issuer", ["users"], ["user:read"]); + + expect(opts.name, "oidcName"); + expect(opts.issuer, "http://test-issuer"); + expect(opts.audiences, ["users"]); + expect(opts.scopes, ["user:read"]); + }); + + test("Test register oidc", () async { + var opts = + OidcOptions("oidcName", "http://test-issuer", ["users"], ["user:read"]); + + var oidc = OidcSecurityDefinition("apiName", opts, client: resourceClient); + + var req = ResourceDeclareRequest( + id: ResourceIdentifier( + name: "oidcName", type: ResourceType.ApiSecurityDefinition), + apiSecurityDefinition: ApiSecurityDefinitionResource( + apiName: "apiName", + oidc: ApiOpenIdConnectionDefinition( + audiences: ["users"], issuer: "http://test-issuer"))); + + var resp = ResourceDeclareResponse(); + + when(() => resourceClient.declare(req)) + .thenAnswer((_) => MockResponseFuture.value(resp)); + + await oidc.register(); + + verify(() => resourceClient.declare(req)).called(1); + }); +} diff --git a/test/src/resources/queue_test.dart b/test/src/resources/queue_test.dart new file mode 100644 index 0000000..309e510 --- /dev/null +++ b/test/src/resources/queue_test.dart @@ -0,0 +1,61 @@ +import 'package:mocktail/mocktail.dart'; +import 'package:nitric_sdk/resources.dart'; +import 'package:nitric_sdk/src/nitric/proto/resources/v1/resources.pb.dart' + as $p; +import 'package:nitric_sdk/src/resources/common.dart'; +import 'package:test/test.dart'; + +import '../common.dart'; + +void main() { + late MockResourceClient resourceClient; + + setUp(() => resourceClient = MockResourceClient()); + + tearDown(() => reset(resourceClient)); + + test("Test build queue resource", () async { + var queue = QueueResource("queueName", client: resourceClient); + + expect(queue.name, "queueName"); + }); + + test("Test register queue resource", () async { + var queue = QueueResource("queueName", client: resourceClient); + + var req = $p.ResourceDeclareRequest( + id: $p.ResourceIdentifier( + name: "queueName", type: $p.ResourceType.Queue), + queue: $p.QueueResource()); + + var resp = $p.ResourceDeclareResponse(); + + when(() => resourceClient.declare(req)) + .thenAnswer((_) => MockResponseFuture.value(resp)); + + await queue.register(); + + verify(() => resourceClient.declare(req)).called(1); + }); + + test("Test converting queue permissions to actions", () async { + var queue = QueueResource("queueName", client: resourceClient); + + var enqueueActions = + queue.permissionsToActions([QueuePermission.enqueueing]); + expect(enqueueActions, [$p.Action.QueueEnqueue]); + + var dequeueActions = + queue.permissionsToActions([QueuePermission.dequeueing]); + expect(dequeueActions, [$p.Action.QueueDequeue]); + + var allActions = queue.permissionsToActions([ + QueuePermission.enqueueing, + QueuePermission.dequeueing, + ]); + expect(allActions, [ + $p.Action.QueueEnqueue, + $p.Action.QueueDequeue, + ]); + }); +} diff --git a/test/src/resources/schedule_test.dart b/test/src/resources/schedule_test.dart new file mode 100644 index 0000000..f31ebe3 --- /dev/null +++ b/test/src/resources/schedule_test.dart @@ -0,0 +1,37 @@ +import 'package:mocktail/mocktail.dart'; +import 'package:nitric_sdk/src/nitric/proto/resources/v1/resources.pb.dart'; +import 'package:nitric_sdk/src/resources/common.dart'; +import 'package:test/test.dart'; + +import '../common.dart'; + +void main() { + late MockResourceClient resourceClient; + + setUp(() => resourceClient = MockResourceClient()); + + tearDown(() => reset(resourceClient)); + + test("Test build schedule", () async { + var schedule = Schedule("scheduleName", client: resourceClient); + + expect(schedule.name, "scheduleName"); + }); + + test("Test register schedule", () async { + var api = Schedule("scheduleName", client: resourceClient); + + var req = ResourceDeclareRequest( + id: ResourceIdentifier( + name: "scheduleName", type: ResourceType.Schedule)); + + var resp = ResourceDeclareResponse(); + + when(() => resourceClient.declare(req)) + .thenAnswer((_) => MockResponseFuture.value(resp)); + + await api.register(); + + verify(() => resourceClient.declare(req)).called(1); + }); +} diff --git a/test/src/resources/secret_test.dart b/test/src/resources/secret_test.dart new file mode 100644 index 0000000..18f3599 --- /dev/null +++ b/test/src/resources/secret_test.dart @@ -0,0 +1,61 @@ +import 'package:mocktail/mocktail.dart'; +import 'package:nitric_sdk/resources.dart'; +import 'package:nitric_sdk/src/nitric/proto/resources/v1/resources.pb.dart' + as $p; +import 'package:nitric_sdk/src/resources/common.dart'; +import 'package:test/test.dart'; + +import '../common.dart'; + +void main() { + late MockResourceClient resourceClient; + + setUp(() => resourceClient = MockResourceClient()); + + tearDown(() => reset(resourceClient)); + + test("Test build secret resource", () async { + var secret = SecretResource("secretName", client: resourceClient); + + expect(secret.name, "secretName"); + }); + + test("Test register secret resource", () async { + var secret = SecretResource("secretName", client: resourceClient); + + var req = $p.ResourceDeclareRequest( + id: $p.ResourceIdentifier( + name: "secretName", type: $p.ResourceType.Secret), + secret: $p.SecretResource()); + + var resp = $p.ResourceDeclareResponse(); + + when(() => resourceClient.declare(req)) + .thenAnswer((_) => MockResponseFuture.value(resp)); + + await secret.register(); + + verify(() => resourceClient.declare(req)).called(1); + }); + + test("Test converting secret permissions to actions", () async { + var secret = SecretResource("secretName", client: resourceClient); + + var accessActions = + secret.permissionsToActions([SecretPermission.accessing]); + expect(accessActions, [$p.Action.SecretAccess]); + + var dequeueActions = + secret.permissionsToActions([SecretPermission.putting]); + expect(dequeueActions, [$p.Action.SecretPut]); + + var allActions = secret.permissionsToActions([ + SecretPermission.accessing, + SecretPermission.putting, + ]); + expect(allActions, [ + $p.Action.SecretAccess, + $p.Action.SecretPut, + ]); + }); +} diff --git a/test/src/resources/topic_test.dart b/test/src/resources/topic_test.dart new file mode 100644 index 0000000..99a8f74 --- /dev/null +++ b/test/src/resources/topic_test.dart @@ -0,0 +1,37 @@ +import 'package:mocktail/mocktail.dart'; +import 'package:nitric_sdk/src/nitric/proto/resources/v1/resources.pb.dart'; +import 'package:nitric_sdk/src/resources/common.dart'; +import 'package:test/test.dart'; + +import '../common.dart'; + +void main() { + late MockResourceClient resourceClient; + + setUp(() => resourceClient = MockResourceClient()); + + tearDown(() => reset(resourceClient)); + + test("Test build topic", () async { + var topic = Topic("topicName", client: resourceClient); + + expect(topic.name, "topicName"); + }); + + test("Test register topic", () async { + var topic = Topic("topicName", client: resourceClient); + + var req = ResourceDeclareRequest( + id: ResourceIdentifier(name: "topicName", type: ResourceType.Topic), + topic: TopicResource()); + + var resp = ResourceDeclareResponse(); + + when(() => resourceClient.declare(req)) + .thenAnswer((_) => MockResponseFuture.value(resp)); + + await topic.register(); + + verify(() => resourceClient.declare(req)).called(1); + }); +} diff --git a/test/src/resources/websocket_test.dart b/test/src/resources/websocket_test.dart new file mode 100644 index 0000000..1f29280 --- /dev/null +++ b/test/src/resources/websocket_test.dart @@ -0,0 +1,37 @@ +import 'package:mocktail/mocktail.dart'; +import 'package:nitric_sdk/src/nitric/proto/resources/v1/resources.pb.dart'; +import 'package:nitric_sdk/src/resources/common.dart'; +import 'package:test/test.dart'; + +import '../common.dart'; + +void main() { + late MockResourceClient resourceClient; + + setUp(() => resourceClient = MockResourceClient()); + + tearDown(() => reset(resourceClient)); + + test("Test build websocket", () async { + var websocket = Websocket("websocketName", client: resourceClient); + + expect(websocket.name, "websocketName"); + }); + + test("Test register websocket", () async { + var websocket = Websocket("websocketName", client: resourceClient); + + var req = ResourceDeclareRequest( + id: ResourceIdentifier( + name: "websocketName", type: ResourceType.Websocket)); + + var resp = ResourceDeclareResponse(); + + when(() => resourceClient.declare(req)) + .thenAnswer((_) => MockResponseFuture.value(resp)); + + await websocket.register(); + + verify(() => resourceClient.declare(req)).called(1); + }); +}