     For WebSocket, a text frame is sent to client if data is String,
     a binary frame when data is byte[] or InputStream. For for HTTP streaming
     responses, data can be one of the type defined by Ring spec")
+
   (on-receive [ch callback]
     "Sets handler (fn [message]) for notification of client WebSocket
     messages. Message ordering is guaranteed by server.
 
     The message argument could be a string or a byte[].")
+
   (on-ping [ch callback]
     "Sets handler (fn [data]) for notification of client WebSocket pings. The
     data param represents application data and will by a byte[].")
+
   (on-close [ch callback]
     "Sets handler (fn [status]) for notification of channel being closed by the
     server or client. Handler will be invoked at most once. Useful for clean-up.

  "Unified asynchronous channel interface for HTTP (streaming or long-polling)
   and WebSocket."

  (open? [ch] "Returns true iff channel is open.")
  (close [ch]
    "Closes the channel. Idempotent: returns true if the channel was actually
    closed, or false if it was already closed.")
  (websocket? [ch] "Returns true iff channel is a WebSocket.")
  (send! [ch data] [ch data close-after-send?]
    "Sends data to client and returns true if the data was successfully sent,
    or false if the channel is closed. Data is sent directly to the client,

        (on-close   ch (fn [status] (println \"on-close:\" status))))))

  Channel API (see relevant docstrings for more info):
    (open?       [ch])
    (websocket?  [ch])

    (close       [ch])
    (send!       [ch data] [ch data close-after-send?])

    (on-receieve [ch callback])
    (on-close    [ch callback])

  See org.httpkit.timer ns for optional timeout facilities."
  [ring-req ch-name & body]
