Skip to content

Commit b2c3a36

Browse files
authored
Added possibility to set state using heartbeat endpoint. (#277)
* Added possibility to set state using heartbeat endpoint. * PubNub SDK v6.3.6 release.
1 parent 3b43a75 commit b2c3a36

17 files changed

Lines changed: 484 additions & 79 deletions

File tree

.pubnub.yml

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
name: java
2-
version: 6.3.5
2+
version: 6.3.6
33
schema: 1
44
scm: github.com/pubnub/java
55
files:
6-
- build/libs/pubnub-gson-6.3.5-all.jar
6+
- build/libs/pubnub-gson-6.3.6-all.jar
77
sdks:
88
-
99
type: library
@@ -23,8 +23,8 @@ sdks:
2323
-
2424
distribution-type: library
2525
distribution-repository: GitHub
26-
package-name: pubnub-gson-6.3.5
27-
location: https://github.com/pubnub/java/releases/download/v6.3.5/pubnub-gson-6.3.5-all.jar
26+
package-name: pubnub-gson-6.3.6
27+
location: https://github.com/pubnub/java/releases/download/v6.3.6/pubnub-gson-6.3.6-all.jar
2828
supported-platforms:
2929
supported-operating-systems:
3030
Android:
@@ -135,8 +135,8 @@ sdks:
135135
-
136136
distribution-type: library
137137
distribution-repository: maven
138-
package-name: pubnub-gson-6.3.5
139-
location: https://repo.maven.apache.org/maven2/com/pubnub/pubnub-gson/6.3.5/pubnub-gson-6.3.5.jar
138+
package-name: pubnub-gson-6.3.6
139+
location: https://repo.maven.apache.org/maven2/com/pubnub/pubnub-gson/6.3.6/pubnub-gson-6.3.6.jar
140140
supported-platforms:
141141
supported-operating-systems:
142142
Android:
@@ -234,6 +234,11 @@ sdks:
234234
is-required: Required
235235

236236
changelog:
237+
- date: 2023-06-19
238+
version: v6.3.6
239+
changes:
240+
- type: feature
241+
text: "Added possibility to set state using heartbeat endpoint. ."
237242
- date: 2023-05-18
238243
version: v6.3.5
239244
changes:

CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,9 @@
1+
## v6.3.6
2+
June 19 2023
3+
4+
#### Added
5+
- Added possibility to set state using heartbeat endpoint. .
6+
17
## v6.3.5
28
May 18 2023
39

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,13 +22,13 @@ You will need the publish and subscribe keys to authenticate your app. Get your
2222
<dependency>
2323
<groupId>com.pubnub</groupId>
2424
<artifactId>pubnub-gson</artifactId>
25-
<version>6.3.5</version>
25+
<version>6.3.6</version>
2626
</dependency>
2727
```
2828

2929
* for Gradle, add the following dependency in your `gradle.build`:
3030
```groovy
31-
implementation 'com.pubnub:pubnub-gson:6.3.5'
31+
implementation 'com.pubnub:pubnub-gson:6.3.6'
3232
```
3333

3434
2. Configure your keys:

build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ plugins {
1010
}
1111
group = 'com.pubnub'
1212

13-
version = '6.3.5'
13+
version = '6.3.6'
1414

1515
description = """"""
1616

gradle.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ SONATYPE_HOST=DEFAULT
33
SONATYPE_AUTOMATIC_RELEASE=true
44
GROUP=com.pubnub
55
POM_ARTIFACT_ID=pubnub-gson
6-
VERSION_NAME=6.3.5
6+
VERSION_NAME=6.3.6
77
POM_PACKAGING=jar
88

99
POM_NAME=PubNub Java SDK

src/integrationTest/java/com/pubnub/api/integration/PresenceIntegrationTests.java

Lines changed: 103 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import org.awaitility.Durations;
2323
import org.hamcrest.core.IsEqual;
2424
import org.jetbrains.annotations.NotNull;
25+
import org.junit.Ignore;
2526
import org.junit.Test;
2627

2728
import java.util.ArrayList;
@@ -38,6 +39,8 @@
3839

3940
public class PresenceIntegrationTests extends BaseIntegrationTest {
4041

42+
private static final String STATE_CHANGE_EVENT = "state-change";
43+
4144
@Test
4245
public void testWhereNow() {
4346
final AtomicBoolean success = new AtomicBoolean();
@@ -206,6 +209,101 @@ public void testHereNow() {
206209
listen(success);
207210
}
208211

212+
@Ignore("For now server doesn't emit state-change event on Heartbeat as default. To do this you need to set presence_heartbeat_state_change_event flag on keys. " +
213+
"Server plans to generate state-change event as default. Once server change is on Prod modify it by replacing Thread.sleep(10000) with Awaitility.await()")
214+
@Test
215+
public void should_setState_withHeartbeat() throws InterruptedException {
216+
// enableHeartbeatLoop(2);
217+
boolean WITH_HEARTBEAT_TRUE = true;
218+
final AtomicInteger hits = new AtomicInteger();
219+
final int expectedHits = 2;
220+
221+
final JsonObject expectedStatePayload = generatePayload();
222+
final String expectedChannel = RandomGenerator.get();
223+
224+
pubNub.addListener(new SubscribeCallback() {
225+
@Override
226+
public void file(@NotNull PubNub pubnub, @NotNull PNFileEventResult pnFileEventResult) {
227+
228+
}
229+
230+
@Override
231+
public void status(@NotNull PubNub pubnub, @NotNull PNStatus status) {
232+
System.out.println("---" + status.getCategory());
233+
}
234+
235+
@Override
236+
public void message(@NotNull PubNub pubnub, @NotNull PNMessageResult message) {
237+
238+
}
239+
240+
@Override
241+
public void presence(@NotNull PubNub pubnub, @NotNull PNPresenceEventResult presence) {
242+
System.out.println("---" + presence.getEvent());
243+
if (presence.getEvent().equals(STATE_CHANGE_EVENT)
244+
&& presence.getChannel().equals(expectedChannel)
245+
&& presence.getUuid().equals(pubNub.getConfiguration().getUserId().getValue())) {
246+
assertEquals(expectedStatePayload, presence.getState());
247+
hits.incrementAndGet();
248+
}
249+
}
250+
251+
@Override
252+
public void signal(@NotNull PubNub pubNub, @NotNull PNSignalResult pnSignalResult) {
253+
254+
}
255+
256+
@Override
257+
public void uuid(@NotNull final PubNub pubnub, @NotNull final PNUUIDMetadataResult pnUUIDMetadataResult) {
258+
259+
}
260+
261+
@Override
262+
public void channel(@NotNull final PubNub pubnub, @NotNull final PNChannelMetadataResult pnChannelMetadataResult) {
263+
264+
}
265+
266+
@Override
267+
public void membership(@NotNull final PubNub pubnub, @NotNull final PNMembershipResult pnMembershipResult) {
268+
269+
}
270+
271+
@Override
272+
public void messageAction(@NotNull PubNub pubnub, @NotNull PNMessageActionResult pnActionResult) {
273+
274+
}
275+
});
276+
277+
subscribeToChannel(pubNub, expectedChannel);
278+
279+
pubNub.setPresenceState()
280+
.channels(Collections.singletonList(expectedChannel))
281+
.state(expectedStatePayload)
282+
.withHeartbeat(WITH_HEARTBEAT_TRUE)
283+
.async((result, status) -> {
284+
assertFalse(status.isError());
285+
assert result != null;
286+
assertEquals(expectedStatePayload, result.getState());
287+
});
288+
289+
// Awaitility.await().atMost(Durations.FIVE_SECONDS).untilAtomic(hits, IsEqual.equalTo(1));
290+
Thread.sleep(1000);
291+
292+
pubNub.getPresenceState()
293+
.channels(Collections.singletonList(expectedChannel))
294+
.async((result, status) -> {
295+
assertFalse(status.isError());
296+
assert result != null;
297+
assertEquals(expectedStatePayload.get("text"), result.getStateByUUID().get(expectedChannel).getAsJsonObject().get("text"));
298+
assertEquals(expectedStatePayload.get("info"), result.getStateByUUID().get(expectedChannel).getAsJsonObject().get("info"));
299+
assertEquals(expectedStatePayload.get("uncd"), result.getStateByUUID().get(expectedChannel).getAsJsonObject().get("uncd"));
300+
hits.incrementAndGet();
301+
});
302+
303+
// Awaitility.await().atMost(Durations.FIVE_SECONDS).untilAtomic(hits, IsEqual.equalTo(expectedHits));
304+
Thread.sleep(1000);
305+
}
306+
209307
@Test
210308
public void testPresenceState() {
211309
final AtomicInteger hits = new AtomicInteger();
@@ -232,7 +330,7 @@ public void message(@NotNull PubNub pubnub, @NotNull PNMessageResult message) {
232330

233331
@Override
234332
public void presence(@NotNull PubNub pubnub, @NotNull PNPresenceEventResult presence) {
235-
if (presence.getEvent().equals("state-change")
333+
if (presence.getEvent().equals(STATE_CHANGE_EVENT)
236334
&& presence.getChannel().equals(expectedChannel)
237335
&& presence.getUuid().equals(pubNub.getConfiguration().getUserId().getValue())) {
238336
assertEquals(expectedStatePayload, presence.getState());
@@ -458,4 +556,8 @@ public void messageAction(@NotNull PubNub pubnub, @NotNull PNMessageActionResult
458556
.atMost(20, TimeUnit.SECONDS)
459557
.until(() -> subscribeSuccess.get() && heartbeatCallsCount.get() > 2);
460558
}
559+
560+
private void enableHeartbeatLoop(int interval) {
561+
pubNub.getConfiguration().setPresenceTimeoutWithCustomInterval(20, interval);
562+
}
461563
}

src/main/java/com/pubnub/api/PubNub.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ public class PubNub {
105105
private static final int TIMESTAMP_DIVIDER = 1000;
106106
private static final int MAX_SEQUENCE = 65535;
107107

108-
private static final String SDK_VERSION = "6.3.5";
108+
private static final String SDK_VERSION = "6.3.6";
109109
private final ListenerManager listenerManager;
110110
private final StateManager stateManager;
111111

src/main/java/com/pubnub/api/builder/PubNubErrorBuilder.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -366,6 +366,16 @@ public final class PubNubErrorBuilder {
366366
*/
367367
public static final int PNERR_SPACEID_NULL_OR_EMPTY = 171;
368368

369+
/**
370+
* State must be a JSON object.
371+
*/
372+
public static final int PNERR_STATE_MUST_BE_JSON_OBJECT = 172;
373+
374+
/**
375+
* UserId can't be different from UserId in configuration when flag withHeartbeat is set to true.
376+
*/
377+
public static final int PNERR_USERID_CAN_NOT_BE_DIFFERENT = 173;
378+
369379
// Error Objects
370380
public static final PubNubError PNERROBJ_TIMEOUT = PubNubError.builder()
371381
.errorCode(PNERR_TIMEOUT)
@@ -549,6 +559,11 @@ public final class PubNubErrorBuilder {
549559
.message("State Missing.")
550560
.build();
551561

562+
public static final PubNubError PNERROBJ_STATE_MUST_BE_JSON_OBJECT = PubNubError.builder()
563+
.errorCode(PNERR_STATE_MUST_BE_JSON_OBJECT)
564+
.message("State must be a JSON object.")
565+
.build();
566+
552567
public static final PubNubError PNERROBJ_MESSAGE_MISSING = PubNubError.builder()
553568
.errorCode(PNERR_MESSAGE_MISSING)
554569
.message("Message Missing.")
@@ -730,6 +745,11 @@ public final class PubNubErrorBuilder {
730745
.message("SpaceId can't be null nor empty.")
731746
.build();
732747

748+
public static final PubNubError PNERROBJ_USERID_CAN_NOT_BE_DIFFERENT_FROM_IN_CONFIGURATION_WHEN_WITHHEARTBEAT_TRUE = PubNubError.builder()
749+
.errorCode(PNERR_USERID_CAN_NOT_BE_DIFFERENT)
750+
.message("UserId can't be different from UserId in configuration when flag withHeartbeat is set to true.")
751+
.build();
752+
733753
private PubNubErrorBuilder() {
734754

735755
}

src/main/java/com/pubnub/api/endpoints/presence/Heartbeat.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.pubnub.api.endpoints.presence;
22

3+
import com.google.gson.JsonElement;
34
import com.pubnub.api.PubNub;
45
import com.pubnub.api.PubNubException;
56
import com.pubnub.api.PubNubUtil;
@@ -20,7 +21,7 @@
2021
import java.util.Map;
2122

2223
@Accessors(chain = true, fluent = true)
23-
public class Heartbeat extends Endpoint<Envelope, Boolean> {
24+
public class Heartbeat extends Endpoint<Envelope<JsonElement>, Boolean> {
2425

2526
@Setter
2627
private List<String> channels;
@@ -56,7 +57,7 @@ protected void validateParams() throws PubNubException {
5657
}
5758

5859
@Override
59-
protected Call<Envelope> doWork(Map<String, String> params) throws PubNubException {
60+
protected Call<Envelope<JsonElement>> doWork(Map<String, String> params) throws PubNubException {
6061
params.put("heartbeat", String.valueOf(this.getPubnub().getConfiguration().getPresenceTimeout()));
6162

6263
if (channelGroups.size() > 0) {
@@ -83,7 +84,7 @@ protected Call<Envelope> doWork(Map<String, String> params) throws PubNubExcepti
8384
}
8485

8586
@Override
86-
protected Boolean createResponse(Response<Envelope> input) throws PubNubException {
87+
protected Boolean createResponse(Response<Envelope<JsonElement>> input) throws PubNubException {
8788
return true;
8889
}
8990

0 commit comments

Comments
 (0)