95 lines
2.4 KiB
JavaScript
95 lines
2.4 KiB
JavaScript
'use strict'
|
|
|
|
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
|