21
21
import com .hedera .block .server .consumer .LiveStreamObserver ;
22
22
import com .hedera .block .server .consumer .LiveStreamObserverImpl ;
23
23
import com .hedera .block .server .mediator .StreamMediator ;
24
+ import com .hedera .block .server .persistence .BlockPersistenceHandler ;
24
25
import com .hedera .block .server .producer .ProducerBlockStreamObserver ;
26
+ import io .grpc .Status ;
25
27
import io .grpc .stub .StreamObserver ;
26
28
import io .helidon .webserver .grpc .GrpcService ;
27
29
28
30
import java .time .Clock ;
31
+ import java .util .Optional ;
32
+
33
+ import static io .helidon .webserver .grpc .ResponseHelper .complete ;
29
34
30
35
import static com .hedera .block .server .Constants .*;
31
36
@@ -43,6 +48,7 @@ public class BlockStreamService implements GrpcService {
43
48
44
49
private final long timeoutThresholdMillis ;
45
50
private final StreamMediator <BlockStreamServiceGrpcProto .Block , BlockStreamServiceGrpcProto .BlockResponse > streamMediator ;
51
+ private final BlockPersistenceHandler <BlockStreamServiceGrpcProto .Block > blockPersistenceHandler ;
46
52
47
53
/**
48
54
* Constructor for the BlockStreamService class.
@@ -51,10 +57,12 @@ public class BlockStreamService implements GrpcService {
51
57
* @param streamMediator the stream mediator
52
58
*/
53
59
public BlockStreamService (final long timeoutThresholdMillis ,
54
- final StreamMediator <BlockStreamServiceGrpcProto .Block , BlockStreamServiceGrpcProto .BlockResponse > streamMediator ) {
60
+ final StreamMediator <BlockStreamServiceGrpcProto .Block , BlockStreamServiceGrpcProto .BlockResponse > streamMediator ,
61
+ final BlockPersistenceHandler <BlockStreamServiceGrpcProto .Block > blockPersistenceHandler ) {
55
62
56
63
this .timeoutThresholdMillis = timeoutThresholdMillis ;
57
64
this .streamMediator = streamMediator ;
65
+ this .blockPersistenceHandler = blockPersistenceHandler ;
58
66
}
59
67
60
68
/**
@@ -87,6 +95,7 @@ public String serviceName() {
87
95
public void update (final Routing routing ) {
88
96
routing .bidi (CLIENT_STREAMING_METHOD_NAME , this ::streamSink );
89
97
routing .bidi (SERVER_STREAMING_METHOD_NAME , this ::streamSource );
98
+ routing .unary ("GetBlock" , this ::getBlock );
90
99
}
91
100
92
101
/**
@@ -129,6 +138,24 @@ private StreamObserver<BlockStreamServiceGrpcProto.BlockResponse> streamSource(f
129
138
130
139
return streamObserver ;
131
140
}
141
+
142
+ private void getBlock (BlockStreamServiceGrpcProto .Block block , StreamObserver <BlockStreamServiceGrpcProto .Block > responseObserver ) {
143
+ String message = "GET BLOCK RESPONSE! " ;
144
+ LOGGER .log (System .Logger .Level .INFO , "GetBlock request received" );
145
+ Optional <BlockStreamServiceGrpcProto .Block > responseBlock = blockPersistenceHandler .read (block .getId ());
146
+ if (responseBlock .isPresent ()) {
147
+ LOGGER .log (System .Logger .Level .INFO , "SENDING BLOCK # " + block .getId ());
148
+ complete (responseObserver , responseBlock .get ()); // TODO: Should return int and not quoted string
149
+ } else {
150
+ LOGGER .log (System .Logger .Level .INFO , "DID NOT FIND YOUR BLOCK" );
151
+ // TODO: Fix below. It could return gRPC equivalent of 404 NOT FOUND
152
+ responseObserver .onError (Status .NOT_FOUND
153
+ .withDescription ("DID NOT FIND YOUR BLOCK" )
154
+ .asRuntimeException ()
155
+ );
156
+ // complete(responseObserver, BlockStreamServiceGrpcProto.Block.getDefaultInstance());
157
+ }
158
+ }
132
159
}
133
160
134
161
0 commit comments