Skip to content

Commit

Permalink
add channel handling to base resource class
Browse files Browse the repository at this point in the history
  • Loading branch information
HomelessDinosaur committed Mar 7, 2024
1 parent 41c0930 commit 7871998
Show file tree
Hide file tree
Showing 11 changed files with 52 additions and 64 deletions.
3 changes: 2 additions & 1 deletion lib/src/nitric.dart
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,8 @@ class Nitric {

var registerFuture = _cache[typename]![name]!.register();

registerFuture.onError((error, stackTrace) => print(error));
registerFuture.onError((error, stackTrace) =>
print("error occurred registering $typename $name: $error"));
}

return _cache[typename]![name] as T;
Expand Down
9 changes: 3 additions & 6 deletions lib/src/resources/api.dart
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ class Api extends Resource {
}

@override
Future<void> register() async {
ResourceDeclareRequest asRequest() {
var resource = $p.ResourceIdentifier(
name: name,
type: $p.ResourceType.Api,
Expand All @@ -38,15 +38,12 @@ class Api extends Resource {
var apiResource = $p.ApiResource();

for (var opt in opts.security) {
await _attachOidc(name, opt);
_attachOidc(name, opt);

apiResource.security[opt.name] = $p.ApiScopes(scopes: opt.scopes);
}

await client
.declare($p.ResourceDeclareRequest(id: resource, api: apiResource));

await channel.shutdown();
return $p.ResourceDeclareRequest(id: resource, api: apiResource);
}

/// A GET request [handler] that [match]es a specific route.
Expand Down
7 changes: 2 additions & 5 deletions lib/src/resources/bucket.dart
Original file line number Diff line number Diff line change
Expand Up @@ -7,16 +7,13 @@ class BucketResource extends SecureResource<BucketPermission> {
: super(name, client);

@override
Future<void> register() async {
ResourceDeclareRequest asRequest() {
var resource = $p.ResourceIdentifier(
type: $p.ResourceType.Bucket,
name: name,
);

await client.declare(
$p.ResourceDeclareRequest(id: resource, bucket: $p.BucketResource()));

registrationCompletion.complete(resource);
return $p.ResourceDeclareRequest(id: resource, bucket: $p.BucketResource());
}

@override
Expand Down
46 changes: 29 additions & 17 deletions lib/src/resources/common.dart
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,6 @@ import 'dart:async';
import 'dart:convert';

import 'package:nitric_sdk/api.dart';
import 'package:nitric_sdk/resources.dart';
import 'package:nitric_sdk/src/api/queue.dart';
import 'package:nitric_sdk/src/grpc_helper.dart';
import 'package:nitric_sdk/src/nitric.dart';
import 'package:nitric_sdk/src/nitric/proto/resources/v1/resources.pb.dart';
Expand Down Expand Up @@ -43,29 +41,35 @@ abstract class Resource {
final String name;

// Used to resolve the given resource for policy creation
@protected
final Completer<ResourceIdentifier> registrationCompletion =
final Completer<ResourceIdentifier> _registrationCompletion =
Completer<ResourceIdentifier>();

/// Internal resource client to declare the resource.
@protected
late final $p.ResourcesClient client;
late final $p.ResourcesClient _client;

late final ClientChannel channel;
final ClientChannel _channel = createClientChannelFromEnvVar();

@protected
Resource(this.name, $p.ResourcesClient? client) {
if (client == null) {
channel = createClientChannelFromEnvVar();

this.client = $p.ResourcesClient(channel);
_client = $p.ResourcesClient(_channel);
} else {
this.client = client;
_client = client;
}
}

/// Register the resource with the Nitric server.
Future<void> register();
ResourceDeclareRequest asRequest();

/// Register the resource with the Nitric server. Handles shutting down the channel.
Future<void> register() async {
var res = asRequest();

await _client.declare(res);

await _channel.shutdown();

_registrationCompletion.complete(res.id);
}
}

/// A resource that requires permissions to access it.
Expand All @@ -75,9 +79,9 @@ abstract class SecureResource<T extends Enum> extends Resource {
/// Convert a list of permissions to gRPC actions.
List<$p.Action> permissionsToActions(List<T> 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<void> registerPolicy(List<T> permissions) async {
var resourceIdentifier = await registrationCompletion.future;
var resourceIdentifier = await _registrationCompletion.future;

var policyResource = $p.ResourceIdentifier(type: $p.ResourceType.Policy);

Expand All @@ -86,9 +90,17 @@ abstract class SecureResource<T extends Enum> extends Resource {
resources: [resourceIdentifier],
actions: permissionsToActions(permissions));

await client
await _client
.declare($p.ResourceDeclareRequest(policy: policy, id: policyResource));

await channel.shutdown();
await _channel.shutdown();
}

/// Register the resource with the Nitric server.
@override
Future<void> register() async {
var res = asRequest();

await _client.declare(res);
}
}
8 changes: 3 additions & 5 deletions lib/src/resources/keyvalue.dart
Original file line number Diff line number Diff line change
Expand Up @@ -7,16 +7,14 @@ class KeyValueStoreResource extends SecureResource<KeyValueStorePermission> {
: super(name, client);

@override
Future<void> register() async {
ResourceDeclareRequest asRequest() {
var resource = $p.ResourceIdentifier(
type: $p.ResourceType.KeyValueStore,
name: name,
);

await client.declare($p.ResourceDeclareRequest(
id: resource, keyValueStore: $p.KeyValueStoreResource()));

registrationCompletion.complete(resource);
return $p.ResourceDeclareRequest(
id: resource, keyValueStore: $p.KeyValueStoreResource());
}

@override
Expand Down
8 changes: 3 additions & 5 deletions lib/src/resources/oidc.dart
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ class OidcSecurityDefinition extends Resource {
}

@override
Future<void> register() async {
ResourceDeclareRequest asRequest() {
var resource = $p.ResourceIdentifier(
name: ruleName,
type: $p.ResourceType.ApiSecurityDefinition,
Expand All @@ -44,9 +44,7 @@ class OidcSecurityDefinition extends Resource {
var securityDefinition =
ApiSecurityDefinitionResource(apiName: apiName, oidc: oidc);

await client.declare($p.ResourceDeclareRequest(
id: resource, apiSecurityDefinition: securityDefinition));

await channel.shutdown();
return $p.ResourceDeclareRequest(
id: resource, apiSecurityDefinition: securityDefinition);
}
}
7 changes: 2 additions & 5 deletions lib/src/resources/queue.dart
Original file line number Diff line number Diff line change
Expand Up @@ -7,16 +7,13 @@ class QueueResource extends SecureResource<QueuePermission> {
: super(name, client);

@override
Future<void> register() async {
ResourceDeclareRequest asRequest() {
var resource = $p.ResourceIdentifier(
type: $p.ResourceType.Queue,
name: name,
);

await client.declare(
$p.ResourceDeclareRequest(id: resource, queue: $p.QueueResource()));

registrationCompletion.complete(resource);
return $p.ResourceDeclareRequest(id: resource, queue: $p.QueueResource());
}

@override
Expand Down
6 changes: 2 additions & 4 deletions lib/src/resources/schedule.dart
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,10 @@ class Schedule extends Resource {
Schedule(String name, {$p.ResourcesClient? client}) : super(name, client);

@override
Future<void> register() async {
ResourceDeclareRequest asRequest() {
var res = $p.ResourceIdentifier(name: name, type: $p.ResourceType.Schedule);

await client.declare($p.ResourceDeclareRequest(id: res));

await channel.shutdown();
return $p.ResourceDeclareRequest(id: res);
}

/// Run [middleware] at a certain interval defined by the [rate]. E.g. '7 days', '3 hours', '30 minutes'.
Expand Down
7 changes: 2 additions & 5 deletions lib/src/resources/secret.dart
Original file line number Diff line number Diff line change
Expand Up @@ -7,16 +7,13 @@ class SecretResource extends SecureResource<SecretPermission> {
: super(name, client);

@override
Future<void> register() async {
ResourceDeclareRequest asRequest() {
var resource = $p.ResourceIdentifier(
name: name,
type: $p.ResourceType.Secret,
);

await client.declare(
$p.ResourceDeclareRequest(id: resource, secret: $p.SecretResource()));

registrationCompletion.complete(resource);
return $p.ResourceDeclareRequest(id: resource, secret: $p.SecretResource());
}

@override
Expand Down
9 changes: 2 additions & 7 deletions lib/src/resources/topic.dart
Original file line number Diff line number Diff line change
Expand Up @@ -9,18 +9,13 @@ class Topic extends SecureResource<TopicPermission> {
Future<void> subscribe(MessageHandler handler) async {}

@override
Future<void> register() async {
ResourceDeclareRequest asRequest() {
var resource = $p.ResourceIdentifier(
name: name,
type: $p.ResourceType.Topic,
);

await client.declare(
$p.ResourceDeclareRequest(id: resource, topic: $p.TopicResource()));

registrationCompletion.complete(resource);

await channel.shutdown();
return $p.ResourceDeclareRequest(id: resource, topic: $p.TopicResource());
}

@override
Expand Down
6 changes: 2 additions & 4 deletions lib/src/resources/websocket.dart
Original file line number Diff line number Diff line change
Expand Up @@ -10,15 +10,13 @@ class Websocket extends Resource {
}

@override
Future<void> register() async {
ResourceDeclareRequest asRequest() {
var resource = $p.ResourceIdentifier(
name: name,
type: $p.ResourceType.Websocket,
);

await client.declare($p.ResourceDeclareRequest(id: resource));

await channel.shutdown();
return $p.ResourceDeclareRequest(id: resource);
}

/// Send message [data] to a connection, referenced by its [connectionId].
Expand Down

0 comments on commit 7871998

Please sign in to comment.