Skip to content

Commit

Permalink
Better to support (#161)
Browse files Browse the repository at this point in the history
* Socket can send message to room

* Added possibility to message multiple rooms via chaining

* Fixed lint errors
  • Loading branch information
publicJorn authored and thoov committed May 17, 2017
1 parent 0635e75 commit fd0ae91
Show file tree
Hide file tree
Showing 8 changed files with 177 additions and 14 deletions.
28 changes: 25 additions & 3 deletions dist/mock-socket.amd.js

Large diffs are not rendered by default.

28 changes: 25 additions & 3 deletions dist/mock-socket.cjs.js

Large diffs are not rendered by default.

28 changes: 25 additions & 3 deletions dist/mock-socket.es.js

Large diffs are not rendered by default.

28 changes: 25 additions & 3 deletions dist/mock-socket.js

Large diffs are not rendered by default.

4 changes: 4 additions & 0 deletions src/helpers/dedupe.js
@@ -0,0 +1,4 @@
export default arr => arr.reduce((deduped, b) => {
if (deduped.indexOf(b) > -1) return deduped;
return deduped.concat(b);
}, []);
10 changes: 8 additions & 2 deletions src/server.js
Expand Up @@ -4,6 +4,7 @@ import networkBridge from './network-bridge';
import CLOSE_CODES from './helpers/close-codes';
import normalize from './helpers/normalize-url';
import globalObject from './helpers/global-object';
import dedupe from './helpers/dedupe';
import { createEvent, createMessageEvent, createCloseEvent } from './event-factory';

/*
Expand Down Expand Up @@ -164,10 +165,15 @@ class Server extends EventTarget {
*
* e.g. server.to('my-room').emit('hi!');
*/
to(room, broadcaster) {
to(room, broadcaster, broadcastList = []) {
const self = this;
const websockets = networkBridge.websocketsLookup(this.url, room, broadcaster);
const websockets = dedupe(broadcastList.concat(
networkBridge.websocketsLookup(this.url, room, broadcaster)
));

return {
to: (chainedRoom, chainedBroadcaster) =>
this.to.call(this, chainedRoom, chainedBroadcaster, websockets),
emit(event, data) {
self.emit(event, data, { websockets });
}
Expand Down
8 changes: 8 additions & 0 deletions src/socket-io.js
Expand Up @@ -187,6 +187,14 @@ class SocketIO extends EventTarget {
networkBridge.removeMembershipFromRoom(this, room);
}

to(room) {
return this.broadcast.to(room);
}

in() {
return this.to.apply(null, arguments);
}

/*
* Invokes all listener functions that are listening to the given event.type property. Each
* listener will be passed the event as the first argument.
Expand Down
57 changes: 57 additions & 0 deletions tests/functional/socket-io.test.js
Expand Up @@ -139,6 +139,26 @@ test.cb('a socket can join and leave a room', (t) => {
});
});

test.cb('a socket can emit to a room', (t) => {
const server = new Server('ws://roomy');
const socketFoo = io('ws://roomy');
const socketBar = io('ws://roomy');

socketFoo.on('connect', () => {
socketFoo.join('room');
});
socketFoo.on('room-talk', () => {
t.true(true);
server.close();
t.end();
});

socketBar.on('connect', () => {
socketBar.join('room');
socketBar.to('room').emit('room-talk');
});
});

test.cb('Client can emit with multiple arguments', (t) => {
const server = new Server('foobar');
server.on('client-event', (...data) => {
Expand Down Expand Up @@ -171,3 +191,40 @@ test.cb('Server can emit with multiple arguments', (t) => {
t.end();
});
});

test.cb('Server can emit to multiple rooms', (t) => {
const server = new Server('ws://chat');
const socket1 = io('ws://chat');
const socket2 = io('ws://chat');

let connectedCount = 0;
const checkConnected = () => {
connectedCount += 1;
if (connectedCount === 2) {
server.to('room1').to('room2').emit('good-response');
}
};

let goodResponses = 0;
const checkGoodResponses = (socketId) => {
goodResponses += 1;
if (goodResponses === 2) {
t.true(true);
server.close();
t.end();
}
};

socket1.on('good-response', checkGoodResponses.bind(null, 1));
socket2.on('good-response', checkGoodResponses.bind(null, 2));

socket1.on('connect', () => {
socket1.join('room1');
checkConnected();
});

socket2.on('connect', () => {
socket2.join('room2');
checkConnected();
});
});

0 comments on commit fd0ae91

Please sign in to comment.