|
|
/**
|
|
* 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');
|