const isConnectedSet = createEvent()
const socketSet = createEvent()
const headersSet = createEvent()
const $isConnected = restore(isConnectedSet, false)
const $socket = restore(socketSet, null)
const $headers = restore(headersSet, null)
function subscribeToChannel(channelSource) {
const subscribe = createEvent()
const unsubscribe = createEvent()
const unsubscribeFx = createEffect().use(({socket, channel}) => {
socket.emit('unsubscribe', {
const subscribeFx = createEffect().use(({socket, channel, headers}) => {
socket.emit('subscribe', {
const hasSocket = guard($socket, {
filter: socket => !!socket,
const hasChannel = guard(channelSet, {
filter: channel => !!channel,
const paramsChanged = createEvent()
source: subscribeFx.done,
clock: merge([subscribeFx, unsubscribe]),
fn: ({params}) => params,
clock: merge([subscribe, paramsChanged]),
return {subscribe, unsubscribe, paramsChanged}
const channelSet = createEvent(null)
const sub = subscribeToChannel(channelSet)
console.log('emit', event, payload)
channelSet('fake-channel')