Sinatra + websocket +赛璐珞

时间:2012-12-14 21:22:53

标签: concurrency websocket sinatra celluloid

您是否有人知道如何在Celluloid:IO之上运行使用websocket的Sinatra应用程序的快速代码示例?

我知道Reel for Celluloid的存在(“Reel是一个基于Celluloid:IO”的快速,无阻塞'即兴'网络服务器...... ...并立即支持websockets )但是我仍然想继续使用Sinatra,因为我喜欢它,我已经习惯了它,而且我宁愿不重写很多代码......

希望你能提供帮助。

1 个答案:

答案 0 :(得分:8)

Celluloid :: IO有一个名为 Reel http://github.com/celluloid/reel)的事件HTTP / WebSocket服务器,这是你想要的最佳设置,但是,这是一个非常新的,除了薄和彩虹。这超出了Sinatra,并且必须涉及 Rack 本身。到目前为止,它已经特定于某些HTTP服务器,并且每个“Rack Handler”都以自己的方式接近WebSockets。现在它有点标准化,但在Rack 2.0中它将成为永久性的。我猜这种暂时的方式会继续存在,但在2.0中变得比在+ 1.5中更成熟。*现在。

这将被释放到Reel的主分支中,但现在正在halgorium的分支中,在这里:

https://github.com/halorgium/reel/tree/hijacked-websocket

此问题的持续进展如下:

https://github.com/celluloid/reel/issues/42

此功能的实现涉及在Sinatra下面与Rack中的劫持 API相互作用的新功能和某些临时功能进行交互。这是相当复杂的,但一旦你掌握了它,它是非常酷的。有关这方面的完整信息,请访问:

  

...在github主题中确定了所有内容: https://github.com/rack/rack/pull/481

根据@ rhk的说法,还没有正式支持通过Rack劫持Sinatra的WebSockets,除了Middleware之外没有任何计划。因此,根据您的服务器和实施方式的选择,它将始终是您有选择地处理的事情。

我处理它的方法是使用Reel,但 Puma http://puma.io)也非常好。任何支持hijack_io的HTTP服务器都将运行相同的操作。我的方式在下面链接的要点中说明。它使用 websocket-protocol-ruby 来实际处理与客户端的交互,在客户端,我使用portal.js而不仅仅是简单的HTML5方法。我相信它会好得多。

Portal.js: https://github.com/flowersinthesand/portal

websocket-protocol-ruby: https://github.com/faye/websocket-protocol-ruby

这一切都取决于这篇文章,如github上的Rack API线程所述:

env['rack.hijack'].call
@env = env
@io = env['rack.hijack_io']

有两种方法可以使用hijack_io,但正如我所说,它非常涉及到Rack。那里没有太多的Sinatra代码,因为它不是真正的Sinatra。再次,正如我所提到的,它甚至没有真正计划成为无缝的。它将是sinatra / contrib的东西或其他一些中间件。所以这是我的方式,在一个例子中,我使用hijack_io作为草图。

  

...要点: https://gist.github.com/digitalextremist/5441315