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

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

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

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

Ответ 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