@fastify/awilix
Version:
Dependency injection support for fastify framework
91 lines (76 loc) • 2.31 kB
JavaScript
const awilix = require('awilix')
const { AwilixManager } = require('awilix-manager')
const fp = require('fastify-plugin')
const diContainerProxy = awilix.createContainer({
injectionMode: 'PROXY',
})
const diContainerClassic = awilix.createContainer({
injectionMode: 'CLASSIC',
})
function plugin(fastify, opts, next) {
if (opts.container && opts.injectionMode) {
return next(
new Error(
'If you are passing pre-created container explicitly, you cannot specify injection mode',
),
)
}
const resolvedContainer = opts.container
? opts.container
: opts.injectionMode === 'CLASSIC'
? diContainerClassic
: diContainerProxy
const awilixManager = new AwilixManager({
diContainer: resolvedContainer,
asyncDispose: opts.asyncDispose,
asyncInit: opts.asyncInit,
eagerInject: opts.eagerInject,
})
const disposeOnResponse = opts.disposeOnResponse === true || opts.disposeOnResponse === undefined
const disposeOnClose = opts.disposeOnClose === true || opts.disposeOnClose === undefined
fastify.decorate('awilixManager', awilixManager)
fastify.decorate('diContainer', resolvedContainer)
fastify.decorateRequest('diScope', null)
fastify.addHook('onRequest', (request, reply, done) => {
request.diScope = resolvedContainer.createScope()
done()
})
if (opts.asyncInit || opts.eagerInject) {
fastify.addHook('onReady', (done) => {
awilixManager.executeInit().then(done, done)
})
}
if (disposeOnClose) {
fastify.addHook('onClose', (instance, done) => {
if (instance.awilixManager.config.asyncDispose) {
instance.awilixManager
.executeDispose()
.then(() => {
return instance.diContainer.dispose()
})
.then(done, done)
} else {
instance.diContainer.dispose().then(done, done)
}
})
}
if (disposeOnResponse) {
fastify.addHook('onResponse', (request, reply, done) => {
if (request.diScope) {
request.diScope.dispose().then(done, done)
}
})
}
next()
}
const fastifyAwilixPlugin = fp(plugin, {
fastify: '4.x',
name: '@fastify/awilix',
})
module.exports = {
diContainer: diContainerProxy,
diContainerProxy,
diContainerClassic,
fastifyAwilixPlugin,
}