Sinatra + websocket + Целлулоид

привет кто-нибудь знает, как поставить на место быстрый пример кода приложения Sinatra, работающего поверх Целлулоид: IO и использование websocket?

Я знаю о существовании катушки для целлулоида ("Reel-это быстрый, неблокирующий "evented" веб-сервер, построенный поверх Celluloid: IO" ... и поддерживает websockets сразу), но тем не менее я хотел бы продолжать использовать Sinatra, потому что мне это нравится, я привык к этому, и я бы предпочел не переписывать много код...

надеюсь, вы можете помочь.

1 ответов


Celluloid:: IO имеет evented сервер HTTP/WebSocket с именем Барабанов ( http://github.com/celluloid/reel), что является лучшей настройкой для того, что вы хотите, но все же это довольно новое, кроме тонких и радуг. Это выходит за рамки Синатры и должно включать шкафа. До сих пор он был специфичен для определенных HTTP-серверов, и каждый "обработчик стойки" подходил к WebSockets по-своему. Теперь он несколько стандартизирован, но в Rack 2.0 он станет постоянный. Я думаю, это временный путь останется, но станет более зрелым в 2.0, чем в +1.5.* теперь.

Это будет выпущено в главную ветвь катушки, но прямо сейчас в ветви вилки халгориума, здесь:

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

текущий прогресс в этой проблеме здесь:

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

реализация этой функции включает в себя взаимодействие с довольно новой и несколько временной функциональностью, называемой журналы API в стойке, под Синатрой. Это довольно запутанный, но как только вы получите повесить его, это довольно круто. Полная информация об этом здесь:

...где все это было решено в потоке github: https://github.com/rack/rack/pull/481

официальной поддержки WebSockets через Rack hijack для Sinatra пока нет, и никто не планируется, кроме Middleware, согласно @rhk. Таким образом, это всегда будет то, что вы выборочно обрабатываете, основываясь на вашем сервере и выборе стиля реализации.

то, как я справился с этим, - это использовать Reel, но Пума ( http://puma.io ) также очень хорошо. Любой HIJACK_IO, способный HTTP сервер будет работать так же. Как я это показано в суть ссылкам ниже. Он использует websocket-протокол-ruby чтобы фактически обрабатывать взаимодействие с клиентом, а на стороне клиента я использую portal.js, а не просто простой подход HTML5. Я считаю, что это намного лучше.

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

websocket-протокол-ruby: https://github.com/faye/websocket-protocol-ruby

все это зависит от этой части, как упоминалось в потоке API стойки на github:

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

есть два способа использовать hijack_io, но, как я уже сказал,Это очень стойку. Там не так много кода Синатры, потому что это на самом деле не Синатра. Опять же, как я уже упоминал, он даже не планировал стать бесшовные. Это будет sinatra / contrib или какое-то другое промежуточное ПО. Итак, вот мой путь. один пример, где я использую hijack_io, как грубый эскиз.

...суть: https://gist.github.com/digitalextremist/5441315