Skip to content

Commit 8d8d70a

Browse files
authored
Merge pull request #219 from pusher/forward-channel-data-on-private-channels
Forward channel data on private channels
2 parents 5b7f697 + 1b541ec commit 8d8d70a

File tree

4 files changed

+50
-35
lines changed

4 files changed

+50
-35
lines changed

src/main/java/com/pusher/client/channel/impl/PresenceChannelImpl.java

Lines changed: 22 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.pusher.client.channel.impl;
22

33
import com.google.gson.Gson;
4+
import com.google.gson.JsonSyntaxException;
45
import com.google.gson.annotations.SerializedName;
56
import com.pusher.client.AuthorizationFailureException;
67
import com.pusher.client.Authorizer;
@@ -65,35 +66,10 @@ else if (event.equals(MEMBER_REMOVED_EVENT)) {
6566
}
6667

6768
@Override
68-
@SuppressWarnings("rawtypes")
6969
public String toSubscribeMessage() {
70-
71-
final String authResponse = getAuthResponse();
72-
73-
try {
74-
final Map authResponseMap = GSON.fromJson(authResponse, Map.class);
75-
final String authKey = (String)authResponseMap.get("auth");
76-
final Object channelData = authResponseMap.get("channel_data");
77-
78-
storeMyUserId(channelData);
79-
80-
final Map<Object, Object> jsonObject = new LinkedHashMap<Object, Object>();
81-
jsonObject.put("event", "pusher:subscribe");
82-
83-
final Map<Object, Object> dataMap = new LinkedHashMap<Object, Object>();
84-
dataMap.put("channel", name);
85-
dataMap.put("auth", authKey);
86-
dataMap.put("channel_data", channelData);
87-
88-
jsonObject.put("data", dataMap);
89-
90-
final String json = GSON.toJson(jsonObject);
91-
92-
return json;
93-
}
94-
catch (final Exception e) {
95-
throw new AuthorizationFailureException("Unable to parse response from Authorizer: " + authResponse, e);
96-
}
70+
String msg = super.toSubscribeMessage();
71+
myUserID = extractUserIdFromChannelData(channelData);
72+
return msg;
9773
}
9874

9975
@Override
@@ -187,9 +163,24 @@ private static PresenceData extractPresenceDataFrom(final String message) {
187163
}
188164

