From 0072ec2b6bcd21e36411cbfafbf0cf2983763e03 Mon Sep 17 00:00:00 2001 From: Ryan Cartwright <39504851+HomelessDinosaur@users.noreply.github.com> Date: Wed, 10 Jul 2024 13:20:26 +1000 Subject: [PATCH] feat: Sql support (#29) Co-authored-by: Tim Holm --- example/services/nitric_example.dart | 1 - lib/src/api/api.dart | 4 + lib/src/api/bucket.dart | 47 +++-- lib/src/api/keyvalue.dart | 33 ++-- lib/src/api/queue.dart | 27 ++- lib/src/api/secret.dart | 28 ++- lib/src/api/sql.dart | 58 ++++++ lib/src/api/topic.dart | 23 ++- lib/src/nitric.dart | 7 + .../proto/deployments/v1/deployments.pb.dart | 124 +++++++++++-- .../deployments/v1/deployments.pbjson.dart | 28 ++- .../nitric/proto/keyvalue/v1/keyvalue.pb.dart | 26 +-- .../nitric/proto/kvstore/v1/kvstore.pb.dart | 26 +-- lib/src/nitric/proto/queues/v1/queues.pb.dart | 14 +- .../proto/resources/v1/resources.pb.dart | 168 +++++++++++++++++- .../proto/resources/v1/resources.pbenum.dart | 3 + .../proto/resources/v1/resources.pbjson.dart | 60 ++++++- lib/src/nitric/proto/sql/v1/sql.pb.dart | 151 ++++++++++++++++ lib/src/nitric/proto/sql/v1/sql.pbenum.dart | 10 ++ lib/src/nitric/proto/sql/v1/sql.pbgrpc.dart | 67 +++++++ lib/src/nitric/proto/sql/v1/sql.pbjson.dart | 48 +++++ .../nitric/proto/storage/v1/storage.pb.dart | 14 +- lib/src/nitric/proto/topics/v1/topics.pb.dart | 28 +-- .../nitric/proto/topics/v1/topics.pbgrpc.dart | 46 ++--- .../websockets/v1/websockets.pbgrpc.dart | 104 +++++------ lib/src/workers/api.dart | 3 +- lib/src/workers/blob_event.dart | 4 +- lib/src/workers/common.dart | 9 +- lib/src/workers/file_event.dart | 4 +- lib/src/workers/interval.dart | 3 +- lib/src/workers/subscription.dart | 4 +- lib/src/workers/websocket.dart | 4 +- makefile | 8 +- test/src/api/keyvalue_test.dart | 4 +- test/src/api/sql_test.dart | 46 +++++ 35 files changed, 1015 insertions(+), 219 deletions(-) create mode 100644 lib/src/api/sql.dart create mode 100644 lib/src/nitric/proto/sql/v1/sql.pb.dart create mode 100644 lib/src/nitric/proto/sql/v1/sql.pbenum.dart create mode 100644 lib/src/nitric/proto/sql/v1/sql.pbgrpc.dart create mode 100644 lib/src/nitric/proto/sql/v1/sql.pbjson.dart create mode 100644 test/src/api/sql_test.dart diff --git a/example/services/nitric_example.dart b/example/services/nitric_example.dart index eb9650e..8a07c27 100644 --- a/example/services/nitric_example.dart +++ b/example/services/nitric_example.dart @@ -1,5 +1,4 @@ import 'package:nitric_sdk/nitric.dart'; -import 'package:nitric_sdk/resources.dart'; import 'package:uuid/uuid.dart'; class Profile { diff --git a/lib/src/api/api.dart b/lib/src/api/api.dart index 5afefcf..ccb6407 100644 --- a/lib/src/api/api.dart +++ b/lib/src/api/api.dart @@ -1,6 +1,10 @@ +import 'package:grpc/grpc.dart'; + export 'bucket.dart'; export 'keyvalue.dart'; export 'secret.dart'; export 'topic.dart'; export 'proto.dart'; export 'queue.dart'; + +typedef UseClientCallback = Future Function(T); diff --git a/lib/src/api/bucket.dart b/lib/src/api/bucket.dart index 16073d0..97d450d 100644 --- a/lib/src/api/bucket.dart +++ b/lib/src/api/bucket.dart @@ -1,6 +1,7 @@ import 'dart:async'; import 'dart:convert'; +import 'package:nitric_sdk/src/api/api.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' @@ -10,21 +11,15 @@ import 'package:fixnum/fixnum.dart'; import 'package:nitric_sdk/src/workers/common.dart'; class Bucket { - late $p.StorageClient _storageClient; - late $p.StorageListenerClient? _storageListenerClient; + late final $p.StorageClient? _storageClient; + late final $p.StorageListenerClient? _storageListenerClient; String name; Bucket(this.name, - {$p.StorageClient? client, - $p.StorageListenerClient? storageListenerClient}) { - if (client == null) { - _storageClient = - $p.StorageClient(ClientChannelSingleton.instance.clientChannel); - } else { - _storageClient = client; - } - + {$p.StorageListenerClient? storageListenerClient, + $p.StorageClient? client}) { + _storageClient = client; _storageListenerClient = storageListenerClient; } @@ -33,12 +28,27 @@ class Bucket { return File(this, key); } + Future _useClient( + UseClientCallback<$p.StorageClient, Resp> callback) async { + final client = _storageClient ?? + $p.StorageClient(ClientChannelSingleton.instance.clientChannel); + + var resp = await callback(client); + + if (_storageClient == null) { + await ClientChannelSingleton.instance.release(); + } + + return resp; + } + /// Get a list of references to the files in the bucket. Optionally supply a [prefix] to filter by. Future> files({String prefix = ""}) async { final request = $p.StorageListBlobsRequest(bucketName: name, prefix: prefix); - var resp = await _storageClient.listBlobs(request); + var resp = + await _useClient((client) async => await client.listBlobs(request)); return resp.blobs.map((blob) => File(this, blob.key)).toList(); } @@ -81,7 +91,7 @@ class File { key: key, ); - await _bucket._storageClient.delete(req); + await _bucket._useClient((client) async => await client.delete(req)); } /// Read the file from the bucket. @@ -91,7 +101,8 @@ class File { key: key, ); - var resp = await _bucket._storageClient.read(req); + var resp = + await _bucket._useClient((client) async => await client.read(req)); return utf8.decode(resp.body); } @@ -106,7 +117,7 @@ class File { body: bytes, ); - await _bucket._storageClient.write(req); + await _bucket._useClient((client) async => await client.write(req)); } /// Check whether the file exists in the bucket. @@ -116,7 +127,8 @@ class File { key: key, ); - var resp = await _bucket._storageClient.exists(req); + var resp = + await _bucket._useClient((client) async => await client.exists(req)); return resp.exists; } @@ -148,7 +160,8 @@ class File { expiry: exp, ); - var resp = await _bucket._storageClient.preSignUrl(req); + var resp = await _bucket + ._useClient((client) async => await client.preSignUrl(req)); return resp.url; } diff --git a/lib/src/api/keyvalue.dart b/lib/src/api/keyvalue.dart index 505a4ae..bacd1aa 100644 --- a/lib/src/api/keyvalue.dart +++ b/lib/src/api/keyvalue.dart @@ -1,3 +1,5 @@ +import 'dart:async'; + import 'package:nitric_sdk/src/api/api.dart'; import 'package:nitric_sdk/src/grpc_helper.dart'; import 'package:nitric_sdk/src/nitric/proto/kvstore/v1/kvstore.pbgrpc.dart' @@ -5,17 +7,26 @@ import 'package:nitric_sdk/src/nitric/proto/kvstore/v1/kvstore.pbgrpc.dart' /// A Key Value Store. class KeyValueStore { - late $p.KvStoreClient _keyValueClient; + late final $p.KvStoreClient? _keyValueClient; final String name; KeyValueStore(this.name, {$p.KvStoreClient? client}) { - if (client == null) { - _keyValueClient = - $p.KvStoreClient(ClientChannelSingleton.instance.clientChannel); - } else { - _keyValueClient = client; + _keyValueClient = client; + } + + Future _useClient( + UseClientCallback<$p.KvStoreClient, Resp> callback) async { + final client = _keyValueClient ?? + $p.KvStoreClient(ClientChannelSingleton.instance.clientChannel); + + var resp = callback(client); + + if (_keyValueClient == null) { + await ClientChannelSingleton.instance.release(); } + + return resp; } /// Get a reference to a [key] in the store. @@ -23,7 +34,7 @@ class KeyValueStore { var req = $p.KvStoreGetValueRequest(ref: $p.ValueRef(key: key, store: name)); - var resp = await _keyValueClient.getValue(req); + var resp = await _useClient((client) async => await client.getValue(req)); return Proto.mapFromStruct(resp.value.content); } @@ -35,7 +46,7 @@ class KeyValueStore { var req = $p.KvStoreSetValueRequest( ref: $p.ValueRef(key: key, store: name), content: content); - await _keyValueClient.setValue(req); + await _useClient((client) async => await client.setValue(req)); } /// Delete a [key] from the store. @@ -43,15 +54,15 @@ class KeyValueStore { var req = $p.KvStoreDeleteKeyRequest(ref: $p.ValueRef(key: key, store: name)); - await _keyValueClient.deleteKey(req); + await _useClient((client) async => await client.deleteKey(req)); } /// Get a stream of key values that match the [prefix]. - Stream keys({String prefix = ""}) { + Future> keys({String prefix = ""}) async { var req = $p.KvStoreScanKeysRequest(store: $p.Store(name: name), prefix: prefix); - var resp = _keyValueClient.scanKeys(req); + var resp = await _useClient((client) async => client.scanKeys(req)); return resp.map((event) => event.key); } diff --git a/lib/src/api/queue.dart b/lib/src/api/queue.dart index c72855d..8ba825d 100644 --- a/lib/src/api/queue.dart +++ b/lib/src/api/queue.dart @@ -5,19 +5,28 @@ 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; + late final $p.QueuesClient? _queuesClient; /// The name of the queue. String name; /// Construct a new queue. Queue(this.name, {$p.QueuesClient? client}) { - if (client == null) { - _queuesClient = - $p.QueuesClient(ClientChannelSingleton.instance.clientChannel); - } else { - _queuesClient = client; + _queuesClient = client; + } + + Future _useClient( + UseClientCallback<$p.QueuesClient, Resp> callback) async { + final client = _queuesClient ?? + $p.QueuesClient(ClientChannelSingleton.instance.clientChannel); + + var resp = callback(client); + + if (_queuesClient == null) { + await ClientChannelSingleton.instance.release(); } + + return resp; } /// Enqueue a list of [messages] to the queue. @@ -31,7 +40,7 @@ class Queue { queueName: name, ); - var resp = await _queuesClient.enqueue(req); + var resp = await _useClient((client) async => await client.enqueue(req)); return resp.failedMessages.map((fm) => FailedMessage(fm)).toList(); } @@ -40,7 +49,7 @@ class Queue { Future> dequeue({int depth = 1}) async { var req = $p.QueueDequeueRequest(queueName: name, depth: depth); - var resp = await _queuesClient.dequeue(req); + var resp = await _useClient((client) async => await client.dequeue(req)); return resp.messages.map((m) => DequeuedMessage(this, m)).toList(); } @@ -64,7 +73,7 @@ class DequeuedMessage { var req = $p.QueueCompleteRequest(leaseId: _leaseId, queueName: _queue.name); - await _queue._queuesClient.complete(req); + await _queue._useClient((client) async => await client.complete(req)); } } diff --git a/lib/src/api/secret.dart b/lib/src/api/secret.dart index c5f22ad..44e9f79 100644 --- a/lib/src/api/secret.dart +++ b/lib/src/api/secret.dart @@ -4,19 +4,30 @@ import 'package:nitric_sdk/src/grpc_helper.dart'; import 'package:nitric_sdk/src/nitric/proto/secrets/v1/secrets.pbgrpc.dart' as $p; +import 'api.dart'; + /// References an encrypted secret stored in a secret manager. class Secret { /// The name of the secret final String name; - late final $p.SecretManagerClient _secretClient; + late final $p.SecretManagerClient? _secretClient; Secret(this.name, {$p.SecretManagerClient? client}) { - if (client == null) { - _secretClient = - $p.SecretManagerClient(ClientChannelSingleton.instance.clientChannel); - } else { - _secretClient = client; + _secretClient = client; + } + + Future _useClient( + UseClientCallback<$p.SecretManagerClient, Resp> callback) async { + final client = _secretClient ?? + $p.SecretManagerClient(ClientChannelSingleton.instance.clientChannel); + + var resp = callback(client); + + if (_secretClient == null) { + await ClientChannelSingleton.instance.release(); } + + return resp; } /// Get a reference to a specific [version] of this secret. @@ -32,7 +43,7 @@ class Secret { /// Put a new [value] to the secret, creating a new secret version and returning it. Future put(String value) async { var req = $p.SecretPutRequest(secret: _toWire(), value: utf8.encode(value)); - var resp = await _secretClient.put(req); + var resp = await _useClient((client) async => client.put(req)); return SecretVersion._fromWire(this, resp.secretVersion); } @@ -60,7 +71,8 @@ class SecretVersion { /// Access the value of this secret version. Future access() async { var req = $p.SecretAccessRequest(secretVersion: _toWire()); - var resp = await _secret._secretClient.access(req); + var resp = + await _secret._useClient((client) async => await client.access(req)); return SecretValue(version, utf8.decode(resp.value)); } diff --git a/lib/src/api/sql.dart b/lib/src/api/sql.dart new file mode 100644 index 0000000..3266482 --- /dev/null +++ b/lib/src/api/sql.dart @@ -0,0 +1,58 @@ +import 'package:nitric_sdk/nitric.dart'; +import 'package:nitric_sdk/src/grpc_helper.dart'; +import 'package:nitric_sdk/src/nitric/proto/resources/v1/resources.pb.dart'; +import 'package:nitric_sdk/src/nitric/proto/resources/v1/resources.pbgrpc.dart' + as $rp; +import 'package:nitric_sdk/src/nitric/proto/sql/v1/sql.pbgrpc.dart' as $p; + +import 'api.dart'; + +/// A Topic for publishing events to subscribers of this topic. +class SqlDatabase extends Resource { + /// The name of the topic + late final String? migrations; + late final $p.SqlClient? _sqlClient; + + SqlDatabase(String name, + {this.migrations, + $p.SqlClient? client, + $rp.ResourcesClient? resourcesClient}) + : super(name, resourcesClient) { + _sqlClient = client; + } + + Future _useClient( + UseClientCallback<$p.SqlClient, Resp> callback) async { + final client = _sqlClient ?? + $p.SqlClient(ClientChannelSingleton.instance.clientChannel); + + var resp = callback(client); + + if (_sqlClient == null) { + await ClientChannelSingleton.instance.release(); + } + + return resp; + } + + /// Returns a connection endpoint to connect to the SQL database + Future connectionString() async { + final req = $p.SqlConnectionStringRequest(databaseName: name); + + final resp = + await _useClient((client) async => await client.connectionString(req)); + + return resp.connectionString; + } + + @override + $rp.ResourceDeclareRequest asRequest() { + var resource = + $rp.ResourceIdentifier(name: name, type: $rp.ResourceType.SqlDatabase); + + return $rp.ResourceDeclareRequest( + id: resource, + sqlDatabase: $rp.SqlDatabaseResource( + migrations: SqlDatabaseMigrations(migrationsPath: migrations))); + } +} diff --git a/lib/src/api/topic.dart b/lib/src/api/topic.dart index 5ba5b69..886ab53 100644 --- a/lib/src/api/topic.dart +++ b/lib/src/api/topic.dart @@ -9,15 +9,24 @@ import 'package:fixnum/fixnum.dart'; class Topic { /// The name of the topic final String name; - late final $p.TopicsClient _topicsClient; + late final $p.TopicsClient? _topicsClient; Topic(this.name, {$p.TopicsClient? client}) { - if (client == null) { - _topicsClient = - $p.TopicsClient(ClientChannelSingleton.instance.clientChannel); - } else { - _topicsClient = client; + _topicsClient = client; + } + + Future _useClient( + UseClientCallback<$p.TopicsClient, Resp> callback) async { + final client = _topicsClient ?? + $p.TopicsClient(ClientChannelSingleton.instance.clientChannel); + + var resp = callback(client); + + if (_topicsClient == null) { + await ClientChannelSingleton.instance.release(); } + + return resp; } /// Publish a [message] to the topic. Optional [delay] (in seconds) can be set to delay the message publish time. @@ -31,6 +40,6 @@ class Topic { delay: $d.Duration(seconds: Int64(delay)), ); - await _topicsClient.publish(req); + await _useClient((client) async => await client.publish(req)); } } diff --git a/lib/src/nitric.dart b/lib/src/nitric.dart index b2919e9..b32ba48 100644 --- a/lib/src/nitric.dart +++ b/lib/src/nitric.dart @@ -1,3 +1,5 @@ +import 'package:nitric_sdk/src/api/sql.dart'; + import 'resources/common.dart'; class Nitric { @@ -47,6 +49,11 @@ class Nitric { static SecretResource secret(String name) => _makeResource(name, SecretResource.new) as SecretResource; + /// Create a [name]d sql database. + static SqlDatabase sql(String name, {String? migrations}) => + _makeResource(name, (name) => SqlDatabase(name, migrations: migrations)) + as SqlDatabase; + /// Create a [name]d topic for registering push-based event handlers. static Topic topic(String name) => _makeResource(name, Topic.new) as Topic; diff --git a/lib/src/nitric/proto/deployments/v1/deployments.pb.dart b/lib/src/nitric/proto/deployments/v1/deployments.pb.dart index d5191f5..85d7666 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 $13; +import '../../../../google/protobuf/struct.pb.dart' as $14; 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, - $13.Struct? attributes, + $14.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<$13.Struct>(2, _omitFieldNames ? '' : 'attributes', - subBuilder: $13.Struct.create) + ..aOM<$14.Struct>(2, _omitFieldNames ? '' : 'attributes', + subBuilder: $14.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) - $13.Struct get attributes => $_getN(1); + $14.Struct get attributes => $_getN(1); @$pb.TagNumber(2) - set attributes($13.Struct v) { + set attributes($14.Struct v) { setField(2, v); } @@ -110,7 +110,7 @@ class DeploymentUpRequest extends $pb.GeneratedMessage { @$pb.TagNumber(2) void clearAttributes() => clearField(2); @$pb.TagNumber(2) - $13.Struct ensureAttributes() => $_ensure(1); + $14.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. @@ -484,7 +484,7 @@ class UpResult extends $pb.GeneratedMessage { class DeploymentDownRequest extends $pb.GeneratedMessage { factory DeploymentDownRequest({ - $13.Struct? attributes, + $14.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<$13.Struct>(1, _omitFieldNames ? '' : 'attributes', - subBuilder: $13.Struct.create) + ..aOM<$14.Struct>(1, _omitFieldNames ? '' : 'attributes', + subBuilder: $14.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) - $13.Struct get attributes => $_getN(0); + $14.Struct get attributes => $_getN(0); @$pb.TagNumber(1) - set attributes($13.Struct v) { + set attributes($14.Struct v) { setField(1, v); } @@ -553,7 +553,7 @@ class DeploymentDownRequest extends $pb.GeneratedMessage { @$pb.TagNumber(1) void clearAttributes() => clearField(1); @$pb.TagNumber(1) - $13.Struct ensureAttributes() => $_ensure(0); + $14.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. @@ -1999,6 +1999,80 @@ class Schedule extends $pb.GeneratedMessage { ScheduleCron ensureCron() => $_ensure(2); } +enum SqlDatabase_Migrations { imageUri, notSet } + +class SqlDatabase extends $pb.GeneratedMessage { + factory SqlDatabase({ + $core.String? imageUri, + }) { + final $result = create(); + if (imageUri != null) { + $result.imageUri = imageUri; + } + return $result; + } + SqlDatabase._() : super(); + factory SqlDatabase.fromBuffer($core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + factory SqlDatabase.fromJson($core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + + static const $core.Map<$core.int, SqlDatabase_Migrations> + _SqlDatabase_MigrationsByTag = { + 1: SqlDatabase_Migrations.imageUri, + 0: SqlDatabase_Migrations.notSet + }; + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'SqlDatabase', + package: const $pb.PackageName( + _omitMessageNames ? '' : 'nitric.proto.deployments.v1'), + createEmptyInstance: create) + ..oo(0, [1]) + ..aOS(1, _omitFieldNames ? '' : 'imageUri') + ..hasRequiredFields = false; + + @$core.Deprecated('Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') + SqlDatabase clone() => SqlDatabase()..mergeFromMessage(this); + @$core.Deprecated('Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + SqlDatabase copyWith(void Function(SqlDatabase) updates) => + super.copyWith((message) => updates(message as SqlDatabase)) + as SqlDatabase; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static SqlDatabase create() => SqlDatabase._(); + SqlDatabase createEmptyInstance() => create(); + static $pb.PbList createRepeated() => $pb.PbList(); + @$core.pragma('dart2js:noInline') + static SqlDatabase getDefault() => _defaultInstance ??= + $pb.GeneratedMessage.$_defaultFor(create); + static SqlDatabase? _defaultInstance; + + SqlDatabase_Migrations whichMigrations() => + _SqlDatabase_MigrationsByTag[$_whichOneof(0)]!; + void clearMigrations() => clearField($_whichOneof(0)); + + /// The URI of a docker image to use to execute the migrations for this database + @$pb.TagNumber(1) + $core.String get imageUri => $_getSZ(0); + @$pb.TagNumber(1) + set imageUri($core.String v) { + $_setString(0, v); + } + + @$pb.TagNumber(1) + $core.bool hasImageUri() => $_has(0); + @$pb.TagNumber(1) + void clearImageUri() => clearField(1); +} + class ScheduleEvery extends $pb.GeneratedMessage { factory ScheduleEvery({ $core.String? rate, @@ -2137,6 +2211,7 @@ enum Resource_Config { websocket, http, queue, + sqlDatabase, notSet } @@ -2154,6 +2229,7 @@ class Resource extends $pb.GeneratedMessage { Websocket? websocket, Http? http, Queue? queue, + SqlDatabase? sqlDatabase, }) { final $result = create(); if (id != null) { @@ -2192,6 +2268,9 @@ class Resource extends $pb.GeneratedMessage { if (queue != null) { $result.queue = queue; } + if (sqlDatabase != null) { + $result.sqlDatabase = sqlDatabase; + } return $result; } Resource._() : super(); @@ -2214,6 +2293,7 @@ class Resource extends $pb.GeneratedMessage { 18: Resource_Config.websocket, 19: Resource_Config.http, 20: Resource_Config.queue, + 21: Resource_Config.sqlDatabase, 0: Resource_Config.notSet }; static final $pb.BuilderInfo _i = $pb.BuilderInfo( @@ -2221,7 +2301,7 @@ class Resource extends $pb.GeneratedMessage { package: const $pb.PackageName( _omitMessageNames ? '' : 'nitric.proto.deployments.v1'), createEmptyInstance: create) - ..oo(0, [10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]) + ..oo(0, [10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21]) ..aOM<$1.ResourceIdentifier>(1, _omitFieldNames ? '' : 'id', subBuilder: $1.ResourceIdentifier.create) ..aOM(10, _omitFieldNames ? '' : 'service', @@ -2242,6 +2322,8 @@ class Resource extends $pb.GeneratedMessage { subBuilder: Websocket.create) ..aOM(19, _omitFieldNames ? '' : 'http', subBuilder: Http.create) ..aOM(20, _omitFieldNames ? '' : 'queue', subBuilder: Queue.create) + ..aOM(21, _omitFieldNames ? '' : 'sqlDatabase', + subBuilder: SqlDatabase.create) ..hasRequiredFields = false; @$core.Deprecated('Using this can add significant overhead to your binary. ' @@ -2435,6 +2517,20 @@ class Resource extends $pb.GeneratedMessage { void clearQueue() => clearField(20); @$pb.TagNumber(20) Queue ensureQueue() => $_ensure(11); + + @$pb.TagNumber(21) + SqlDatabase get sqlDatabase => $_getN(12); + @$pb.TagNumber(21) + set sqlDatabase(SqlDatabase v) { + setField(21, v); + } + + @$pb.TagNumber(21) + $core.bool hasSqlDatabase() => $_has(12); + @$pb.TagNumber(21) + void clearSqlDatabase() => clearField(21); + @$pb.TagNumber(21) + SqlDatabase ensureSqlDatabase() => $_ensure(12); } /// This is already defined in the resource contracts, diff --git a/lib/src/nitric/proto/deployments/v1/deployments.pbjson.dart b/lib/src/nitric/proto/deployments/v1/deployments.pbjson.dart index 16012d8..fe5737f 100644 --- a/lib/src/nitric/proto/deployments/v1/deployments.pbjson.dart +++ b/lib/src/nitric/proto/deployments/v1/deployments.pbjson.dart @@ -610,6 +610,22 @@ final $typed_data.Uint8List scheduleDescriptor = $convert.base64Decode( 'RyaWMucHJvdG8uZGVwbG95bWVudHMudjEuU2NoZWR1bGVDcm9uSABSBGNyb25CCQoHY2FkZW5j' 'ZQ=='); +@$core.Deprecated('Use sqlDatabaseDescriptor instead') +const SqlDatabase$json = { + '1': 'SqlDatabase', + '2': [ + {'1': 'image_uri', '3': 1, '4': 1, '5': 9, '9': 0, '10': 'imageUri'}, + ], + '8': [ + {'1': 'migrations'}, + ], +}; + +/// Descriptor for `SqlDatabase`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List sqlDatabaseDescriptor = $convert.base64Decode( + 'CgtTcWxEYXRhYmFzZRIdCglpbWFnZV91cmkYASABKAlIAFIIaW1hZ2VVcmlCDAoKbWlncmF0aW' + '9ucw=='); + @$core.Deprecated('Use scheduleEveryDescriptor instead') const ScheduleEvery$json = { '1': 'ScheduleEvery', @@ -745,6 +761,15 @@ const Resource$json = { '9': 0, '10': 'queue' }, + { + '1': 'sql_database', + '3': 21, + '4': 1, + '5': 11, + '6': '.nitric.proto.deployments.v1.SqlDatabase', + '9': 0, + '10': 'sqlDatabase' + }, ], '8': [ {'1': 'config'}, @@ -767,7 +792,8 @@ final $typed_data.Uint8List resourceDescriptor = $convert.base64Decode( 'gSIAEoCzImLm5pdHJpYy5wcm90by5kZXBsb3ltZW50cy52MS5XZWJzb2NrZXRIAFIJd2Vic29j' 'a2V0EjcKBGh0dHAYEyABKAsyIS5uaXRyaWMucHJvdG8uZGVwbG95bWVudHMudjEuSHR0cEgAUg' 'RodHRwEjoKBXF1ZXVlGBQgASgLMiIubml0cmljLnByb3RvLmRlcGxveW1lbnRzLnYxLlF1ZXVl' - 'SABSBXF1ZXVlQggKBmNvbmZpZw=='); + 'SABSBXF1ZXVlEk0KDHNxbF9kYXRhYmFzZRgVIAEoCzIoLm5pdHJpYy5wcm90by5kZXBsb3ltZW' + '50cy52MS5TcWxEYXRhYmFzZUgAUgtzcWxEYXRhYmFzZUIICgZjb25maWc='); @$core.Deprecated('Use policyDescriptor instead') const Policy$json = { diff --git a/lib/src/nitric/proto/keyvalue/v1/keyvalue.pb.dart b/lib/src/nitric/proto/keyvalue/v1/keyvalue.pb.dart index 8179c09..e9d4f60 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 $13; +import '../../../../google/protobuf/struct.pb.dart' as $14; /// 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, - $13.Struct? content, + $14.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<$13.Struct>(2, _omitFieldNames ? '' : 'content', - subBuilder: $13.Struct.create) + ..aOM<$14.Struct>(2, _omitFieldNames ? '' : 'content', + subBuilder: $14.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) - $13.Struct get content => $_getN(1); + $14.Struct get content => $_getN(1); @$pb.TagNumber(2) - set content($13.Struct v) { + set content($14.Struct v) { setField(2, v); } @@ -240,7 +240,7 @@ class Value extends $pb.GeneratedMessage { @$pb.TagNumber(2) void clearContent() => clearField(2); @$pb.TagNumber(2) - $13.Struct ensureContent() => $_ensure(1); + $14.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, - $13.Struct? content, + $14.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<$13.Struct>(3, _omitFieldNames ? '' : 'content', - subBuilder: $13.Struct.create) + ..aOM<$14.Struct>(3, _omitFieldNames ? '' : 'content', + subBuilder: $14.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) - $13.Struct get content => $_getN(1); + $14.Struct get content => $_getN(1); @$pb.TagNumber(3) - set content($13.Struct v) { + set content($14.Struct v) { setField(3, v); } @@ -458,7 +458,7 @@ class KeyValueSetRequest extends $pb.GeneratedMessage { @$pb.TagNumber(3) void clearContent() => clearField(3); @$pb.TagNumber(3) - $13.Struct ensureContent() => $_ensure(1); + $14.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 index dc121de..0154b92 100644 --- a/lib/src/nitric/proto/kvstore/v1/kvstore.pb.dart +++ b/lib/src/nitric/proto/kvstore/v1/kvstore.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 $13; +import '../../../../google/protobuf/struct.pb.dart' as $14; /// 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, - $13.Struct? content, + $14.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<$13.Struct>(2, _omitFieldNames ? '' : 'content', - subBuilder: $13.Struct.create) + ..aOM<$14.Struct>(2, _omitFieldNames ? '' : 'content', + subBuilder: $14.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) - $13.Struct get content => $_getN(1); + $14.Struct get content => $_getN(1); @$pb.TagNumber(2) - set content($13.Struct v) { + set content($14.Struct v) { setField(2, v); } @@ -240,7 +240,7 @@ class Value extends $pb.GeneratedMessage { @$pb.TagNumber(2) void clearContent() => clearField(2); @$pb.TagNumber(2) - $13.Struct ensureContent() => $_ensure(1); + $14.Struct ensureContent() => $_ensure(1); } class KvStoreGetValueRequest extends $pb.GeneratedMessage { @@ -381,7 +381,7 @@ class KvStoreGetValueResponse extends $pb.GeneratedMessage { class KvStoreSetValueRequest extends $pb.GeneratedMessage { factory KvStoreSetValueRequest({ ValueRef? ref, - $13.Struct? content, + $14.Struct? content, }) { final $result = create(); if (ref != null) { @@ -407,8 +407,8 @@ class KvStoreSetValueRequest extends $pb.GeneratedMessage { createEmptyInstance: create) ..aOM(1, _omitFieldNames ? '' : 'ref', subBuilder: ValueRef.create) - ..aOM<$13.Struct>(3, _omitFieldNames ? '' : 'content', - subBuilder: $13.Struct.create) + ..aOM<$14.Struct>(3, _omitFieldNames ? '' : 'content', + subBuilder: $14.Struct.create) ..hasRequiredFields = false; @$core.Deprecated('Using this can add significant overhead to your binary. ' @@ -453,9 +453,9 @@ class KvStoreSetValueRequest extends $pb.GeneratedMessage { /// The value content to store (JSON object) @$pb.TagNumber(3) - $13.Struct get content => $_getN(1); + $14.Struct get content => $_getN(1); @$pb.TagNumber(3) - set content($13.Struct v) { + set content($14.Struct v) { setField(3, v); } @@ -464,7 +464,7 @@ class KvStoreSetValueRequest extends $pb.GeneratedMessage { @$pb.TagNumber(3) void clearContent() => clearField(3); @$pb.TagNumber(3) - $13.Struct ensureContent() => $_ensure(1); + $14.Struct ensureContent() => $_ensure(1); } class KvStoreSetValueResponse extends $pb.GeneratedMessage { diff --git a/lib/src/nitric/proto/queues/v1/queues.pb.dart b/lib/src/nitric/proto/queues/v1/queues.pb.dart index fd7b2a2..e50170b 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 $13; +import '../../../../google/protobuf/struct.pb.dart' as $14; 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({ - $13.Struct? structPayload, + $14.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<$13.Struct>(1, _omitFieldNames ? '' : 'structPayload', - subBuilder: $13.Struct.create) + ..aOM<$14.Struct>(1, _omitFieldNames ? '' : 'structPayload', + subBuilder: $14.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) - $13.Struct get structPayload => $_getN(0); + $14.Struct get structPayload => $_getN(0); @$pb.TagNumber(1) - set structPayload($13.Struct v) { + set structPayload($14.Struct v) { setField(1, v); } @@ -487,7 +487,7 @@ class QueueMessage extends $pb.GeneratedMessage { @$pb.TagNumber(1) void clearStructPayload() => clearField(1); @$pb.TagNumber(1) - $13.Struct ensureStructPayload() => $_ensure(0); + $14.Struct ensureStructPayload() => $_ensure(0); } class DequeuedMessage extends $pb.GeneratedMessage { diff --git a/lib/src/nitric/proto/resources/v1/resources.pb.dart b/lib/src/nitric/proto/resources/v1/resources.pb.dart index 9ad603d..35b253d 100644 --- a/lib/src/nitric/proto/resources/v1/resources.pb.dart +++ b/lib/src/nitric/proto/resources/v1/resources.pb.dart @@ -185,6 +185,7 @@ enum ResourceDeclareRequest_Config { api, apiSecurityDefinition, queue, + sqlDatabase, notSet } @@ -199,6 +200,7 @@ class ResourceDeclareRequest extends $pb.GeneratedMessage { ApiResource? api, ApiSecurityDefinitionResource? apiSecurityDefinition, QueueResource? queue, + SqlDatabaseResource? sqlDatabase, }) { final $result = create(); if (id != null) { @@ -228,6 +230,9 @@ class ResourceDeclareRequest extends $pb.GeneratedMessage { if (queue != null) { $result.queue = queue; } + if (sqlDatabase != null) { + $result.sqlDatabase = sqlDatabase; + } return $result; } ResourceDeclareRequest._() : super(); @@ -248,6 +253,7 @@ class ResourceDeclareRequest extends $pb.GeneratedMessage { 15: ResourceDeclareRequest_Config.api, 16: ResourceDeclareRequest_Config.apiSecurityDefinition, 17: ResourceDeclareRequest_Config.queue, + 18: ResourceDeclareRequest_Config.sqlDatabase, 0: ResourceDeclareRequest_Config.notSet }; static final $pb.BuilderInfo _i = $pb.BuilderInfo( @@ -255,7 +261,7 @@ class ResourceDeclareRequest extends $pb.GeneratedMessage { package: const $pb.PackageName( _omitMessageNames ? '' : 'nitric.proto.resources.v1'), createEmptyInstance: create) - ..oo(0, [10, 11, 12, 13, 14, 15, 16, 17]) + ..oo(0, [10, 11, 12, 13, 14, 15, 16, 17, 18]) ..aOM(1, _omitFieldNames ? '' : 'id', subBuilder: ResourceIdentifier.create) ..aOM(10, _omitFieldNames ? '' : 'policy', @@ -275,6 +281,8 @@ class ResourceDeclareRequest extends $pb.GeneratedMessage { subBuilder: ApiSecurityDefinitionResource.create) ..aOM(17, _omitFieldNames ? '' : 'queue', subBuilder: QueueResource.create) + ..aOM(18, _omitFieldNames ? '' : 'sqlDatabase', + subBuilder: SqlDatabaseResource.create) ..hasRequiredFields = false; @$core.Deprecated('Using this can add significant overhead to your binary. ' @@ -431,6 +439,20 @@ class ResourceDeclareRequest extends $pb.GeneratedMessage { void clearQueue() => clearField(17); @$pb.TagNumber(17) QueueResource ensureQueue() => $_ensure(8); + + @$pb.TagNumber(18) + SqlDatabaseResource get sqlDatabase => $_getN(9); + @$pb.TagNumber(18) + set sqlDatabase(SqlDatabaseResource v) { + setField(18, v); + } + + @$pb.TagNumber(18) + $core.bool hasSqlDatabase() => $_has(9); + @$pb.TagNumber(18) + void clearSqlDatabase() => clearField(18); + @$pb.TagNumber(18) + SqlDatabaseResource ensureSqlDatabase() => $_ensure(9); } class BucketResource extends $pb.GeneratedMessage { @@ -640,6 +662,150 @@ class SecretResource extends $pb.GeneratedMessage { static SecretResource? _defaultInstance; } +enum SqlDatabaseMigrations_Migrations { migrationsPath, notSet } + +class SqlDatabaseMigrations extends $pb.GeneratedMessage { + factory SqlDatabaseMigrations({ + $core.String? migrationsPath, + }) { + final $result = create(); + if (migrationsPath != null) { + $result.migrationsPath = migrationsPath; + } + return $result; + } + SqlDatabaseMigrations._() : super(); + factory SqlDatabaseMigrations.fromBuffer($core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + factory SqlDatabaseMigrations.fromJson($core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + + static const $core.Map<$core.int, SqlDatabaseMigrations_Migrations> + _SqlDatabaseMigrations_MigrationsByTag = { + 1: SqlDatabaseMigrations_Migrations.migrationsPath, + 0: SqlDatabaseMigrations_Migrations.notSet + }; + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'SqlDatabaseMigrations', + package: const $pb.PackageName( + _omitMessageNames ? '' : 'nitric.proto.resources.v1'), + createEmptyInstance: create) + ..oo(0, [1]) + ..aOS(1, _omitFieldNames ? '' : 'migrationsPath') + ..hasRequiredFields = false; + + @$core.Deprecated('Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') + SqlDatabaseMigrations clone() => + SqlDatabaseMigrations()..mergeFromMessage(this); + @$core.Deprecated('Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + SqlDatabaseMigrations copyWith( + void Function(SqlDatabaseMigrations) updates) => + super.copyWith((message) => updates(message as SqlDatabaseMigrations)) + as SqlDatabaseMigrations; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static SqlDatabaseMigrations create() => SqlDatabaseMigrations._(); + SqlDatabaseMigrations createEmptyInstance() => create(); + static $pb.PbList createRepeated() => + $pb.PbList(); + @$core.pragma('dart2js:noInline') + static SqlDatabaseMigrations getDefault() => _defaultInstance ??= + $pb.GeneratedMessage.$_defaultFor(create); + static SqlDatabaseMigrations? _defaultInstance; + + SqlDatabaseMigrations_Migrations whichMigrations() => + _SqlDatabaseMigrations_MigrationsByTag[$_whichOneof(0)]!; + void clearMigrations() => clearField($_whichOneof(0)); + + /// The path to this databases SQL migrations + /// Valid values are file://relative/path/to/migrations as a directory or dockerfile://path/to/migrations.dockerfile to hint at a docker image build + /// Paths should be relative to the root of the application (nitric.yaml file location) + @$pb.TagNumber(1) + $core.String get migrationsPath => $_getSZ(0); + @$pb.TagNumber(1) + set migrationsPath($core.String v) { + $_setString(0, v); + } + + @$pb.TagNumber(1) + $core.bool hasMigrationsPath() => $_has(0); + @$pb.TagNumber(1) + void clearMigrationsPath() => clearField(1); +} + +class SqlDatabaseResource extends $pb.GeneratedMessage { + factory SqlDatabaseResource({ + SqlDatabaseMigrations? migrations, + }) { + final $result = create(); + if (migrations != null) { + $result.migrations = migrations; + } + return $result; + } + SqlDatabaseResource._() : super(); + factory SqlDatabaseResource.fromBuffer($core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + factory SqlDatabaseResource.fromJson($core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'SqlDatabaseResource', + package: const $pb.PackageName( + _omitMessageNames ? '' : 'nitric.proto.resources.v1'), + createEmptyInstance: create) + ..aOM(1, _omitFieldNames ? '' : 'migrations', + subBuilder: SqlDatabaseMigrations.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') + SqlDatabaseResource clone() => SqlDatabaseResource()..mergeFromMessage(this); + @$core.Deprecated('Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + SqlDatabaseResource copyWith(void Function(SqlDatabaseResource) updates) => + super.copyWith((message) => updates(message as SqlDatabaseResource)) + as SqlDatabaseResource; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static SqlDatabaseResource create() => SqlDatabaseResource._(); + SqlDatabaseResource createEmptyInstance() => create(); + static $pb.PbList createRepeated() => + $pb.PbList(); + @$core.pragma('dart2js:noInline') + static SqlDatabaseResource getDefault() => _defaultInstance ??= + $pb.GeneratedMessage.$_defaultFor(create); + static SqlDatabaseResource? _defaultInstance; + + @$pb.TagNumber(1) + SqlDatabaseMigrations get migrations => $_getN(0); + @$pb.TagNumber(1) + set migrations(SqlDatabaseMigrations v) { + setField(1, v); + } + + @$pb.TagNumber(1) + $core.bool hasMigrations() => $_has(0); + @$pb.TagNumber(1) + void clearMigrations() => clearField(1); + @$pb.TagNumber(1) + SqlDatabaseMigrations ensureMigrations() => $_ensure(0); +} + class ApiOpenIdConnectionDefinition extends $pb.GeneratedMessage { factory ApiOpenIdConnectionDefinition({ $core.String? issuer, diff --git a/lib/src/nitric/proto/resources/v1/resources.pbenum.dart b/lib/src/nitric/proto/resources/v1/resources.pbenum.dart index 661a517..04f7949 100644 --- a/lib/src/nitric/proto/resources/v1/resources.pbenum.dart +++ b/lib/src/nitric/proto/resources/v1/resources.pbenum.dart @@ -42,6 +42,8 @@ class ResourceType extends $pb.ProtobufEnum { ResourceType._(12, _omitEnumNames ? '' : 'ApiSecurityDefinition'); static const ResourceType Queue = ResourceType._(13, _omitEnumNames ? '' : 'Queue'); + static const ResourceType SqlDatabase = + ResourceType._(14, _omitEnumNames ? '' : 'SqlDatabase'); static const $core.List values = [ Api, @@ -58,6 +60,7 @@ class ResourceType extends $pb.ProtobufEnum { Http, ApiSecurityDefinition, Queue, + SqlDatabase, ]; static final $core.Map<$core.int, ResourceType> _byValue = diff --git a/lib/src/nitric/proto/resources/v1/resources.pbjson.dart b/lib/src/nitric/proto/resources/v1/resources.pbjson.dart index 91204a9..db4b52a 100644 --- a/lib/src/nitric/proto/resources/v1/resources.pbjson.dart +++ b/lib/src/nitric/proto/resources/v1/resources.pbjson.dart @@ -31,6 +31,7 @@ const ResourceType$json = { {'1': 'Http', '2': 11}, {'1': 'ApiSecurityDefinition', '2': 12}, {'1': 'Queue', '2': 13}, + {'1': 'SqlDatabase', '2': 14}, ], }; @@ -39,7 +40,8 @@ final $typed_data.Uint8List resourceTypeDescriptor = $convert.base64Decode( 'CgxSZXNvdXJjZVR5cGUSBwoDQXBpEAASCwoHU2VydmljZRABEgoKBkJ1Y2tldBACEgkKBVRvcG' 'ljEAMSDAoIU2NoZWR1bGUQBBIQCgxTdWJzY3JpcHRpb24QBRIRCg1LZXlWYWx1ZVN0b3JlEAYS' 'CgoGUG9saWN5EAcSCgoGU2VjcmV0EAgSEgoOQnVja2V0TGlzdGVuZXIQCRINCglXZWJzb2NrZX' - 'QQChIICgRIdHRwEAsSGQoVQXBpU2VjdXJpdHlEZWZpbml0aW9uEAwSCQoFUXVldWUQDQ=='); + 'QQChIICgRIdHRwEAsSGQoVQXBpU2VjdXJpdHlEZWZpbml0aW9uEAwSCQoFUXVldWUQDRIPCgtT' + 'cWxEYXRhYmFzZRAO'); @$core.Deprecated('Use actionDescriptor instead') const Action$json = { @@ -214,6 +216,15 @@ const ResourceDeclareRequest$json = { '9': 0, '10': 'queue' }, + { + '1': 'sql_database', + '3': 18, + '4': 1, + '5': 11, + '6': '.nitric.proto.resources.v1.SqlDatabaseResource', + '9': 0, + '10': 'sqlDatabase' + }, ], '8': [ {'1': 'config'}, @@ -234,7 +245,9 @@ final $typed_data.Uint8List resourceDeclareRequestDescriptor = $convert.base64De 'NvdXJjZUgAUgNhcGkScgoXYXBpX3NlY3VyaXR5X2RlZmluaXRpb24YECABKAsyOC5uaXRyaWMu' 'cHJvdG8ucmVzb3VyY2VzLnYxLkFwaVNlY3VyaXR5RGVmaW5pdGlvblJlc291cmNlSABSFWFwaV' 'NlY3VyaXR5RGVmaW5pdGlvbhJACgVxdWV1ZRgRIAEoCzIoLm5pdHJpYy5wcm90by5yZXNvdXJj' - 'ZXMudjEuUXVldWVSZXNvdXJjZUgAUgVxdWV1ZUIICgZjb25maWc='); + 'ZXMudjEuUXVldWVSZXNvdXJjZUgAUgVxdWV1ZRJTCgxzcWxfZGF0YWJhc2UYEiABKAsyLi5uaX' + 'RyaWMucHJvdG8ucmVzb3VyY2VzLnYxLlNxbERhdGFiYXNlUmVzb3VyY2VIAFILc3FsRGF0YWJh' + 'c2VCCAoGY29uZmln'); @$core.Deprecated('Use bucketResourceDescriptor instead') const BucketResource$json = { @@ -281,6 +294,49 @@ const SecretResource$json = { final $typed_data.Uint8List secretResourceDescriptor = $convert.base64Decode('Cg5TZWNyZXRSZXNvdXJjZQ=='); +@$core.Deprecated('Use sqlDatabaseMigrationsDescriptor instead') +const SqlDatabaseMigrations$json = { + '1': 'SqlDatabaseMigrations', + '2': [ + { + '1': 'migrations_path', + '3': 1, + '4': 1, + '5': 9, + '9': 0, + '10': 'migrationsPath' + }, + ], + '8': [ + {'1': 'migrations'}, + ], +}; + +/// Descriptor for `SqlDatabaseMigrations`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List sqlDatabaseMigrationsDescriptor = $convert.base64Decode( + 'ChVTcWxEYXRhYmFzZU1pZ3JhdGlvbnMSKQoPbWlncmF0aW9uc19wYXRoGAEgASgJSABSDm1pZ3' + 'JhdGlvbnNQYXRoQgwKCm1pZ3JhdGlvbnM='); + +@$core.Deprecated('Use sqlDatabaseResourceDescriptor instead') +const SqlDatabaseResource$json = { + '1': 'SqlDatabaseResource', + '2': [ + { + '1': 'migrations', + '3': 1, + '4': 1, + '5': 11, + '6': '.nitric.proto.resources.v1.SqlDatabaseMigrations', + '10': 'migrations' + }, + ], +}; + +/// Descriptor for `SqlDatabaseResource`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List sqlDatabaseResourceDescriptor = $convert.base64Decode( + 'ChNTcWxEYXRhYmFzZVJlc291cmNlElAKCm1pZ3JhdGlvbnMYASABKAsyMC5uaXRyaWMucHJvdG' + '8ucmVzb3VyY2VzLnYxLlNxbERhdGFiYXNlTWlncmF0aW9uc1IKbWlncmF0aW9ucw=='); + @$core.Deprecated('Use apiOpenIdConnectionDefinitionDescriptor instead') const ApiOpenIdConnectionDefinition$json = { '1': 'ApiOpenIdConnectionDefinition', diff --git a/lib/src/nitric/proto/sql/v1/sql.pb.dart b/lib/src/nitric/proto/sql/v1/sql.pb.dart new file mode 100644 index 0000000..4f4bc44 --- /dev/null +++ b/lib/src/nitric/proto/sql/v1/sql.pb.dart @@ -0,0 +1,151 @@ +// +// Generated code. Do not modify. +// source: nitric/proto/sql/v1/sql.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; + +class SqlConnectionStringRequest extends $pb.GeneratedMessage { + factory SqlConnectionStringRequest({ + $core.String? databaseName, + }) { + final $result = create(); + if (databaseName != null) { + $result.databaseName = databaseName; + } + return $result; + } + SqlConnectionStringRequest._() : super(); + factory SqlConnectionStringRequest.fromBuffer($core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + factory SqlConnectionStringRequest.fromJson($core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'SqlConnectionStringRequest', + package: + const $pb.PackageName(_omitMessageNames ? '' : 'nitric.proto.sql.v1'), + createEmptyInstance: create) + ..aOS(1, _omitFieldNames ? '' : 'databaseName') + ..hasRequiredFields = false; + + @$core.Deprecated('Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') + SqlConnectionStringRequest clone() => + SqlConnectionStringRequest()..mergeFromMessage(this); + @$core.Deprecated('Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + SqlConnectionStringRequest copyWith( + void Function(SqlConnectionStringRequest) updates) => + super.copyWith( + (message) => updates(message as SqlConnectionStringRequest)) + as SqlConnectionStringRequest; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static SqlConnectionStringRequest create() => SqlConnectionStringRequest._(); + SqlConnectionStringRequest createEmptyInstance() => create(); + static $pb.PbList createRepeated() => + $pb.PbList(); + @$core.pragma('dart2js:noInline') + static SqlConnectionStringRequest getDefault() => _defaultInstance ??= + $pb.GeneratedMessage.$_defaultFor(create); + static SqlConnectionStringRequest? _defaultInstance; + + /// The name of the database to retrieve the connection string for + @$pb.TagNumber(1) + $core.String get databaseName => $_getSZ(0); + @$pb.TagNumber(1) + set databaseName($core.String v) { + $_setString(0, v); + } + + @$pb.TagNumber(1) + $core.bool hasDatabaseName() => $_has(0); + @$pb.TagNumber(1) + void clearDatabaseName() => clearField(1); +} + +class SqlConnectionStringResponse extends $pb.GeneratedMessage { + factory SqlConnectionStringResponse({ + $core.String? connectionString, + }) { + final $result = create(); + if (connectionString != null) { + $result.connectionString = connectionString; + } + return $result; + } + SqlConnectionStringResponse._() : super(); + factory SqlConnectionStringResponse.fromBuffer($core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + factory SqlConnectionStringResponse.fromJson($core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'SqlConnectionStringResponse', + package: + const $pb.PackageName(_omitMessageNames ? '' : 'nitric.proto.sql.v1'), + createEmptyInstance: create) + ..aOS(1, _omitFieldNames ? '' : 'connectionString') + ..hasRequiredFields = false; + + @$core.Deprecated('Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') + SqlConnectionStringResponse clone() => + SqlConnectionStringResponse()..mergeFromMessage(this); + @$core.Deprecated('Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + SqlConnectionStringResponse copyWith( + void Function(SqlConnectionStringResponse) updates) => + super.copyWith( + (message) => updates(message as SqlConnectionStringResponse)) + as SqlConnectionStringResponse; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static SqlConnectionStringResponse create() => + SqlConnectionStringResponse._(); + SqlConnectionStringResponse createEmptyInstance() => create(); + static $pb.PbList createRepeated() => + $pb.PbList(); + @$core.pragma('dart2js:noInline') + static SqlConnectionStringResponse getDefault() => _defaultInstance ??= + $pb.GeneratedMessage.$_defaultFor(create); + static SqlConnectionStringResponse? _defaultInstance; + + /// The connection string for the database + @$pb.TagNumber(1) + $core.String get connectionString => $_getSZ(0); + @$pb.TagNumber(1) + set connectionString($core.String v) { + $_setString(0, v); + } + + @$pb.TagNumber(1) + $core.bool hasConnectionString() => $_has(0); + @$pb.TagNumber(1) + void clearConnectionString() => 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/sql/v1/sql.pbenum.dart b/lib/src/nitric/proto/sql/v1/sql.pbenum.dart new file mode 100644 index 0000000..2c231e3 --- /dev/null +++ b/lib/src/nitric/proto/sql/v1/sql.pbenum.dart @@ -0,0 +1,10 @@ +// +// Generated code. Do not modify. +// source: nitric/proto/sql/v1/sql.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/sql/v1/sql.pbgrpc.dart b/lib/src/nitric/proto/sql/v1/sql.pbgrpc.dart new file mode 100644 index 0000000..00120cc --- /dev/null +++ b/lib/src/nitric/proto/sql/v1/sql.pbgrpc.dart @@ -0,0 +1,67 @@ +// +// Generated code. Do not modify. +// source: nitric/proto/sql/v1/sql.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 'sql.pb.dart' as $10; + +export 'sql.pb.dart'; + +@$pb.GrpcServiceName('nitric.proto.sql.v1.Sql') +class SqlClient extends $grpc.Client { + static final _$connectionString = $grpc.ClientMethod< + $10.SqlConnectionStringRequest, $10.SqlConnectionStringResponse>( + '/nitric.proto.sql.v1.Sql/ConnectionString', + ($10.SqlConnectionStringRequest value) => value.writeToBuffer(), + ($core.List<$core.int> value) => + $10.SqlConnectionStringResponse.fromBuffer(value)); + + SqlClient($grpc.ClientChannel channel, + {$grpc.CallOptions? options, + $core.Iterable<$grpc.ClientInterceptor>? interceptors}) + : super(channel, options: options, interceptors: interceptors); + + $grpc.ResponseFuture<$10.SqlConnectionStringResponse> connectionString( + $10.SqlConnectionStringRequest request, + {$grpc.CallOptions? options}) { + return $createUnaryCall(_$connectionString, request, options: options); + } +} + +@$pb.GrpcServiceName('nitric.proto.sql.v1.Sql') +abstract class SqlServiceBase extends $grpc.Service { + $core.String get $name => 'nitric.proto.sql.v1.Sql'; + + SqlServiceBase() { + $addMethod($grpc.ServiceMethod<$10.SqlConnectionStringRequest, + $10.SqlConnectionStringResponse>( + 'ConnectionString', + connectionString_Pre, + false, + false, + ($core.List<$core.int> value) => + $10.SqlConnectionStringRequest.fromBuffer(value), + ($10.SqlConnectionStringResponse value) => value.writeToBuffer())); + } + + $async.Future<$10.SqlConnectionStringResponse> connectionString_Pre( + $grpc.ServiceCall call, + $async.Future<$10.SqlConnectionStringRequest> request) async { + return connectionString(call, await request); + } + + $async.Future<$10.SqlConnectionStringResponse> connectionString( + $grpc.ServiceCall call, $10.SqlConnectionStringRequest request); +} diff --git a/lib/src/nitric/proto/sql/v1/sql.pbjson.dart b/lib/src/nitric/proto/sql/v1/sql.pbjson.dart new file mode 100644 index 0000000..65e3146 --- /dev/null +++ b/lib/src/nitric/proto/sql/v1/sql.pbjson.dart @@ -0,0 +1,48 @@ +// +// Generated code. Do not modify. +// source: nitric/proto/sql/v1/sql.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 sqlConnectionStringRequestDescriptor instead') +const SqlConnectionStringRequest$json = { + '1': 'SqlConnectionStringRequest', + '2': [ + {'1': 'database_name', '3': 1, '4': 1, '5': 9, '10': 'databaseName'}, + ], +}; + +/// Descriptor for `SqlConnectionStringRequest`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List sqlConnectionStringRequestDescriptor = + $convert.base64Decode( + 'ChpTcWxDb25uZWN0aW9uU3RyaW5nUmVxdWVzdBIjCg1kYXRhYmFzZV9uYW1lGAEgASgJUgxkYX' + 'RhYmFzZU5hbWU='); + +@$core.Deprecated('Use sqlConnectionStringResponseDescriptor instead') +const SqlConnectionStringResponse$json = { + '1': 'SqlConnectionStringResponse', + '2': [ + { + '1': 'connection_string', + '3': 1, + '4': 1, + '5': 9, + '10': 'connectionString' + }, + ], +}; + +/// Descriptor for `SqlConnectionStringResponse`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List sqlConnectionStringResponseDescriptor = + $convert.base64Decode( + 'ChtTcWxDb25uZWN0aW9uU3RyaW5nUmVzcG9uc2USKwoRY29ubmVjdGlvbl9zdHJpbmcYASABKA' + 'lSEGNvbm5lY3Rpb25TdHJpbmc='); diff --git a/lib/src/nitric/proto/storage/v1/storage.pb.dart b/lib/src/nitric/proto/storage/v1/storage.pb.dart index ae72692..d3ab4c9 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 $12; +import '../../../../google/protobuf/duration.pb.dart' as $13; 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, - $12.Duration? expiry, + $13.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<$12.Duration>(4, _omitFieldNames ? '' : 'expiry', - subBuilder: $12.Duration.create) + ..aOM<$13.Duration>(4, _omitFieldNames ? '' : 'expiry', + subBuilder: $13.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) - $12.Duration get expiry => $_getN(3); + $13.Duration get expiry => $_getN(3); @$pb.TagNumber(4) - set expiry($12.Duration v) { + set expiry($13.Duration v) { setField(4, v); } @@ -1207,7 +1207,7 @@ class StoragePreSignUrlRequest extends $pb.GeneratedMessage { @$pb.TagNumber(4) void clearExpiry() => clearField(4); @$pb.TagNumber(4) - $12.Duration ensureExpiry() => $_ensure(3); + $13.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 d24df30..4f0e596 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 $12; -import '../../../../google/protobuf/struct.pb.dart' as $13; +import '../../../../google/protobuf/duration.pb.dart' as $13; +import '../../../../google/protobuf/struct.pb.dart' as $14; enum ClientMessage_Content { registrationRequest, messageResponse, notSet } @@ -508,7 +508,7 @@ enum TopicMessage_Content { structPayload, notSet } class TopicMessage extends $pb.GeneratedMessage { factory TopicMessage({ - $13.Struct? structPayload, + $14.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<$13.Struct>(1, _omitFieldNames ? '' : 'structPayload', - subBuilder: $13.Struct.create) + ..aOM<$14.Struct>(1, _omitFieldNames ? '' : 'structPayload', + subBuilder: $14.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) - $13.Struct get structPayload => $_getN(0); + $14.Struct get structPayload => $_getN(0); @$pb.TagNumber(1) - set structPayload($13.Struct v) { + set structPayload($14.Struct v) { setField(1, v); } @@ -578,7 +578,7 @@ class TopicMessage extends $pb.GeneratedMessage { @$pb.TagNumber(1) void clearStructPayload() => clearField(1); @$pb.TagNumber(1) - $13.Struct ensureStructPayload() => $_ensure(0); + $14.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, - $12.Duration? delay, + $13.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<$12.Duration>(3, _omitFieldNames ? '' : 'delay', - subBuilder: $12.Duration.create) + ..aOM<$13.Duration>(3, _omitFieldNames ? '' : 'delay', + subBuilder: $13.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) - $12.Duration get delay => $_getN(2); + $13.Duration get delay => $_getN(2); @$pb.TagNumber(3) - set delay($12.Duration v) { + set delay($13.Duration v) { setField(3, v); } @@ -684,7 +684,7 @@ class TopicPublishRequest extends $pb.GeneratedMessage { @$pb.TagNumber(3) void clearDelay() => clearField(3); @$pb.TagNumber(3) - $12.Duration ensureDelay() => $_ensure(2); + $13.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 12cf727..2d5dc45 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 $10; +import 'topics.pb.dart' as $11; export 'topics.pb.dart'; @$pb.GrpcServiceName('nitric.proto.topics.v1.Topics') class TopicsClient extends $grpc.Client { static final _$publish = - $grpc.ClientMethod<$10.TopicPublishRequest, $10.TopicPublishResponse>( + $grpc.ClientMethod<$11.TopicPublishRequest, $11.TopicPublishResponse>( '/nitric.proto.topics.v1.Topics/Publish', - ($10.TopicPublishRequest value) => value.writeToBuffer(), + ($11.TopicPublishRequest value) => value.writeToBuffer(), ($core.List<$core.int> value) => - $10.TopicPublishResponse.fromBuffer(value)); + $11.TopicPublishResponse.fromBuffer(value)); TopicsClient($grpc.ClientChannel channel, {$grpc.CallOptions? options, $core.Iterable<$grpc.ClientInterceptor>? interceptors}) : super(channel, options: options, interceptors: interceptors); - $grpc.ResponseFuture<$10.TopicPublishResponse> publish( - $10.TopicPublishRequest request, + $grpc.ResponseFuture<$11.TopicPublishResponse> publish( + $11.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<$10.TopicPublishRequest, $10.TopicPublishResponse>( + $grpc.ServiceMethod<$11.TopicPublishRequest, $11.TopicPublishResponse>( 'Publish', publish_Pre, false, false, ($core.List<$core.int> value) => - $10.TopicPublishRequest.fromBuffer(value), - ($10.TopicPublishResponse value) => value.writeToBuffer())); + $11.TopicPublishRequest.fromBuffer(value), + ($11.TopicPublishResponse value) => value.writeToBuffer())); } - $async.Future<$10.TopicPublishResponse> publish_Pre($grpc.ServiceCall call, - $async.Future<$10.TopicPublishRequest> request) async { + $async.Future<$11.TopicPublishResponse> publish_Pre($grpc.ServiceCall call, + $async.Future<$11.TopicPublishRequest> request) async { return publish(call, await request); } - $async.Future<$10.TopicPublishResponse> publish( - $grpc.ServiceCall call, $10.TopicPublishRequest request); + $async.Future<$11.TopicPublishResponse> publish( + $grpc.ServiceCall call, $11.TopicPublishRequest request); } @$pb.GrpcServiceName('nitric.proto.topics.v1.Subscriber') class SubscriberClient extends $grpc.Client { static final _$subscribe = - $grpc.ClientMethod<$10.ClientMessage, $10.ServerMessage>( + $grpc.ClientMethod<$11.ClientMessage, $11.ServerMessage>( '/nitric.proto.topics.v1.Subscriber/Subscribe', - ($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)); SubscriberClient($grpc.ClientChannel channel, {$grpc.CallOptions? options, $core.Iterable<$grpc.ClientInterceptor>? interceptors}) : super(channel, options: options, interceptors: interceptors); - $grpc.ResponseStream<$10.ServerMessage> subscribe( - $async.Stream<$10.ClientMessage> request, + $grpc.ResponseStream<$11.ServerMessage> subscribe( + $async.Stream<$11.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<$10.ClientMessage, $10.ServerMessage>( + $addMethod($grpc.ServiceMethod<$11.ClientMessage, $11.ServerMessage>( 'Subscribe', subscribe, 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> subscribe( - $grpc.ServiceCall call, $async.Stream<$10.ClientMessage> request); + $async.Stream<$11.ServerMessage> subscribe( + $grpc.ServiceCall call, $async.Stream<$11.ClientMessage> request); } diff --git a/lib/src/nitric/proto/websockets/v1/websockets.pbgrpc.dart b/lib/src/nitric/proto/websockets/v1/websockets.pbgrpc.dart index a37c4ce..986362a 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 $11; +import 'websockets.pb.dart' as $12; export 'websockets.pb.dart'; @$pb.GrpcServiceName('nitric.proto.websockets.v1.Websocket') class WebsocketClient extends $grpc.Client { static final _$sendMessage = - $grpc.ClientMethod<$11.WebsocketSendRequest, $11.WebsocketSendResponse>( + $grpc.ClientMethod<$12.WebsocketSendRequest, $12.WebsocketSendResponse>( '/nitric.proto.websockets.v1.Websocket/SendMessage', - ($11.WebsocketSendRequest value) => value.writeToBuffer(), + ($12.WebsocketSendRequest value) => value.writeToBuffer(), ($core.List<$core.int> value) => - $11.WebsocketSendResponse.fromBuffer(value)); + $12.WebsocketSendResponse.fromBuffer(value)); static final _$closeConnection = $grpc.ClientMethod< - $11.WebsocketCloseConnectionRequest, - $11.WebsocketCloseConnectionResponse>( + $12.WebsocketCloseConnectionRequest, + $12.WebsocketCloseConnectionResponse>( '/nitric.proto.websockets.v1.Websocket/CloseConnection', - ($11.WebsocketCloseConnectionRequest value) => value.writeToBuffer(), + ($12.WebsocketCloseConnectionRequest value) => value.writeToBuffer(), ($core.List<$core.int> value) => - $11.WebsocketCloseConnectionResponse.fromBuffer(value)); - static final _$socketDetails = $grpc.ClientMethod<$11.WebsocketDetailsRequest, - $11.WebsocketDetailsResponse>( + $12.WebsocketCloseConnectionResponse.fromBuffer(value)); + static final _$socketDetails = $grpc.ClientMethod<$12.WebsocketDetailsRequest, + $12.WebsocketDetailsResponse>( '/nitric.proto.websockets.v1.Websocket/SocketDetails', - ($11.WebsocketDetailsRequest value) => value.writeToBuffer(), + ($12.WebsocketDetailsRequest value) => value.writeToBuffer(), ($core.List<$core.int> value) => - $11.WebsocketDetailsResponse.fromBuffer(value)); + $12.WebsocketDetailsResponse.fromBuffer(value)); WebsocketClient($grpc.ClientChannel channel, {$grpc.CallOptions? options, $core.Iterable<$grpc.ClientInterceptor>? interceptors}) : super(channel, options: options, interceptors: interceptors); - $grpc.ResponseFuture<$11.WebsocketSendResponse> sendMessage( - $11.WebsocketSendRequest request, + $grpc.ResponseFuture<$12.WebsocketSendResponse> sendMessage( + $12.WebsocketSendRequest request, {$grpc.CallOptions? options}) { return $createUnaryCall(_$sendMessage, request, options: options); } - $grpc.ResponseFuture<$11.WebsocketCloseConnectionResponse> closeConnection( - $11.WebsocketCloseConnectionRequest request, + $grpc.ResponseFuture<$12.WebsocketCloseConnectionResponse> closeConnection( + $12.WebsocketCloseConnectionRequest request, {$grpc.CallOptions? options}) { return $createUnaryCall(_$closeConnection, request, options: options); } - $grpc.ResponseFuture<$11.WebsocketDetailsResponse> socketDetails( - $11.WebsocketDetailsRequest request, + $grpc.ResponseFuture<$12.WebsocketDetailsResponse> socketDetails( + $12.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<$11.WebsocketSendRequest, - $11.WebsocketSendResponse>( + $addMethod($grpc.ServiceMethod<$12.WebsocketSendRequest, + $12.WebsocketSendResponse>( 'SendMessage', sendMessage_Pre, false, false, ($core.List<$core.int> value) => - $11.WebsocketSendRequest.fromBuffer(value), - ($11.WebsocketSendResponse value) => value.writeToBuffer())); - $addMethod($grpc.ServiceMethod<$11.WebsocketCloseConnectionRequest, - $11.WebsocketCloseConnectionResponse>( + $12.WebsocketSendRequest.fromBuffer(value), + ($12.WebsocketSendResponse value) => value.writeToBuffer())); + $addMethod($grpc.ServiceMethod<$12.WebsocketCloseConnectionRequest, + $12.WebsocketCloseConnectionResponse>( 'CloseConnection', closeConnection_Pre, false, false, ($core.List<$core.int> value) => - $11.WebsocketCloseConnectionRequest.fromBuffer(value), - ($11.WebsocketCloseConnectionResponse value) => value.writeToBuffer())); - $addMethod($grpc.ServiceMethod<$11.WebsocketDetailsRequest, - $11.WebsocketDetailsResponse>( + $12.WebsocketCloseConnectionRequest.fromBuffer(value), + ($12.WebsocketCloseConnectionResponse value) => value.writeToBuffer())); + $addMethod($grpc.ServiceMethod<$12.WebsocketDetailsRequest, + $12.WebsocketDetailsResponse>( 'SocketDetails', socketDetails_Pre, false, false, ($core.List<$core.int> value) => - $11.WebsocketDetailsRequest.fromBuffer(value), - ($11.WebsocketDetailsResponse value) => value.writeToBuffer())); + $12.WebsocketDetailsRequest.fromBuffer(value), + ($12.WebsocketDetailsResponse value) => value.writeToBuffer())); } - $async.Future<$11.WebsocketSendResponse> sendMessage_Pre( + $async.Future<$12.WebsocketSendResponse> sendMessage_Pre( $grpc.ServiceCall call, - $async.Future<$11.WebsocketSendRequest> request) async { + $async.Future<$12.WebsocketSendRequest> request) async { return sendMessage(call, await request); } - $async.Future<$11.WebsocketCloseConnectionResponse> closeConnection_Pre( + $async.Future<$12.WebsocketCloseConnectionResponse> closeConnection_Pre( $grpc.ServiceCall call, - $async.Future<$11.WebsocketCloseConnectionRequest> request) async { + $async.Future<$12.WebsocketCloseConnectionRequest> request) async { return closeConnection(call, await request); } - $async.Future<$11.WebsocketDetailsResponse> socketDetails_Pre( + $async.Future<$12.WebsocketDetailsResponse> socketDetails_Pre( $grpc.ServiceCall call, - $async.Future<$11.WebsocketDetailsRequest> request) async { + $async.Future<$12.WebsocketDetailsRequest> request) async { return socketDetails(call, await 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); + $async.Future<$12.WebsocketSendResponse> sendMessage( + $grpc.ServiceCall call, $12.WebsocketSendRequest request); + $async.Future<$12.WebsocketCloseConnectionResponse> closeConnection( + $grpc.ServiceCall call, $12.WebsocketCloseConnectionRequest request); + $async.Future<$12.WebsocketDetailsResponse> socketDetails( + $grpc.ServiceCall call, $12.WebsocketDetailsRequest request); } @$pb.GrpcServiceName('nitric.proto.websockets.v1.WebsocketHandler') class WebsocketHandlerClient extends $grpc.Client { static final _$handleEvents = - $grpc.ClientMethod<$11.ClientMessage, $11.ServerMessage>( + $grpc.ClientMethod<$12.ClientMessage, $12.ServerMessage>( '/nitric.proto.websockets.v1.WebsocketHandler/HandleEvents', - ($11.ClientMessage value) => value.writeToBuffer(), - ($core.List<$core.int> value) => $11.ServerMessage.fromBuffer(value)); + ($12.ClientMessage value) => value.writeToBuffer(), + ($core.List<$core.int> value) => $12.ServerMessage.fromBuffer(value)); WebsocketHandlerClient($grpc.ClientChannel channel, {$grpc.CallOptions? options, $core.Iterable<$grpc.ClientInterceptor>? interceptors}) : super(channel, options: options, interceptors: interceptors); - $grpc.ResponseStream<$11.ServerMessage> handleEvents( - $async.Stream<$11.ClientMessage> request, + $grpc.ResponseStream<$12.ServerMessage> handleEvents( + $async.Stream<$12.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<$11.ClientMessage, $11.ServerMessage>( + $addMethod($grpc.ServiceMethod<$12.ClientMessage, $12.ServerMessage>( 'HandleEvents', handleEvents, true, true, - ($core.List<$core.int> value) => $11.ClientMessage.fromBuffer(value), - ($11.ServerMessage value) => value.writeToBuffer())); + ($core.List<$core.int> value) => $12.ClientMessage.fromBuffer(value), + ($12.ServerMessage value) => value.writeToBuffer())); } - $async.Stream<$11.ServerMessage> handleEvents( - $grpc.ServiceCall call, $async.Stream<$11.ClientMessage> request); + $async.Stream<$12.ServerMessage> handleEvents( + $grpc.ServiceCall call, $async.Stream<$12.ClientMessage> request); } diff --git a/lib/src/workers/api.dart b/lib/src/workers/api.dart index c6303e0..f7dec4a 100644 --- a/lib/src/workers/api.dart +++ b/lib/src/workers/api.dart @@ -16,7 +16,8 @@ class ApiWorker extends Worker<$ap.ApiClient> { ApiWorker(this.route, this.handler, this.methods, {this.security = const [], $ap.ApiClient? client}) - : super(client); + : super(client ?? + $ap.ApiClient(ClientChannelSingleton.instance.clientChannel)); /// Start the route handler. @override diff --git a/lib/src/workers/blob_event.dart b/lib/src/workers/blob_event.dart index 19061db..5420380 100644 --- a/lib/src/workers/blob_event.dart +++ b/lib/src/workers/blob_event.dart @@ -6,7 +6,9 @@ class BlobEventWorker extends Worker<$bp.StorageListenerClient> { BlobEventWorker(this.registrationRequest, this.middleware, {$bp.StorageListenerClient? client}) - : super(client); + : super(client ?? + $bp.StorageListenerClient( + ClientChannelSingleton.instance.clientChannel)); @override Future start() async { diff --git a/lib/src/workers/common.dart b/lib/src/workers/common.dart index f212690..fa2b201 100644 --- a/lib/src/workers/common.dart +++ b/lib/src/workers/common.dart @@ -26,13 +26,8 @@ part 'websocket.dart'; abstract class Worker { late T _client; - Worker(T? client) { - if (client == null) { - _client = - $ap.ApiClient(ClientChannelSingleton.instance.clientChannel) as T; - } else { - _client = client; - } + Worker(T client) { + _client = client; } Future start(); diff --git a/lib/src/workers/file_event.dart b/lib/src/workers/file_event.dart index cc21329..e4b2e2a 100644 --- a/lib/src/workers/file_event.dart +++ b/lib/src/workers/file_event.dart @@ -7,7 +7,9 @@ class FileEventWorker extends Worker<$bp.StorageListenerClient> { FileEventWorker(this.registrationRequest, this.middleware, this.bucket, {$bp.StorageListenerClient? client}) - : super(client); + : super(client ?? + $bp.StorageListenerClient( + ClientChannelSingleton.instance.clientChannel)); @override Future start() async { diff --git a/lib/src/workers/interval.dart b/lib/src/workers/interval.dart index a8a7ae9..1f211af 100644 --- a/lib/src/workers/interval.dart +++ b/lib/src/workers/interval.dart @@ -6,7 +6,8 @@ class IntervalWorker extends Worker<$sp.SchedulesClient> { IntervalWorker(this.registrationRequest, this.middleware, {$sp.SchedulesClient? client}) - : super(client); + : super(client ?? + $sp.SchedulesClient(ClientChannelSingleton.instance.clientChannel)); /// Starts the interval handling loop to run the [middleware] at a certain frequency. Uses the [registrationRequest] to register the interval with the Nitric server. @override diff --git a/lib/src/workers/subscription.dart b/lib/src/workers/subscription.dart index 96fd311..cdf7e3b 100644 --- a/lib/src/workers/subscription.dart +++ b/lib/src/workers/subscription.dart @@ -6,7 +6,9 @@ class SubscriptionWorker extends Worker<$tp.SubscriberClient> { SubscriptionWorker(this.registrationRequest, this.middleware, {$tp.SubscriberClient? client}) - : super(client); + : super(client ?? + $tp.SubscriberClient( + ClientChannelSingleton.instance.clientChannel)); @override Future start() async { diff --git a/lib/src/workers/websocket.dart b/lib/src/workers/websocket.dart index f4f696a..48af1c1 100644 --- a/lib/src/workers/websocket.dart +++ b/lib/src/workers/websocket.dart @@ -6,7 +6,9 @@ class WebsocketWorker extends Worker<$wp.WebsocketHandlerClient> { WebsocketWorker(this.registrationRequest, this.middleware, {$wp.WebsocketHandlerClient? client}) - : super(client); + : super(client ?? + $wp.WebsocketHandlerClient( + ClientChannelSingleton.instance.clientChannel)); @override Future start() async { diff --git a/makefile b/makefile index 9e3f05b..9b711e2 100644 --- a/makefile +++ b/makefile @@ -4,7 +4,7 @@ clean: rm -rf lib/src/nitric rm -rf lib/src/google -NITRIC_VERSION := 1.1.1 +NITRIC_VERSION := 1.6.0 GRPC_VERSION := 3.2.4 download-nitric: @@ -13,14 +13,14 @@ download-nitric: 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 + curl -L https://github.com/grpc/grpc-dart/archive/refs/tags/v${GRPC_VERSION}.tar.gz -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 + mv -f 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 +build: clean 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 diff --git a/test/src/api/keyvalue_test.dart b/test/src/api/keyvalue_test.dart index 6db8422..3286d50 100644 --- a/test/src/api/keyvalue_test.dart +++ b/test/src/api/keyvalue_test.dart @@ -96,7 +96,7 @@ void main() { var kvStore = KeyValueStore("keyvalueName", client: keyValueClient); - var keys = kvStore.keys(); + var keys = await kvStore.keys(); verify(() => keyValueClient.scanKeys(req)).called(1); @@ -117,7 +117,7 @@ void main() { var kvStore = KeyValueStore("keyvalueName", client: keyValueClient); - var keys = kvStore.keys(prefix: "f"); + var keys = await kvStore.keys(prefix: "f"); verify(() => keyValueClient.scanKeys(req)).called(1); diff --git a/test/src/api/sql_test.dart b/test/src/api/sql_test.dart new file mode 100644 index 0000000..ea1b98b --- /dev/null +++ b/test/src/api/sql_test.dart @@ -0,0 +1,46 @@ +import 'package:mocktail/mocktail.dart'; +import 'package:nitric_sdk/src/api/sql.dart'; +import 'package:nitric_sdk/src/nitric/proto/sql/v1/sql.pbgrpc.dart'; +import 'package:test/test.dart'; + +import '../common.dart'; + +class MockSqlClient extends Mock implements SqlClient {} + +void main() { + late MockSqlClient sqlClient; + late MockResourceClient resourceClient; + + setUp(() { + sqlClient = MockSqlClient(); + resourceClient = MockResourceClient(); + }); + + tearDown(() { + reset(sqlClient); + reset(resourceClient); + }); + + test('Test build sql database', () { + var sql = SqlDatabase("databaseName", + client: sqlClient, resourcesClient: resourceClient); + + expect(sql.name, "databaseName"); + }); + + test('Test get connection string', () async { + var req = SqlConnectionStringRequest(databaseName: "databaseName"); + + var resp = SqlConnectionStringResponse( + connectionString: "psql://user@pass:localhost:5432/databaseName"); + + when(() => sqlClient.connectionString(req)) + .thenAnswer((_) => MockResponseFuture.value(resp)); + + var db = SqlDatabase("databaseName", client: sqlClient); + + await db.connectionString(); + + verify(() => sqlClient.connectionString(req)).called(1); + }); +}