Skip to content

Commit ad0ee01

Browse files
committed
added method to subscribe topic
Signed-off-by: Manish Dait <[email protected]>
1 parent a89a5a7 commit ad0ee01

File tree

17 files changed

+155
-6
lines changed

17 files changed

+155
-6
lines changed

hiero-enterprise-base/src/main/java/com/openelements/hiero/base/HieroContext.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
import com.openelements.hiero.base.data.Account;
55
import org.jspecify.annotations.NonNull;
66

7+
import java.util.Set;
8+
79
/**
810
* Context for a specific Hiero connection to a network.
911
*/
@@ -25,4 +27,7 @@ public interface HieroContext {
2527
*/
2628
@NonNull
2729
Client getClient();
30+
31+
@NonNull
32+
Set<String> getMirrorNodeEndPoint();
2833
}

hiero-enterprise-base/src/main/java/com/openelements/hiero/base/TopicClient.java

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
11
package com.openelements.hiero.base;
22

33
import com.hedera.hashgraph.sdk.PrivateKey;
4+
import com.hedera.hashgraph.sdk.SubscriptionHandle;
45
import com.hedera.hashgraph.sdk.TopicId;
6+
import com.hedera.hashgraph.sdk.TopicMessage;
57
import org.jspecify.annotations.NonNull;
68

79
import java.util.Objects;
10+
import java.util.function.Consumer;
811

912
/**
1013
* Interface for interacting with a Hiero network. This interface provides methods for interacting with Hiero Topic,
@@ -317,4 +320,24 @@ default void submitMessage(@NonNull String topicId, @NonNull String submitKey, @
317320
Objects.requireNonNull(message, "message cannot be null");
318321
submitMessage(TopicId.fromString(topicId), PrivateKey.fromString(submitKey), message);
319322
};
323+
324+
/**
325+
* Subscribe to a Topic
326+
*
327+
* @param topicId the topicId of topic
328+
* @return SubscriptionHandle for the Topic
329+
* @throws HieroException if Topic could not be subscribed
330+
*/
331+
SubscriptionHandle subscribeTopic(@NonNull TopicId topicId, @NonNull Consumer<TopicMessage> subscription) throws HieroException;
332+
333+
/**
334+
* Subscribe to a Topic
335+
*
336+
* @param topicId the topicId of topic
337+
* @return SubscriptionHandle for the Topic
338+
* @throws HieroException if Topic could not be subscribed
339+
*/
340+
default SubscriptionHandle subscribeTopic(@NonNull String topicId, @NonNull Consumer<TopicMessage> subscription) throws HieroException {
341+
return subscribeTopic(TopicId.fromString(topicId), subscription);
342+
}
320343
}

