11import 'dart:async' ;
22import 'dart:convert' ;
33
4+ import 'package:nitric_sdk/src/api/api.dart' ;
45import 'package:nitric_sdk/src/context/common.dart' ;
56import 'package:nitric_sdk/src/grpc_helper.dart' ;
67import 'package:nitric_sdk/src/nitric/proto/storage/v1/storage.pbgrpc.dart'
@@ -10,21 +11,15 @@ import 'package:fixnum/fixnum.dart';
1011import 'package:nitric_sdk/src/workers/common.dart' ;
1112
1213class Bucket {
13- late $p.StorageClient _storageClient;
14- late $p.StorageListenerClient ? _storageListenerClient;
14+ late final $p.StorageClient ? _storageClient;
15+ late final $p.StorageListenerClient ? _storageListenerClient;
1516
1617 String name;
1718
1819 Bucket (this .name,
19- {$p.StorageClient ? client,
20- $p.StorageListenerClient ? storageListenerClient}) {
21- if (client == null ) {
22- _storageClient =
23- $p.StorageClient (ClientChannelSingleton .instance.clientChannel);
24- } else {
25- _storageClient = client;
26- }
27-
20+ {$p.StorageListenerClient ? storageListenerClient,
21+ $p.StorageClient ? client}) {
22+ _storageClient = client;
2823 _storageListenerClient = storageListenerClient;
2924 }
3025
@@ -33,12 +28,27 @@ class Bucket {
3328 return File (this , key);
3429 }
3530
31+ Future <Resp > _useClient <Resp >(
32+ UseClientCallback <$p.StorageClient , Resp > callback) async {
33+ final client = _storageClient ??
34+ $p.StorageClient (ClientChannelSingleton .instance.clientChannel);
35+
36+ var resp = await callback (client);
37+
38+ if (_storageClient == null ) {
39+ await ClientChannelSingleton .instance.release ();
40+ }
41+
42+ return resp;
43+ }
44+
3645 /// Get a list of references to the files in the bucket. Optionally supply a [prefix] to filter by.
3746 Future <List <File >> files ({String prefix = "" }) async {
3847 final request =
3948 $p.StorageListBlobsRequest (bucketName: name, prefix: prefix);
4049
41- var resp = await _storageClient.listBlobs (request);
50+ var resp =
51+ await _useClient ((client) async => await client.listBlobs (request));
4252
4353 return resp.blobs.map ((blob) => File (this , blob.key)).toList ();
4454 }
@@ -81,7 +91,7 @@ class File {
8191 key: key,
8292 );
8393
84- await _bucket._storageClient .delete (req);
94+ await _bucket._useClient ((client) async => await client .delete (req) );
8595 }
8696
8797 /// Read the file from the bucket.
@@ -91,7 +101,8 @@ class File {
91101 key: key,
92102 );
93103
94- var resp = await _bucket._storageClient.read (req);
104+ var resp =
105+ await _bucket._useClient ((client) async => await client.read (req));
95106
96107 return utf8.decode (resp.body);
97108 }
@@ -106,7 +117,7 @@ class File {
106117 body: bytes,
107118 );
108119
109- await _bucket._storageClient .write (req);
120+ await _bucket._useClient ((client) async => await client .write (req) );
110121 }
111122
112123 /// Check whether the file exists in the bucket.
@@ -116,7 +127,8 @@ class File {
116127 key: key,
117128 );
118129
119- var resp = await _bucket._storageClient.exists (req);
130+ var resp =
131+ await _bucket._useClient ((client) async => await client.exists (req));
120132
121133 return resp.exists;
122134 }
@@ -148,7 +160,8 @@ class File {
148160 expiry: exp,
149161 );
150162
151- var resp = await _bucket._storageClient.preSignUrl (req);
163+ var resp = await _bucket
164+ ._useClient ((client) async => await client.preSignUrl (req));
152165
153166 return resp.url;
154167 }
0 commit comments