import { app, effects } from 'ferp';
websocket_url: 'wss://echo.websocket.org',
const WebsocketSendFx = (data, websocket) => effects.thunk(() => {
if (websocket) websocket.send(data);
const WebsocketSend = data => state => [
WebsocketSendFx(data, state.websocket),
const OnConnected = (websocket) => (state) => [
effects.act(WebsocketSend, 'hello, world'),
const OnDisconnected = (state) => [
{ ...state, websocket: null },
const OnMessage = (message) => (state) => [
{ ...state, messages: state.messages.concat(message) },
const WebsocketSubscription = (dispatch, websocketUrl, ConnectAction, DisconnectAction, MessageAction) => {
const websocket = new WebSocket(websocketUrl);
const onOpen = () => dispatch(ConnectAction(websocket));
const onClose = () => dispatch(Disconnect);
const onMessage = ({ data }) => dispatch(MessageAction(data));
websocket.addEventListener('open', onOpen);
websocket.addEventListener('close', onClose);
websocket.addEventListener('message', onMessage);
websocket.removeEventListener('open', onOpen);
websocket.removeEventListener('close', onClose);
websocket.removeEventListener('message', onMessage);
init: [INITIAL_STATE, effects.none()],