lib_factory_connection.js
/**
* @typedef TOptions
* @memberof DoboConnection
* @property {string} [name='default'] - Connection name
* @property {string[]} models - List of model names to be used with this connection. Use this property to force models to be bound to this connection only.
*/
/**
* Connection factory
*
* @async
*/
async function connectionFactory () {
const { Tools } = this.app.baseClass
const { omit } = this.app.lib._
/**
* Connection class definition.
*
* @class
*/
class DoboConnection extends Tools {
constructor (plugin, options = {}) {
super(plugin)
/**
* Adapter object
* @type {Object}
*/
this.adapter = undefined
/**
* Client instance
* @type {Object}
*/
this.client = undefined
/**
* Connection name
* @type {string}
*/
this.name = options.name
/**
* Connection options
* @type {DoboConnection.TOptions}
*/
this.options = {
models: []
}
/**
* Options object from connection defined on ```dobo.config.connections```
* @type {Object}
*/
if (options instanceof this.app.baseClass.DoboNullAdapter) {
this.adapter = options
this.options.connName = 'nulladapter'
} else {
this.options = omit(options, ['name', 'adapter'])
this.options.connName = options.name
this.options.models = this.options.models ?? []
}
}
/**
* Initialize the adapter for this connection. If the adapter is already an instance of `DoboAdapter`,
* it will be used directly. Otherwise, it will be retrieved from the plugin's adapter registry
* and sanitized with the connection options.
* @param {string} name - Adapter name
* @async
* @returns {Promise<void>}
*/
async initAdapter (name) {
if (name instanceof this.app.baseClass.DoboAdapter) this.adapter = name
else {
this.adapter = this.plugin.getAdapter(name)
await this.adapter.sanitizeConnection(this.options)
}
}
/**
* Establish this connection through the adapter to the actual database system. Adapter developer must
* provide a method named `connect()` to connect the underlying database and (optionally)
* return its client instance.
*
* @param {boolean} [noRebuild] - If `true`, the database table/collection won't be build automatically
* @retyrns {Promise<void>}
*/
async connect (noRebuild) {
const client = await this.adapter.connect(this, noRebuild)
if (client) this.client = client
this.connected = true
}
/**
* Dispose this connection
* @async
* @returns {Promise<void>}
*/
dispose = async () => {
await super.dispose()
this.adapter = null
}
}
this.app.baseClass.DoboConnection = DoboConnection
}
export default connectionFactory