Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -33,4 +33,18 @@ public interface SubscriptionEventListener {
* See {@linkplain PusherEvent} for more.
*/
void onEvent(final PusherEvent event);

/**
* Callback that is fired whenever an unexpected error occurs processing
* for this {@linkplain SubscriptionEventListener}.
*
* @param message
* A description of the problem.
* @param e
* An associated exception, if available.
*/
default void onError(String message, Exception e) {
// No-op
return;
};
}
Original file line number Diff line number Diff line change
Expand Up @@ -95,9 +95,20 @@ public String toString() {

@SuppressWarnings({ "rawtypes", "unchecked" })
private void handleSubscriptionSuccessfulMessage(final String message) {
final ChannelEventListener listener = getEventListener();

// extract data from the JSON message
final PresenceData presenceData = extractPresenceDataFrom(message);
if (presenceData == null) {
if (listener != null) {
listener.onError(
"Subscription failed: Presence data not found",
null
);
}
return;
}

final List<String> ids = presenceData.ids;
final Map<String, Object> hash = presenceData.hash;

Expand All @@ -109,7 +120,7 @@ private void handleSubscriptionSuccessfulMessage(final String message) {
idToUserMap.put(id, user);
}
}
final ChannelEventListener listener = getEventListener();

if (listener != null) {
final PresenceChannelEventListener presenceListener = (PresenceChannelEventListener)listener;
presenceListener.onUsersInformationReceived(getName(), getUsers());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ public class PresenceChannelImplTest extends PrivateChannelImplTest {
private static final String AUTH_RESPONSE = "\"auth\":\"a87fe72c6f36272aa4b1:f9db294eae7\",\"channel_data\":\"{\\\"user_id\\\":\\\"5116a4519575b\\\",\\\"user_info\\\":{\\\"name\\\":\\\"Phil Leggetter\\\",\\\"twitter_id\\\":\\\"@leggetter\\\"}}\"";
private static final String AUTH_RESPONSE_NUMERIC_ID = "\"auth\":\"a87fe72c6f36272aa4b1:f9db294eae7\",\"channel_data\":\"{\\\"user_id\\\":51169,\\\"user_info\\\":{\\\"name\\\":\\\"Phil Leggetter\\\",\\\"twitter_id\\\":\\\"@leggetter\\\"}}\"";
private static final String USER_ID = "5116a4519575b";
private static final String ERROR_NO_PRESENCE_DATA = "Subscription failed: Presence data not found";

@Mock
private PresenceChannelEventListener mockEventListener;
Expand Down Expand Up @@ -77,6 +78,17 @@ public void testIsSubscribedMethod(){
assertTrue(channel.isSubscribed());
}

@Test
public void testInternalSubscriptionSucceededMessageWithNoPresenceDataReturnsError(){
final String eventName = "pusher_internal:subscription_succeeded";
final Map<String, Object> data = new LinkedHashMap<String, Object>();

channel.onMessage(eventName, eventJson(eventName, data, getChannelName()));

final InOrder inOrder = inOrder(mockEventListener);
inOrder.verify(mockEventListener).onError(eq(ERROR_NO_PRESENCE_DATA), eq(null));
}

@Test
@Override
@SuppressWarnings({ "rawtypes", "unchecked" })
Expand Down