| // API references: | 
| // | 
| // * https://html.spec.whatwg.org/multipage/comms.html#network | 
| // * https://dom.spec.whatwg.org/#interface-eventtarget | 
| // * https://dom.spec.whatwg.org/#interface-event | 
|   | 
| 'use strict'; | 
|   | 
| var util   = require('util'), | 
|     driver = require('websocket-driver'), | 
|     API    = require('./websocket/api'); | 
|   | 
| var WebSocket = function(request, socket, body, protocols, options) { | 
|   options = options || {}; | 
|   | 
|   this._stream = socket; | 
|   this._driver = driver.http(request, { maxLength: options.maxLength, protocols: protocols }); | 
|   | 
|   var self = this; | 
|   if (!this._stream || !this._stream.writable) return; | 
|   if (!this._stream.readable) return this._stream.end(); | 
|   | 
|   var catchup = function() { self._stream.removeListener('data', catchup) }; | 
|   this._stream.on('data', catchup); | 
|   | 
|   API.call(this, options); | 
|   | 
|   process.nextTick(function() { | 
|     self._driver.start(); | 
|     self._driver.io.write(body); | 
|   }); | 
| }; | 
| util.inherits(WebSocket, API); | 
|   | 
| WebSocket.isWebSocket = function(request) { | 
|   return driver.isWebSocket(request); | 
| }; | 
|   | 
| WebSocket.validateOptions = function(options, validKeys) { | 
|   driver.validateOptions(options, validKeys); | 
| }; | 
|   | 
| WebSocket.WebSocket   = WebSocket; | 
| WebSocket.Client      = require('./websocket/client'); | 
| WebSocket.EventSource = require('./eventsource'); | 
|   | 
| module.exports        = WebSocket; |