From 35e032aca482e8a76a0fb8bab2a4884883c122c2 Mon Sep 17 00:00:00 2001 From: James Coglan Date: Fri, 5 Apr 2013 09:11:05 +0100 Subject: [PATCH] Remove Faye::WebSocket docs. --- README.rdoc | 342 +--------------------------------------------------- 1 file changed, 1 insertion(+), 341 deletions(-) diff --git a/README.rdoc b/README.rdoc index 4e41b80..ef9ed88 100644 --- a/README.rdoc +++ b/README.rdoc @@ -1,344 +1,4 @@ -= Faye::WebSocket - -* Travis CI build: {}[http://travis-ci.org/faye/faye-websocket-ruby] -* Autobahn tests: {server}[http://faye.jcoglan.com/autobahn/servers/], {client}[http://faye.jcoglan.com/autobahn/clients/] - -This is a robust, general-purpose WebSocket implementation extracted from the -{Faye}[http://faye.jcoglan.com] project. It provides classes for easily building -WebSocket servers and clients in Ruby. It does not provide a server itself, but -rather makes it easy to handle WebSocket connections within an existing -{Rack}[http://rack.rubyforge.org/] application. It does not provide any -abstraction other than the standard -{WebSocket API}[http://dev.w3.org/html5/websockets/]. - -It also provides an abstraction for handling {EventSource}[http://dev.w3.org/html5/eventsource/] -connections, which are one-way connections that allow the server to push data to -the client. They are based on streaming HTTP responses and can be easier to -access via proxies than WebSockets. - -Currently, the following web servers are supported, and can be accessed directly -or via HAProxy: - -* {Thin}[http://code.macournoyer.com/thin/] -* {Rainbows}[http://rainbows.rubyforge.org/] using EventMachine -* {Goliath}[http://postrank-labs.github.com/goliath/] - -The server-side socket can process {draft-75}[http://tools.ietf.org/html/draft-hixie-thewebsocketprotocol-75], -{draft-76}[http://tools.ietf.org/html/draft-hixie-thewebsocketprotocol-76], -{hybi-07}[http://tools.ietf.org/html/draft-ietf-hybi-thewebsocketprotocol-07] -and later versions of the protocol. It selects protocol versions automatically, -supports both +text+ and +binary+ messages, and transparently handles +ping+, -+pong+, +close+ and fragmented messages. - - -== Handling WebSocket connections in Rack - -You can handle WebSockets on the server side by listening for requests using the -Faye::WebSocket.websocket? method, and creating a new socket for the -request. This socket object exposes the usual WebSocket methods for receiving -and sending messages. For example this is how you'd implement an echo server: - - # app.rb - require 'faye/websocket' - - App = lambda do |env| - if Faye::WebSocket.websocket?(env) - ws = Faye::WebSocket.new(env) - - ws.onmessage = lambda do |event| - ws.send(event.data) - end - - ws.onclose = lambda do |event| - p [:close, event.code, event.reason] - ws = nil - end - - # Return async Rack response - ws.rack_response - - else - # Normal HTTP request - [200, {'Content-Type' => 'text/plain'}, ['Hello']] - end - end - -This is a standard Rack app, so it can be run using a config.ru file. -However, so that incoming requests can be properly prepared to process WebSocket -connections, you need to tell Faye::WebSocket which adapter to load; -this can be either +thin+, +rainbows+ or +goliath+. If one of these servers is -already loaded before faye/websocket is loaded, it will load -appropriate adapters automatically. - - # config.ru - require './app' - Faye::WebSocket.load_adapter('thin') - run App - -Note that under certain circumstances (notably a draft-76 client connecting -through an HTTP proxy), the WebSocket handshake will not be complete after you -call `Faye::WebSocket.new` because the server will not have received the entire -handshake from the client yet. In this case, calls to `ws.send` will buffer the -message in memory until the handshake is complete, at which point any buffered -messages will be sent to the client. - -If you need to detect when the WebSocket handshake is complete, you can use the -`onopen` event. - -If the connection's protocol version supports it, you can call ws.ping() -to send a ping message and wait for the client's response. This method takes a -message string, and an optional callback that fires when a matching pong message -is received. It returns +true+ iff a ping message was sent. If the client does -not support ping/pong, this method sends no data and returns +false+. - - ws.ping 'Mic check, one, two' do - # fires when pong is received - end - - -== Using the WebSocket client - -The client supports both the plain-text +ws+ protocol and the encrypted +wss+ -protocol, and has exactly the same interface as a socket you would use in a web -browser. On the wire it identifies itself as hybi-13. - - require 'faye/websocket' - require 'eventmachine' - - EM.run { - ws = Faye::WebSocket::Client.new('ws://www.example.com/') - - ws.onopen = lambda do |event| - p [:open] - ws.send('Hello, world!') - end - - ws.onmessage = lambda do |event| - p [:message, event.data] - end - - ws.onclose = lambda do |event| - p [:close, event.code, event.reason] - ws = nil - end - } - - -== Subprotocol negotiation - -The WebSocket protocol allows peers to select and identify the application -protocol to use over the connection. On the client side, you can set which -protocols the client accepts by passing a list of protocol names when you -construct the socket: - - ws = Faye::WebSocket::Client.new('ws://www.example.com/', ['irc', 'amqp']) - -On the server side, you can likewise pass in the list of protocols the server -supports after the other constructor arguments: - - ws = Faye::WebSocket.new(env, ['irc', 'amqp']) - -If the client and server agree on a protocol, both the client- and server-side -socket objects expose the selected protocol through the ws.protocol -property. If they cannot agree on a protocol to use, the client closes the -connection. - - -== WebSocket API - -The WebSocket API consists of several event handlers and a method for sending -messages. - -* onopen fires when the socket connection is established. Event - has no attributes. -* onerror fires when the connection attempt fails. Event has no - attributes. -* onmessage fires when the socket receives a message. Event has - one attribute, data, which is either a +String+ (for text - frames) or an +Array+ of byte-sized integers (for binary frames). -* onclose fires when either the client or the server closes the - connection. Event has two optional attributes, code and - reason, that expose the status code and message sent by the - peer that closed the connection. -* send(message) accepts either a +String+ or an +Array+ of - byte-sized integers and sends a text or binary message over the connection to - the other peer. -* close(code, reason) closes the connection, sending the given - status code and reason text, both of which are optional. -* protocol is a string (which may be empty) identifying the - subprotocol the socket is using. - - -== Handling EventSource connections in Rack - -EventSource connections provide a very similar interface, although because they -only allow the server to send data to the client, there is no +onmessage+ API. -EventSource allows the server to push text messages to the client, where each -message has an optional event-type and ID. - - # app.rb - require 'faye/websocket' - - App = lambda do |env| - if Faye::EventSource.eventsource?(env) - es = Faye::EventSource.new(env) - p [:open, es.url, es.last_event_id] - - # Periodically send messages - loop = EM.add_periodic_timer(1) { es.send('Hello') } - - es.onclose = lambda do |event| - EM.cancel_timer(loop) - es = nil - end - - # Return async Rack response - es.rack_response - - else - # Normal HTTP request - [200, {'Content-Type' => 'text/plain'}, ['Hello']] - end - end - -The +send+ method takes two optional parameters, :event and -:id. The default event-type is 'message' with no ID. For -example, to send a +notification+ event with ID +99+: - - es.send('Breaking News!', :event => 'notification', :id => '99') - -The +EventSource+ object exposes the following properties: - -* url is a string containing the URL the client used to create - the EventSource. -* last_event_id is a string containing the last event ID - received by the client. You can use this when the client reconnects after a - dropped connection to determine which messages need resending. - -When you initialize an EventSource with Faye::EventSource.new, you can -pass configuration options after the +env+ parameter. Available options are: - -* :retry is a number that tells the client how long (in seconds) - it should wait after a dropped connection before attempting to reconnect. -* :ping is a number that tells the server how often (in seconds) - to send 'ping' packets to the client to keep the connection open, to defeat - timeouts set by proxies. The client will ignore these messages. - -For example, this creates a connection that pings every 15 seconds and is -retryable every 10 seconds if the connection is broken: - - es = Faye::EventSource.new(es, :ping => 15, :retry => 10) - -You can send a ping message at any time by calling es.ping(). Unlike -WebSocket the client does not send a response to this; it is merely to send some -data over the wire to keep the connection alive. - - -== Running your socket application - -To use this library you must be using an EventMachine-based server; currently -Thin, Rainbows and Goliath are supported. - - -=== Running the app with Thin - -Thin can be started via the command line if you've set up a config.ru -file for your application: - - thin start -R config.ru -p 9292 - -Or, you can use +rackup+. In development mode, this adds middlewares that don't -work with async apps, so you must start it in production mode: - - rackup config.ru -s thin -E production -p 9292 - -It can also be started using the Rack::Handler interface common to many -Ruby servers. It must be run using EventMachine, and you can configure Thin -further in a block passed to +run+: - - require 'eventmachine' - require 'rack' - require 'thin' - require './app' - - EM.run { - thin = Rack::Handler.get('thin') - - thin.run(App, :Port => 9292) do |server| - # You can set options on the server here, for example to set up SSL: - server.ssl_options = { - :private_key_file => 'path/to/ssl.key', - :cert_chain_file => 'path/to/ssl.crt' - } - server.ssl = true - end - } - - -=== Running the app with Rainbows - -Faye::WebSocket can only be run using EventMachine. To begin with, -you'll need a Rainbows config file that tells it to use EventMachine, along with -whatever Rainbows/Unicorn configuration you require. - - # rainbows.conf - Rainbows! do - use :EventMachine - end - -You can then run your config.ru file from the command line. Again, -Rack::Lint will complain unless you put the application in production -mode. - - rainbows config.ru -c path/to/rainbows.conf -E production -p 9292 - -Rainbows also has a Ruby API for starting a server: - - require 'rainbows' - require './app' - - rackup = Unicorn::Configurator::RACKUP - rackup[:port] = 9292 - rackup[:set_listener] = true - options = rackup[:options] - options[:config_file] = 'path/to/rainbows.conf' - - server = Rainbows::HttpServer.new(App, options) - - # This is non-blocking; use server.start.join to block - server.start - - -=== Running the app with Goliath - -Goliath can be made to run arbitrary Rack apps by delegating to them from a -Goliath::API instance. A simple server looks like this: - - require 'goliath' - require './app' - - class EchoServer < Goliath::API - def response(env) - App.call(env) - end - end - -Faye::WebSocket can also be used inline within a Goliath app: - - require 'goliath' - require 'faye/websocket' - - class EchoServer < Goliath::API - def response(env) - ws = Faye::WebSocket.new(env) - - ws.onmessage = lambda do |event| - ws.send(event.data) - end - - ws.rack_response - end - end += faye-websocket-parser {}[http://travis-ci.org/faye/faye-websocket-ruby] == License