Ответ 1
Celluloid:: IO имеет выделенный HTTP/WebSocket сервер под названием Reel (http://github.com/celluloid/reel), который лучшая настройка для того, что вы хотите, но все же это довольно новое, помимо Thin и Rainbows. Это выходит за рамки Sinatra и должно включать в себя Rack. До сих пор он был специфичен для определенных HTTP-серверов, и каждый "Rack Handler" подошел к WebSockets по-своему. Теперь он несколько стандартизирован, но в Rack 2.0 он станет постоянным. Я предполагаю, что этот временный путь будет оставаться, но станет более зрелым в 2.0, чем в + 1.5. * Сейчас.
Это будет выпущено в ведущую ветвь Reel, но сейчас находится в ветке галгорической вилки, здесь:
https://github.com/halorgium/reel/tree/hijacked-websocket
Постоянный прогресс этой проблемы здесь:
https://github.com/celluloid/reel/issues/42
Реализация этой функции предполагает взаимодействие с довольно новой и несколько временной функциональностью, называемой hijack API в Rack, под Sinatra. Это довольно запутанно, но как только вы получите его, это довольно круто. Полная информация об этом здесь:
... где все это было решено в потоке github: https://github.com/rack/rack/pull/481
Официальной поддержки WebSockets через Rack hijack для Sinatra пока нет, и никто не планирует, кроме Middleware, согласно @rhk. Таким образом, это всегда будет то, что вы выборочно обрабатываете на основе вашего сервера и выбора стиля реализации.
То, как я справлялся с этим, - использовать Reel, но Puma (http://puma.io) также отлично. Любой HTTP-сервер, поддерживающий hijack_io, будет работать одинаково. То, как я это делаю, проиллюстрировано в контексте, приведенном ниже. Он использует websocket-protocol-ruby, чтобы фактически взаимодействовать с клиентом, а на стороне клиента я использую portal.js, а не просто простой подход HTML5. Я считаю, что это будет намного лучше.
Portal.js: https://github.com/flowersinthesand/portal
websocket-protocol-ruby: https://github.com/faye/websocket-protocol-ruby
Все это зависит от этой части, как указано в потоке API Rack на github:
env['rack.hijack'].call
@env = env
@io = env['rack.hijack_io']
Существует два способа использования hijack_io, но, как я уже сказал, это очень сложная Rack. Там нет кода Синатры, потому что это не вещь Синатры. Опять же, как я уже упоминал, он даже не планировал стать плавным. Это будет материал sinatra/contrib или другое промежуточное ПО. Итак, вот мой путь, в одном случае, когда я использую hijack_io в качестве приблизительного эскиза.
... сущность: https://gist.github.com/digitalextremist/5441315