94 lines
2.4 KiB
JavaScript
94 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?.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] () {
|
||
|
for (const client of this[kClients]) {
|
||
|
if (!client[kNeedDrain]) {
|
||
|
return client
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (!this[kConnections] || this[kClients].length < this[kConnections]) {
|
||
|
const dispatcher = this[kFactory](this[kUrl], this[kOptions])
|
||
|
this[kAddClient](dispatcher)
|
||
|
return dispatcher
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
module.exports = Pool
|