Skip to content

Commit c7d50b8

Browse files
feat: implement catch-all listeners
Syntax: ```java socket.onAnyIncoming(new Emitter.Listener() { @OverRide public void call(Object... args) { // ... } }); socket.onAnyOutgoing(new Emitter.Listener() { @OverRide public void call(Object... args) { // ... } }); ``` Related: - socketio/engine.io-client-java#99 - #243 - #475
1 parent fca3b95 commit c7d50b8

File tree

2 files changed

+117
-0
lines changed

2 files changed

+117
-0
lines changed

Diff for: src/main/java/io/socket/client/Socket.java

+62
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import org.json.JSONObject;
1010

1111
import java.util.*;
12+
import java.util.concurrent.ConcurrentLinkedQueue;
1213
import java.util.logging.Level;
1314
import java.util.logging.Logger;
1415

@@ -63,6 +64,9 @@ public class Socket extends Emitter {
6364
private final Queue<List<Object>> receiveBuffer = new LinkedList<>();
6465
private final Queue<Packet<JSONArray>> sendBuffer = new LinkedList<>();
6566

67+
private ConcurrentLinkedQueue<Listener> onAnyIncomingListeners = new ConcurrentLinkedQueue<>();
68+
private ConcurrentLinkedQueue<Listener> onAnyOutgoingListeners = new ConcurrentLinkedQueue<>();
69+
6670
public Socket(Manager io, String nsp, Manager.Options opts) {
6771
this.io = io;
6872
this.nsp = nsp;
@@ -250,6 +254,14 @@ public void run() {
250254
}
251255

252256
private void packet(Packet packet) {
257+
if (packet.type == Parser.EVENT) {
258+
if (!onAnyOutgoingListeners.isEmpty()) {
259+
Object[] argsAsArray = toArray((JSONArray) packet.data);
260+
for (Listener listener : onAnyOutgoingListeners) {
261+
listener.call(argsAsArray);
262+
}
263+
}
264+
}
253265
packet.nsp = this.nsp;
254266
this.io.packet(packet);
255267
}
@@ -340,6 +352,12 @@ private void onevent(Packet<JSONArray> packet) {
340352

341353
if (this.connected) {
342354
if (args.isEmpty()) return;
355+
if (!this.onAnyIncomingListeners.isEmpty()) {
356+
Object[] argsAsArray = args.toArray();
357+
for (Listener listener : this.onAnyIncomingListeners) {
358+
listener.call(argsAsArray);
359+
}
360+
}
343361
String event = args.remove(0).toString();
344362
super.emit(event, args.toArray());
345363
} else {
@@ -507,5 +525,49 @@ private static Object[] toArray(JSONArray array) {
507525
}
508526
return data;
509527
}
528+
529+
public Socket onAnyIncoming(Listener fn) {
530+
this.onAnyIncomingListeners.add(fn);
531+
return this;
532+
}
533+
534+
public Socket offAnyIncoming() {
535+
this.onAnyIncomingListeners.clear();
536+
return this;
537+
}
538+
539+
public Socket offAnyIncoming(Listener fn) {
540+
Iterator<Listener> it = this.onAnyIncomingListeners.iterator();
541+
while (it.hasNext()) {
542+
Listener listener = it.next();
543+
if (listener == fn) {
544+
it.remove();
545+
break;
546+
}
547+
}
548+
return this;
549+
}
550+
551+
public Socket onAnyOutgoing(Listener fn) {
552+
this.onAnyOutgoingListeners.add(fn);
553+
return this;
554+
}
555+
556+
public Socket offAnyOutgoing() {
557+
this.onAnyOutgoingListeners.clear();
558+
return this;
559+
}
560+
561+
public Socket offAnyOutgoing(Listener fn) {
562+
Iterator<Listener> it = this.onAnyOutgoingListeners.iterator();
563+
while (it.hasNext()) {
564+
Listener listener = it.next();
565+
if (listener == fn) {
566+
it.remove();
567+
break;
568+
}
569+
}
570+
return this;
571+
}
510572
}
511573

Diff for: src/test/java/io/socket/client/SocketTest.java

+55
Original file line numberDiff line numberDiff line change
@@ -395,4 +395,59 @@ public void onSuccess(Object... args) {
395395
assertThat((String) values.take(), is("2"));
396396
assertThat((byte[]) values.take(), is(new byte[] { 3 }));
397397
}
398+
399+
@Test(timeout = TIMEOUT)
400+
public void shouldCallCatchAllListenerForIncomingPackets() throws InterruptedException {
401+
final BlockingQueue<Object> values = new LinkedBlockingQueue<>();
402+
403+
socket = client();
404+
405+
socket.on("message", new Emitter.Listener() {
406+
@Override
407+
public void call(Object... args) {
408+
socket.emit("echo", 1, "2", new byte[] { 3 });
409+
410+
socket.onAnyIncoming(new Emitter.Listener() {
411+
@Override
412+
public void call(Object... args) {
413+
for (Object arg : args) {
414+
values.offer(arg);
415+
}
416+
}
417+
});
418+
}
419+
});
420+
421+
socket.connect();
422+
423+
assertThat((String) values.take(), is("echoBack"));
424+
assertThat((Integer) values.take(), is(1));
425+
assertThat((String) values.take(), is("2"));
426+
assertThat((byte[]) values.take(), is(new byte[] { 3 }));
427+
}
428+
429+
@Test(timeout = TIMEOUT)
430+
public void shouldCallCatchAllListenerForOutgoingPackets() throws InterruptedException {
431+
final BlockingQueue<Object> values = new LinkedBlockingQueue<>();
432+
433+
socket = client();
434+
435+
socket.emit("echo", 1, "2", new byte[] { 3 });
436+
437+
socket.onAnyOutgoing(new Emitter.Listener() {
438+
@Override
439+
public void call(Object... args) {
440+
for (Object arg : args) {
441+
values.offer(arg);
442+
}
443+
}
444+
});
445+
446+
socket.connect();
447+
448+
assertThat((String) values.take(), is("echo"));
449+
assertThat((Integer) values.take(), is(1));
450+
assertThat((String) values.take(), is("2"));
451+
assertThat((byte[]) values.take(), is(new byte[] { 3 }));
452+
}
398453
}

0 commit comments

Comments
 (0)