var PoolSelector = require('./PoolSelector'); module.exports = PoolNamespace; /** * PoolNamespace */ function PoolNamespace(cluster, pattern, selector) { this._cluster = cluster; this._pattern = pattern; this._selector = new PoolSelector[selector](); } PoolNamespace.prototype.getConnection = function(cb) { var clusterNode = this._getClusterNode(); var cluster = this._cluster; var namespace = this; if (clusterNode === null) { var err = null; if (this._cluster._findNodeIds(this._pattern, true).length !== 0) { err = new Error('Pool does not have online node.'); err.code = 'POOL_NONEONLINE'; } else { err = new Error('Pool does not exist.'); err.code = 'POOL_NOEXIST'; } return cb(err); } cluster._getConnection(clusterNode, function(err, connection) { var retry = err && cluster._canRetry && cluster._findNodeIds(namespace._pattern).length !== 0; if (retry) { return namespace.getConnection(cb); } if (err) { return cb(err); } cb(null, connection); }); }; PoolNamespace.prototype._getClusterNode = function _getClusterNode() { var foundNodeIds = this._cluster._findNodeIds(this._pattern); var nodeId; switch (foundNodeIds.length) { case 0: nodeId = null; break; case 1: nodeId = foundNodeIds[0]; break; default: nodeId = this._selector(foundNodeIds); break; } return nodeId !== null ? this._cluster._getNode(nodeId) : null; };