|
|
/** * Module dependencies. */
var url = require('./url'); var parser = require('socket.io-parser'); var Manager = require('./manager'); var debug = require('debug')('socket.io-client');
/** * Module exports. */
module.exports = exports = lookup;
/** * Managers cache. */
var cache = exports.managers = {};
/** * Looks up an existing `Manager` for multiplexing. * If the user summons: * * `io('http://localhost/a');` * `io('http://localhost/b');` * * We reuse the existing instance based on same scheme/port/host, * and we initialize sockets for each namespace. * * @api public */
function lookup (uri, opts) { if (typeof uri === 'object') { opts = uri; uri = undefined; }
opts = opts || {};
var parsed = url(uri); var source = parsed.source; var id = parsed.id; var path = parsed.path; var sameNamespace = cache[id] && path in cache[id].nsps; var newConnection = opts.forceNew || opts['force new connection'] || false === opts.multiplex || sameNamespace;
var io;
if (newConnection) { debug('ignoring socket cache for %s', source); io = Manager(source, opts); } else { if (!cache[id]) { debug('new io instance for %s', source); cache[id] = Manager(source, opts); } io = cache[id]; } if (parsed.query && !opts.query) { opts.query = parsed.query; } else if (opts && 'object' === typeof opts.query) { opts.query = encodeQueryString(opts.query); } return io.socket(parsed.path, opts); } /** * Helper method to parse query objects to string. * @param {object} query * @returns {string} */ function encodeQueryString (obj) { var str = []; for (var p in obj) { if (obj.hasOwnProperty(p)) { str.push(encodeURIComponent(p) + '=' + encodeURIComponent(obj[p])); } } return str.join('&'); } /** * Protocol version. * * @api public */
exports.protocol = parser.protocol;
/** * `connect`. * * @param {String} uri * @api public */
exports.connect = lookup;
/** * Expose constructors for standalone build. * * @api public */
exports.Manager = require('./manager'); exports.Socket = require('./socket');
|