1
1
import 'dart:async' ;
2
2
import 'dart:convert' ;
3
3
4
+ import 'package:nitric_sdk/src/api/api.dart' ;
4
5
import 'package:nitric_sdk/src/context/common.dart' ;
5
6
import 'package:nitric_sdk/src/grpc_helper.dart' ;
6
7
import 'package:nitric_sdk/src/nitric/proto/storage/v1/storage.pbgrpc.dart'
@@ -10,21 +11,15 @@ import 'package:fixnum/fixnum.dart';
10
11
import 'package:nitric_sdk/src/workers/common.dart' ;
11
12
12
13
class Bucket {
13
- late $p.StorageClient _storageClient;
14
- late $p.StorageListenerClient ? _storageListenerClient;
14
+ late final $p.StorageClient ? _storageClient;
15
+ late final $p.StorageListenerClient ? _storageListenerClient;
15
16
16
17
String name;
17
18
18
19
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;
28
23
_storageListenerClient = storageListenerClient;
29
24
}
30
25
@@ -33,12 +28,27 @@ class Bucket {
33
28
return File (this , key);
34
29
}
35
30
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
+
36
45
/// Get a list of references to the files in the bucket. Optionally supply a [prefix] to filter by.
37
46
Future <List <File >> files ({String prefix = "" }) async {
38
47
final request =
39
48
$p.StorageListBlobsRequest (bucketName: name, prefix: prefix);
40
49
41
- var resp = await _storageClient.listBlobs (request);
50
+ var resp =
51
+ await _useClient ((client) async => await client.listBlobs (request));
42
52
43
53
return resp.blobs.map ((blob) => File (this , blob.key)).toList ();
44
54
}
@@ -81,7 +91,7 @@ class File {
81
91
key: key,
82
92
);
83
93
84
- await _bucket._storageClient .delete (req);
94
+ await _bucket._useClient ((client) async => await client .delete (req) );
85
95
}
86
96
87
97
/// Read the file from the bucket.
@@ -91,7 +101,8 @@ class File {
91
101
key: key,
92
102
);
93
103
94
- var resp = await _bucket._storageClient.read (req);
104
+ var resp =
105
+ await _bucket._useClient ((client) async => await client.read (req));
95
106
96
107
return utf8.decode (resp.body);
97
108
}
@@ -106,7 +117,7 @@ class File {
106
117
body: bytes,
107
118
);
108
119
109
- await _bucket._storageClient .write (req);
120
+ await _bucket._useClient ((client) async => await client .write (req) );
110
121
}
111
122
112
123
/// Check whether the file exists in the bucket.
@@ -116,7 +127,8 @@ class File {
116
127
key: key,
117
128
);
118
129
119
- var resp = await _bucket._storageClient.exists (req);
130
+ var resp =
131
+ await _bucket._useClient ((client) async => await client.exists (req));
120
132
121
133
return resp.exists;
122
134
}
@@ -148,7 +160,8 @@ class File {
148
160
expiry: exp,
149
161
);
150
162
151
- var resp = await _bucket._storageClient.preSignUrl (req);
163
+ var resp = await _bucket
164
+ ._useClient ((client) async => await client.preSignUrl (req));
152
165
153
166
return resp.url;
154
167
}
0 commit comments