You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
95 lines
2.0 KiB
95 lines
2.0 KiB
4 years ago
|
'use strict'
|
||
|
|
||
|
/* eslint no-prototype-builtins: 0 */
|
||
|
|
||
|
const {
|
||
|
kReply,
|
||
|
kRequest,
|
||
|
kState
|
||
|
} = require('./symbols.js')
|
||
|
|
||
|
const {
|
||
|
codes: {
|
||
|
FST_ERR_DEC_ALREADY_PRESENT,
|
||
|
FST_ERR_DEC_MISSING_DEPENDENCY,
|
||
|
FST_ERR_DEC_AFTER_START
|
||
|
}
|
||
|
} = require('./errors')
|
||
|
|
||
|
function decorate (instance, name, fn, dependencies) {
|
||
|
if (instance.hasOwnProperty(name)) {
|
||
|
throw new FST_ERR_DEC_ALREADY_PRESENT(name)
|
||
|
}
|
||
|
|
||
|
if (dependencies) {
|
||
|
checkDependencies(instance, dependencies)
|
||
|
}
|
||
|
|
||
|
if (fn && (typeof fn.getter === 'function' || typeof fn.setter === 'function')) {
|
||
|
Object.defineProperty(instance, name, {
|
||
|
get: fn.getter,
|
||
|
set: fn.setter
|
||
|
})
|
||
|
} else {
|
||
|
instance[name] = fn
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function decorateFastify (name, fn, dependencies) {
|
||
|
assertNotStarted(this, name)
|
||
|
decorate(this, name, fn, dependencies)
|
||
|
return this
|
||
|
}
|
||
|
|
||
|
function checkExistence (instance, name) {
|
||
|
if (name) {
|
||
|
return name in instance
|
||
|
}
|
||
|
|
||
|
return instance in this
|
||
|
}
|
||
|
|
||
|
function checkRequestExistence (name) {
|
||
|
return checkExistence(this[kRequest].prototype, name)
|
||
|
}
|
||
|
|
||
|
function checkReplyExistence (name) {
|
||
|
return checkExistence(this[kReply].prototype, name)
|
||
|
}
|
||
|
|
||
|
function checkDependencies (instance, deps) {
|
||
|
for (var i = 0; i < deps.length; i++) {
|
||
|
if (!checkExistence(instance, deps[i])) {
|
||
|
throw new FST_ERR_DEC_MISSING_DEPENDENCY(deps[i])
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function decorateReply (name, fn, dependencies) {
|
||
|
assertNotStarted(this, name)
|
||
|
decorate(this[kReply].prototype, name, fn, dependencies)
|
||
|
return this
|
||
|
}
|
||
|
|
||
|
function decorateRequest (name, fn, dependencies) {
|
||
|
assertNotStarted(this, name)
|
||
|
decorate(this[kRequest].prototype, name, fn, dependencies)
|
||
|
return this
|
||
|
}
|
||
|
|
||
|
function assertNotStarted (instance, name) {
|
||
|
if (instance[kState].started) {
|
||
|
throw new FST_ERR_DEC_AFTER_START(name)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
module.exports = {
|
||
|
add: decorateFastify,
|
||
|
exist: checkExistence,
|
||
|
existRequest: checkRequestExistence,
|
||
|
existReply: checkReplyExistence,
|
||
|
dependencies: checkDependencies,
|
||
|
decorateReply: decorateReply,
|
||
|
decorateRequest: decorateRequest
|
||
|
}
|