123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899 |
- 'use strict'
- var Server = require('./Server'),
- Connection = require('./Connection'),
- net = require('net'),
- tls = require('tls'),
- url = require('url')
- /**
- * Create a WebSocket server
- * @param {Object} [options] will be passed to net.createServer() or tls.createServer(), with the additional property 'secure' (a boolean)
- * @param {Function} callback will be added as 'connection' listener
- * @returns {Server}
- */
- exports.createServer = function (options, callback) {
- if (typeof options === 'function' || !arguments.length) {
- return new Server(false, options)
- }
- return new Server(Boolean(options.secure), options, callback)
- }
- /**
- * Create a WebSocket client
- * @param {string} URL with the format 'ws://localhost:8000/chat' (the port can be ommited)
- * @param {Object} [options] will be passed to net.connect() or tls.connect()
- * @param {Function} callback will be added as 'connect' listener
- * @returns {Connection}
- */
- exports.connect = function (URL, options, callback) {
- var socket
- if (typeof options === 'function') {
- callback = options
- options = undefined
- }
- options = options || {}
- var connectionOptions = parseWSURL(URL)
- options.port = connectionOptions.port
- options.host = connectionOptions.host
- connectionOptions.extraHeaders = options.extraHeaders
- connectionOptions.protocols = options.protocols
- if (connectionOptions.secure) {
- socket = tls.connect(options)
- } else {
- socket = net.connect(options)
- }
- return new Connection(socket, connectionOptions, callback)
- }
- /**
- * Set the minimum size of a pack of binary data to send in a single frame
- * @param {number} bytes
- */
- exports.setBinaryFragmentation = function (bytes) {
- Connection.binaryFragmentation = bytes
- }
- /**
- * Set the maximum size the internal Buffer can grow, to avoid memory attacks
- * @param {number} bytes
- */
- exports.setMaxBufferLength = function (bytes) {
- Connection.maxBufferLength = bytes
- }
- /**
- * Parse the WebSocket URL
- * @param {string} URL
- * @returns {Object}
- * @private
- */
- function parseWSURL(URL) {
- var parts, secure
- parts = url.parse(URL)
- parts.protocol = parts.protocol || 'ws:'
- if (parts.protocol === 'ws:') {
- secure = false
- } else if (parts.protocol === 'wss:') {
- secure = true
- } else {
- throw new Error('Invalid protocol ' + parts.protocol + '. It must be ws or wss')
- }
- parts.port = parts.port || (secure ? 443 : 80)
- parts.path = parts.path || '/'
- return {
- path: parts.path,
- port: parts.port,
- secure: secure,
- host: parts.hostname
- }
- }
|