Skip to content

Commit aa609bd

Browse files
committed
feat(cloud): Add Operations.waitOperation
1 parent 4c3c045 commit aa609bd

File tree

6 files changed

+58
-0
lines changed

6 files changed

+58
-0
lines changed

packages/celest_cloud/CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
# 0.1.5-wip
22

3+
- feat: Add `Operations.waitOperation`
34
- chore: Update license
45

56
# 0.1.4

packages/celest_cloud/lib/src/cloud/operations/operations.dart

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import 'package:celest_cloud/src/cloud/base/base_service.dart';
22
import 'package:celest_cloud/src/cloud/operations/operations_protocol.dart';
33
import 'package:celest_cloud/src/grpc.dart';
4+
import 'package:celest_cloud/src/util/well_known.dart';
45
import 'package:logging/logging.dart';
56

67
final class Operations with BaseService {
@@ -37,4 +38,15 @@ final class Operations with BaseService {
3738
final request = CancelOperationRequest(name: name);
3839
return run('Operations.Cancel', request: request, action: _protocol.cancel);
3940
}
41+
42+
Future<Operation> wait(
43+
String name, {
44+
Duration? timeout,
45+
}) async {
46+
final request = WaitOperationRequest(
47+
name: name,
48+
timeout: timeout?.toProto(),
49+
);
50+
return run('Operations.Wait', request: request, action: _protocol.wait);
51+
}
4052
}

packages/celest_cloud/lib/src/cloud/operations/operations_protocol.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,5 @@ abstract interface class OperationsProtocol {
44
Future<Operation> get(GetOperationRequest request);
55
Future<ListOperationsResponse> list(ListOperationsRequest request);
66
Future<void> cancel(CancelOperationRequest request);
7+
Future<Operation> wait(WaitOperationRequest request);
78
}

packages/celest_cloud/lib/src/cloud/operations/operations_protocol.grpc.dart

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,4 +24,9 @@ final class OperationsProtocolGrpc implements OperationsProtocol {
2424
Future<ListOperationsResponse> list(ListOperationsRequest request) {
2525
return _client.listOperations(request);
2626
}
27+
28+
@override
29+
Future<Operation> wait(WaitOperationRequest request) {
30+
return _client.waitOperation(request);
31+
}
2732
}

packages/celest_cloud/lib/src/cloud/operations/operations_protocol.http.dart

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,4 +94,33 @@ final class OperationsProtocolHttp
9494
typeRegistry: CelestCloud.typeRegistry,
9595
);
9696
}
97+
98+
@override
99+
Future<Operation> wait(WaitOperationRequest request) async {
100+
if (request.name == '') {
101+
throw ArgumentError.value(request.name, 'name', 'must not be empty');
102+
}
103+
final url = Uri.parse('/v1alpha1/${request.name}:wait');
104+
final req = http.Request('POST', url)
105+
..headers['content-type'] = 'application/json'
106+
..headers['accept'] = 'application/json'
107+
..body = jsonEncode(
108+
request.toProto3Json(
109+
typeRegistry: CelestCloud.typeRegistry,
110+
),
111+
);
112+
final res = await _client.send(req);
113+
final body = await res.stream.toBytes();
114+
if (res.statusCode != 200) {
115+
throwError(
116+
statusCode: res.statusCode,
117+
bodyBytes: body,
118+
);
119+
}
120+
return Operation()
121+
..mergeFromProto3Json(
122+
JsonUtf8.decode(body),
123+
typeRegistry: CelestCloud.typeRegistry,
124+
);
125+
}
97126
}

packages/celest_cloud/lib/src/util/well_known.dart

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
import 'package:celest_cloud/src/proto.dart';
2+
import 'package:celest_cloud/src/proto/google/protobuf/duration.pb.dart' as pb;
23
import 'package:celest_cloud/src/proto/google/protobuf/timestamp.pb.dart';
4+
import 'package:fixnum/fixnum.dart';
35

46
extension DateTimeProto on DateTime {
57
Timestamp toProto() {
@@ -8,3 +10,11 @@ extension DateTimeProto on DateTime {
810
return ts;
911
}
1012
}
13+
14+
extension DurationProto on Duration {
15+
pb.Duration toProto() {
16+
return pb.Duration()
17+
..seconds = Int64(inSeconds)
18+
..nanos = inMicroseconds.remainder(Duration.microsecondsPerSecond) * 1000;
19+
}
20+
}

0 commit comments

Comments
 (0)