使用RxJS对WebSocket流建模

时间:2016-05-22 18:51:58

标签: javascript websocket rxjs

使用RxJS为WebSocket流建模的方法有哪些。

我看到的显而易见的事情是套接字流,它们发出消息流。

如果我创建了一个套接字流,我如何创建其邮件流并仍保留发送这些邮件的人?

套接字流是我的第一步:

const socket$ = Observable.create(({complete, next}) => {

  const server = new WebSocketServer({server: someHttpServer})

  server.on('connection', next)

  return () => {
    server.close()
    complete()
  }

})

但是消息流有点困难,因为我需要从我那里得到消息的套接字。

这是我对模特的天真尝试:

const message$ = socket$.flatMap(socket => Observable.create(({complete, next}) => {

  socket.on('message', next)
  socket.on('close', complete)

  return () => socket.close()

})).share()

从所有套接字流式传输所有套接字消息的observable。但是,如果我订阅它,我就不再有套接字,这使得它成为单向的。

我想要

socket$ -> message$ -> server-processing -> socket$

但是响应,广播,多播和单播有多种用例。

2 个答案:

答案 0 :(得分:3)

我发现flatMap接受第二个函数,它接收flatMap的参数值和flatMap的(展平的)返回值。此函数可以返回一个新值,该值用于所有后来的运算符。

const socketMessage$ = socket$.flatMap(

  socket => Observable.create(({complete, next}) => {

    socket.on('message', next)
    socket.on('close', complete)

    return () => socket.disconnect()

  }),

  (socket, message) => ({socket, message})

).share()

答案 1 :(得分:1)

不知道你要找的是什么(still preserve who sent these messages是什么意思),但是有一个用于在可观察量中包装websockets的库。请查看此处的文档:https://github.com/Reactive-Extensions/RxJS-DOM/blob/master/doc/operators/fromwebsocket.md