189165
@SuppressWarnings("rawtypes")
190-
private void storeMyUserId(final Object channelData) {
191-
final Map channelDataMap = GSON.fromJson((String)channelData, Map.class);
192-
myUserID = String.valueOf(channelDataMap.get("user_id"));
166+
private String extractUserIdFromChannelData(final String channelData) {
167+
final Map channelDataMap;
168+
try {
169+
channelDataMap = GSON.fromJson((String)channelData, Map.class);
170+
} catch (final JsonSyntaxException e) {
171+
throw new AuthorizationFailureException("Invalid response from Authorizer: unable to parse channel_data object: " + channelData, e);
172+
}
173+
Object maybeUserId;
174+
try {
175+
maybeUserId = channelDataMap.get("user_id");
176+
} catch (final NullPointerException e) {
177+
throw new AuthorizationFailureException("Invalid response from Authorizer: no user_id key in channel_data object: " + channelData);
178+
}
179+
if (maybeUserId == null) {
180+
throw new AuthorizationFailureException("Invalid response from Authorizer: no user_id key in channel_data object: " + channelData);
181+
}
182+
// user_id can be a string or an integer in the Channels websocket protocol
183+
return String.valueOf(maybeUserId);
193184
}
194185

195186
private class MemberData {

src/main/java/com/pusher/client/channel/impl/PrivateChannelImpl.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ public class PrivateChannelImpl extends ChannelImpl implements PrivateChannel {
2323
private final InternalConnection connection;
2424
private final Authorizer authorizer;
2525

26+
protected String channelData;
27+
2628
public PrivateChannelImpl(final InternalConnection connection, final String channelName,
2729
final Authorizer authorizer, final Factory factory) {
2830
super(channelName, factory);
@@ -90,13 +92,17 @@ public String toSubscribeMessage() {
9092
try {
9193
final Map authResponseMap = GSON.fromJson(authResponse, Map.class);
9294
final String authKey = (String)authResponseMap.get("auth");
95+
channelData = (String)authResponseMap.get("channel_data");
9396

9497
final Map<Object, Object> jsonObject = new LinkedHashMap<Object, Object>();
9598
jsonObject.put("event", "pusher:subscribe");
9699

97100
final Map<Object, Object> dataMap = new LinkedHashMap<Object, Object>();
98101
dataMap.put("channel", name);
99102
dataMap.put("auth", authKey);
103+
if (channelData != null) {
104+
dataMap.put("channel_data", channelData);
105+
}
100106

101107
jsonObject.put("data", dataMap);
102108

src/test/java/com/pusher/client/channel/impl/PresenceChannelImplTest.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
@RunWith(MockitoJUnitRunner.class)
2828
public class PresenceChannelImplTest extends PrivateChannelImplTest {
2929

30-
private static final String AUTH_RESPONSE = "\"auth\":\"a87fe72c6f36272aa4b1:f9db294eae7\",\"channel_data\":\"{\\\"user_id\\\":\\\"51169fc47abac\\\",\\\"user_info\\\":{\\\"name\\\":\\\"Phil Leggetter\\\",\\\"twitter_id\\\":\\\"@leggetter\\\"}}\"";
30+
private static final String AUTH_RESPONSE = "\"auth\":\"a87fe72c6f36272aa4b1:f9db294eae7\",\"channel_data\":\"{\\\"user_id\\\":\\\"5116a4519575b\\\",\\\"user_info\\\":{\\\"name\\\":\\\"Phil Leggetter\\\",\\\"twitter_id\\\":\\\"@leggetter\\\"}}\"";
3131
private static final String AUTH_RESPONSE_NUMERIC_ID = "\"auth\":\"a87fe72c6f36272aa4b1:f9db294eae7\",\"channel_data\":\"{\\\"user_id\\\":51169,\\\"user_info\\\":{\\\"name\\\":\\\"Phil Leggetter\\\",\\\"twitter_id\\\":\\\"@leggetter\\\"}}\"";
3232
private static final String USER_ID = "5116a4519575b";
3333

@@ -60,6 +60,14 @@ public void testReturnsCorrectSubscribeMessageWhenNumericId() {
6060
+ AUTH_RESPONSE_NUMERIC_ID + "}}", message);
6161
}
6262

63+
@Test
64+
public void testStoresCorrectUser() {
65+
channel.toSubscribeMessage();
66+
channel.onMessage("pusher_internal:subscription_succeeded",
67+
"{\"event\":\"pusher_internal:subscription_succeeded\",\"data\":\"{\\\"presence\\\":{\\\"count\\\":1,\\\"ids\\\":[\\\"5116a4519575b\\\"],\\\"hash\\\":{\\\"5116a4519575b\\\":{\\\"name\\\":\\\"Phil Leggetter\\\",\\\"twitter_id\\\":\\\"@leggetter\\\"}}}}\",\"channel\":\"presence-myChannel\"}");
68+
assertEquals(USER_ID, ((PresenceChannelImpl)channel).getMe().getId());
69+
}
70+
6371
@Override
6472
@Test
6573
public void testIsSubscribedMethod(){

src/test/java/com/pusher/client/channel/impl/PrivateChannelImplTest.java

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,8 @@
2121
@RunWith(MockitoJUnitRunner.class)
2222
public class PrivateChannelImplTest extends ChannelImplTest {
2323

24-
private static final String AUTH_TOKEN = "\"auth\":\"a87fe72c6f36272aa4b1:41dce43734b18bb\"";
24+
private static final String AUTH_RESPONSE = "\"auth\":\"a87fe72c6f36272aa4b1:41dce43734b18bb\"";
25+
private static final String AUTH_RESPONSE_WITH_CHANNEL_DATA = "\"auth\":\"a87fe72c6f36272aa4b1:41dce43734b18bb\",\"channel_data\":\"{\\\"user_id\\\":\\\"51169fc47abac\\\"}\"";
2526

2627
@Mock
2728
protected InternalConnection mockConnection;
@@ -32,7 +33,7 @@ public class PrivateChannelImplTest extends ChannelImplTest {
3233
@Before
3334
public void setUp() {
3435
super.setUp();
35-
when(mockAuthorizer.authorize(eq(getChannelName()), anyString())).thenReturn("{" + AUTH_TOKEN + "}");
36+
when(mockAuthorizer.authorize(eq(getChannelName()), anyString())).thenReturn("{" + AUTH_RESPONSE + "}");
3637
}
3738

3839
@Test
@@ -72,7 +73,16 @@ public void testPrivateChannelName() {
7273
@Test
7374
@Override
7475
public void testReturnsCorrectSubscribeMessage() {
75-
assertEquals("{\"event\":\"pusher:subscribe\",\"data\":{\"channel\":\"" + getChannelName() + "\"," + AUTH_TOKEN
76+
assertEquals("{\"event\":\"pusher:subscribe\",\"data\":{\"channel\":\"" + getChannelName() + "\"," + AUTH_RESPONSE
77+
+ "}}", channel.toSubscribeMessage());
78+
}
79+
80+
@Test
81+
public void testReturnsCorrectSubscribeMessageWithChannelData() {
82+
when(mockAuthorizer.authorize(eq(getChannelName()), anyString())).thenReturn(
83+
"{" + AUTH_RESPONSE_WITH_CHANNEL_DATA + "}");
84+
85+
assertEquals("{\"event\":\"pusher:subscribe\",\"data\":{\"channel\":\"" + getChannelName() + "\"," + AUTH_RESPONSE_WITH_CHANNEL_DATA
7686
+ "}}", channel.toSubscribeMessage());
7787
}
7888

0 commit comments

Comments
 (0)