Spaces:
Runtime error
Runtime error
const { | |
PoolBase, | |
kClients, | |
kNeedDrain, | |
kAddClient, | |
kGetDispatcher | |
} = require('./pool-base') | |
const Client = require('./client') | |
const { | |
InvalidArgumentError | |
} = require('./core/errors') | |
const util = require('./core/util') | |
const { kUrl, kInterceptors } = require('./core/symbols') | |
const buildConnector = require('./core/connect') | |
const kOptions = Symbol('options') | |
const kConnections = Symbol('connections') | |
const kFactory = Symbol('factory') | |
function defaultFactory (origin, opts) { | |
return new Client(origin, opts) | |
} | |
class Pool extends PoolBase { | |
constructor (origin, { | |
connections, | |
factory = defaultFactory, | |
connect, | |
connectTimeout, | |
tls, | |
maxCachedSessions, | |
socketPath, | |
autoSelectFamily, | |
autoSelectFamilyAttemptTimeout, | |
allowH2, | |
...options | |
} = {}) { | |
super() | |
if (connections != null && (!Number.isFinite(connections) || connections < 0)) { | |
throw new InvalidArgumentError('invalid connections') | |
} | |
if (typeof factory !== 'function') { | |
throw new InvalidArgumentError('factory must be a function.') | |
} | |
if (connect != null && typeof connect !== 'function' && typeof connect !== 'object') { | |
throw new InvalidArgumentError('connect must be a function or an object') | |
} | |
if (typeof connect !== 'function') { | |
connect = buildConnector({ | |
...tls, | |
maxCachedSessions, | |
allowH2, | |
socketPath, | |
timeout: connectTimeout, | |
...(util.nodeHasAutoSelectFamily && autoSelectFamily ? { autoSelectFamily, autoSelectFamilyAttemptTimeout } : undefined), | |
...connect | |
}) | |
} | |
this[kInterceptors] = options.interceptors && options.interceptors.Pool && Array.isArray(options.interceptors.Pool) | |
? options.interceptors.Pool | |
: [] | |
this[kConnections] = connections || null | |
this[kUrl] = util.parseOrigin(origin) | |
this[kOptions] = { ...util.deepClone(options), connect, allowH2 } | |
this[kOptions].interceptors = options.interceptors | |
? { ...options.interceptors } | |
: undefined | |
this[kFactory] = factory | |
} | |
[kGetDispatcher] () { | |
let dispatcher = this[kClients].find(dispatcher => !dispatcher[kNeedDrain]) | |
if (dispatcher) { | |
return dispatcher | |
} | |
if (!this[kConnections] || this[kClients].length < this[kConnections]) { | |
dispatcher = this[kFactory](this[kUrl], this[kOptions]) | |
this[kAddClient](dispatcher) | |
} | |
return dispatcher | |
} | |
} | |
module.exports = Pool | |