@iosio/websocket-client
Version:
Simple wrapper for native client-side WebSocket. Similar to socket.io. Easy to use with any backend
196 lines (121 loc) • 4.65 kB
JavaScript
import {Server, WebSocket} from 'mock-socket';
import Socket from "../src/";
import {tryParse} from '@iosio/utils/lib/string_manipulation';
import {isUndefined, isFunction,} from '@iosio/utils/lib/type_checks';
import {isShape} from '@iosio/utils/lib/isShape';
import {Eventer} from '@iosio/utils/lib/eventer';
const wait = time => new Promise(resolve => setTimeout(resolve, time));
const eve = Eventer();
const till = (it_happened) => {
return new Promise((resolve, reject) => {
eve.on(it_happened, (status) => {
status === 'fail' ? reject(it_happened + ' failed') : resolve();
})
});
};
const URL = "ws://localhost:4000";
const mockServer1 = new Server(URL);
const fail = jest.fn();
let send_test_data;
let send_test_event;
let request_test_data;
let request_test_event;
mockServer1.on('connection', sock => {
const send = (data) => sock.send(JSON.stringify(data));
eve.emit('server-connected');
sock.on('message', (data) => {
let received = tryParse(data);//returns {ok, data, error}
if (received.ok) {
if (received.data.type === 'send') {
eve.emit('server-received-send');
send_test_data = received.data.data;
send_test_event = received.data.event;
send({event: 'send-response', data: 'test'});
}
// console.log(received.data);
if (received.data.type === 'request' && received.data.event !== 'nummy') {
request_test_data = received.data.data;
request_test_event = received.data.event;
send({event: received.data.response_id, data: 'test'});
}
if (received.data.type === 'request' && received.data.event === 'nummy') {
send({
event: received.data.response_id,
data: received.data.data.num
});
}
} else {
eve.emit('server-received-send', 'fail');
fail();
}
})
});
const socket = new Socket({
url: URL,
should_console_log: true,
websocket: WebSocket,
});
describe('messaging', () => {
it('should send message and receive message', async () => {
socket.open();
await till('server-connected');
socket.send('test', {test: 'message'});
socket.on('send-response', (data) => {
eve.emit('socket-received-send-message');
expect(data).toBe('test');
});
await Promise.all([
till('server-received-send'),
till('socket-received-send-message')
]);
expect(send_test_data).toEqual({test: 'message'});
expect(send_test_event).toEqual('test');
expect(socket._callbacks['send-response']).toBeDefined();
});
it('request should work properly. event handler should be removed', async () => {
socket.request('test', {test: 'message'}, (data) => {
let event = false;
Object.keys(socket._callbacks).forEach((key) => {
console.log(key);
if (socket._isResponse(key)) {
event = true;
}
});
expect(event).toBe(true);
eve.emit('socket-received-request');
expect(data).toBe('test');
});
await Promise.all([
till('socket-received-request')
]);
expect(request_test_data).toEqual({test: 'message'});
expect(request_test_event).toEqual('test');
/*
do a bunch of requests at once to verify no cross contamination
*/
// const repeat_and_done = (times) => (func) => {
// return [...Array(times)].map((_, i) => {
// let done = i === (times - 1);
// func(done);
// })
// };
const repeat = times => func => [...Array(times)].map(() => func());
let num = 0;
const amount_to_repeat = 100;
repeat(amount_to_repeat)(() => {
num++;
socket.request('nummy', {num}, (nummy) => {
// console.log('*****************', nummy)
nummy === amount_to_repeat && eve.emit('done');
});
});
await till('done');
let request_events_removed = true;
Object.keys(socket._callbacks).forEach((key) => {
if (socket._isResponse(key)) {
request_events_removed = false;
}
});
expect(request_events_removed).toBe(true);
});
});