hiero-enterprise-base/src/main/java/com/openelements/hiero/base/config/HieroConfig.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,9 @@ public interface HieroConfig {
4141
@NonNull
4242
Set<String> getMirrorNodeAddresses();
4343

44+
@NonNull
45+
Set<String> getConsensusServiceAddress();
46+
4447
/**
4548
* Returns the consensus nodes.
4649
*
@@ -88,6 +91,11 @@ default HieroContext createHieroContext() {
8891
public @NonNull Client getClient() {
8992
return client;
9093
}
94+
95+
@Override
96+
public @NonNull Set<String> getMirrorNodeEndPoint() {
97+
return getMirrorNodeAddresses();
98+
}
9199
};
92100
}
93101

@@ -102,7 +110,7 @@ default Client createClient() {
102110
final Map<String, AccountId> nodes = getConsensusNodes().stream()
103111
.collect(Collectors.toMap(n -> n.getAddress(), n -> n.getAccountId()));
104112
final Client client = Client.forNetwork(nodes);
105-
final List<String> mirrorNodeAddresses = getMirrorNodeAddresses().stream().collect(Collectors.toList());
113+
final List<String> mirrorNodeAddresses = getConsensusServiceAddress().stream().collect(Collectors.toList());
106114
client.setMirrorNetwork(mirrorNodeAddresses);
107115
client.setOperator(getOperatorAccount().accountId(), getOperatorAccount().privateKey());
108116
getRequestTimeout().ifPresent(client::setRequestTimeout);

hiero-enterprise-base/src/main/java/com/openelements/hiero/base/config/NetworkSettings.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,14 @@ public interface NetworkSettings {
4040
@NonNull
4141
Set<String> getMirrorNodeAddresses();
4242

43+
/**
44+
* Returns the consensus service address.
45+
*
46+
* @return the consensus service addresses
47+
*/
48+
@NonNull
49+
Set<String> getConsensusServiceAddress();
50+
4351
/**
4452
* Returns the consensus nodes.
4553
*

hiero-enterprise-base/src/main/java/com/openelements/hiero/base/config/hedera/HederaMainnetSettings.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,9 @@ public final class HederaMainnetSettings implements NetworkSettings {
3131
return Set.of("https://mainnet.mirrornode.hedera.com:443");
3232
}
3333

34+
@Override
35+
public @NonNull Set<String> getConsensusServiceAddress() {return Set.of("mainnet.mirrornode.hedera.com:443");}
36+
3437
@Override
3538
public @NonNull Set<ConsensusNode> getConsensusNodes() {
3639
return Set.of(new ConsensusNode("35.186.191.247", "50211", "0.0.4"));

hiero-enterprise-base/src/main/java/com/openelements/hiero/base/config/hedera/HederaTestnetSettings.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,9 @@ public final class HederaTestnetSettings implements NetworkSettings {
3131
return Set.of("https://testnet.mirrornode.hedera.com:443");
3232
}
3333

34+
@Override
35+
public @NonNull Set<String> getConsensusServiceAddress() {return Set.of("testnet.mirrornode.hedera.com:443");}
36+
3437
@Override
3538
public @NonNull Set<ConsensusNode> getConsensusNodes() {
3639
return Set.of(new ConsensusNode("0.testnet.hedera.com", "50211", "0.0.3"));

hiero-enterprise-base/src/main/java/com/openelements/hiero/base/implementation/ProtocolLayerClientImpl.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -434,7 +434,7 @@ public TopicMessageResult executeTopicMessageQuery(TopicMessageRequest request)
434434
query.setLimit(request.limit());
435435
}
436436
final SubscriptionHandle subscribe = query.subscribe(hieroContext.getClient(), request.subscription());
437-
return new TopicMessageResult();
437+
return new TopicMessageResult(subscribe);
438438
} catch (final Exception e) {
439439
throw new HieroException("Failed to execute query message transaction", e);
440440
}

hiero-enterprise-base/src/main/java/com/openelements/hiero/base/implementation/TopicClientImpl.java

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,24 @@
11
package com.openelements.hiero.base.implementation;
22

33
import com.hedera.hashgraph.sdk.PrivateKey;
4+
import com.hedera.hashgraph.sdk.SubscriptionHandle;
45
import com.hedera.hashgraph.sdk.TopicId;
6+
import com.hedera.hashgraph.sdk.TopicMessage;
57
import com.openelements.hiero.base.HieroException;
68
import com.openelements.hiero.base.TopicClient;
79
import com.openelements.hiero.base.data.Account;
810
import com.openelements.hiero.base.protocol.ProtocolLayerClient;
9-
import com.openelements.hiero.base.protocol.data.*;
11+
import com.openelements.hiero.base.protocol.data.TopicCreateRequest;
12+
import com.openelements.hiero.base.protocol.data.TopicCreateResult;
13+
import com.openelements.hiero.base.protocol.data.TopicUpdateRequest;
14+
import com.openelements.hiero.base.protocol.data.TopicDeleteRequest;
15+
import com.openelements.hiero.base.protocol.data.TopicSubmitMessageRequest;
16+
import com.openelements.hiero.base.protocol.data.TopicMessageRequest;
17+
import com.openelements.hiero.base.protocol.data.TopicMessageResult;
1018
import org.jspecify.annotations.NonNull;
1119

1220
import java.util.Objects;
21+
import java.util.function.Consumer;
1322

1423
public class TopicClientImpl implements TopicClient {
1524
private final ProtocolLayerClient client;
@@ -107,7 +116,7 @@ public void updateTopic(@NonNull TopicId topicId, @NonNull PrivateKey updatedAdm
107116
Objects.requireNonNull(topicId, "topicId must not be null");
108117
Objects.requireNonNull(submitKey, "submitKey must not be null");
109118
Objects.requireNonNull(memo, "memo must not be null");
110-
updateTopic(topicId, operationalAccount.privateKey(), updatedAdminKey, submitKey, memo);
119+
updateTopic(topicId, operationalAccount.privateKey(), updatedAdminKey, submitKey, memo);
111120
}
112121

113122
@Override
@@ -202,4 +211,14 @@ public void submitMessage(@NonNull TopicId topicId, @NonNull PrivateKey submitKe
202211
TopicSubmitMessageRequest request = TopicSubmitMessageRequest.of(topicId, submitKey, message);
203212
client.executeTopicMessageSubmitTransaction(request);
204213
}
214+
215+
@Override
216+
public SubscriptionHandle subscribeTopic(@NonNull TopicId topicId, @NonNull Consumer<TopicMessage> subscription)
217+
throws HieroException {
218+
Objects.requireNonNull(topicId, "topicId must not be null");
219+
Objects.requireNonNull(subscription, "subscription must not be null");
220+
TopicMessageRequest request = TopicMessageRequest.of(topicId, subscription);
221+
TopicMessageResult result = client.executeTopicMessageQuery(request);
222+
return result.subscriptionHandle();
223+
}
205224
}
Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,14 @@
11
package com.openelements.hiero.base.protocol.data;
22

3-
public record TopicMessageResult() {
3+
import com.hedera.hashgraph.sdk.Status;
4+
import com.hedera.hashgraph.sdk.SubscriptionHandle;
5+
import com.hedera.hashgraph.sdk.TransactionId;
6+
import org.jspecify.annotations.NonNull;
7+
8+
import java.util.Objects;
9+
10+
public record TopicMessageResult(@NonNull SubscriptionHandle subscriptionHandle) {
11+
public TopicMessageResult {
12+
Objects.requireNonNull(subscriptionHandle, "subscriptionHandle must not be null");
13+
}
414
}

hiero-enterprise-base/src/test/java/com/openelements/hiero/base/test/ProtocolLayerClientTests.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111
import org.junit.jupiter.api.Assertions;
1212
import org.junit.jupiter.api.Test;
1313

14+
import java.util.Set;
15+
1416
public class ProtocolLayerClientTests {
1517

1618
@Test
@@ -31,6 +33,11 @@ void testNullParams() {
3133
public @NonNull Client getClient() {
3234
return null;
3335
}
36+
37+
@Override
38+
public @NonNull Set<String> getMirrorNodeEndPoint() {
39+
return null;
40+
}
3441
};
3542
final ProtocolLayerClient client = new ProtocolLayerClientImpl(context);
3643

0 commit comments

Comments
 (0)