/* * ws.js: Top level include for node-http-proxy websocket helpers * * (C) 2010 Nodejitsu Inc. * MIT LICENCE * */ var assert = require('assert'), https = require('https'), async = require('async'), io = require('socket.io'), ws = require('ws'), helpers = require('./index'), protocols = helpers.protocols, http = require('./http'); // // ### function createServerPair (options, callback) // #### @options {Object} Options to create target and proxy server. // #### @target {Object} Options for the target server. // #### @proxy {Object} Options for the proxy server. // #### @callback {function} Continuation to respond to when complete. // // Creates http target and proxy servers // exports.createServerPair = function (options, callback) { async.series([ // // 1. Create the target server // function createTarget(next) { exports.createServer(options.target, next); }, // // 2. Create the proxy server // function createTarget(next) { http.createProxyServer(options.proxy, next); } ], callback); }; // // ### function createServer (options, callback) // #### @options {Object} Options for creating the socket.io or ws server. // #### @raw {boolean} Enables ws.Websocket server. // // Creates a socket.io or ws server using the specified `options`. // exports.createServer = function (options, callback) { return options.raw ? exports.createWsServer(options, callback) : exports.createSocketIoServer(options, callback); }; // // ### function createSocketIoServer (options, callback) // #### @options {Object} Options for creating the socket.io server // #### @port {number} Port to listen on // #### @input {string} Input to expect from the only socket // #### @output {string} Output to send the only socket // // Creates a socket.io server on the specified `options.port` which // will expect `options.input` and then send `options.output`. // exports.createSocketIoServer = function (options, callback) { var server = protocols.target === 'https' ? io.listen(options.port, helpers.https, callback) : io.listen(options.port, callback); server.sockets.on('connection', function (socket) { socket.on('incoming', function (data) { assert.equal(data, options.input); socket.emit('outgoing', options.output); }); }); }; // // ### function createWsServer (options, callback) // #### @options {Object} Options for creating the ws.Server instance // #### @port {number} Port to listen on // #### @input {string} Input to expect from the only socket // #### @output {string} Output to send the only socket // // Creates a ws.Server instance on the specified `options.port` which // will expect `options.input` and then send `options.output`. // exports.createWsServer = function (options, callback) { var server, wss; if (protocols.target === 'https') { server = https.createServer(helpers.https, function (req, res) { req.writeHead(200); req.end(); }).listen(options.port, callback); wss = new ws.Server({ server: server }); } else { wss = new ws.Server({ port: options.port }, callback); } wss.on('connection', function (socket) { socket.on('message', function (data) { assert.equal(data, options.input); socket.send(options.output); }); }); };