UNPKG

2.06 kBJavaScriptView Raw
1'use strict'
2
3/* eslint no-prototype-builtins: 0 */
4
5const {
6 kReply,
7 kRequest,
8 kState
9} = require('./symbols.js')
10
11const {
12 codes: {
13 FST_ERR_DEC_ALREADY_PRESENT,
14 FST_ERR_DEC_MISSING_DEPENDENCY,
15 FST_ERR_DEC_AFTER_START
16 }
17} = require('./errors')
18
19function decorate (instance, name, fn, dependencies) {
20 if (instance.hasOwnProperty(name)) {
21 throw new FST_ERR_DEC_ALREADY_PRESENT(name)
22 }
23
24 if (dependencies) {
25 checkDependencies(instance, dependencies)
26 }
27
28 if (fn && (typeof fn.getter === 'function' || typeof fn.setter === 'function')) {
29 Object.defineProperty(instance, name, {
30 get: fn.getter,
31 set: fn.setter
32 })
33 } else {
34 instance[name] = fn
35 }
36}
37
38function decorateFastify (name, fn, dependencies) {
39 assertNotStarted(this, name)
40 decorate(this, name, fn, dependencies)
41 return this
42}
43
44function checkExistence (instance, name) {
45 if (name) {
46 return name in instance
47 }
48
49 return instance in this
50}
51
52function checkRequestExistence (name) {
53 return checkExistence(this[kRequest].prototype, name)
54}
55
56function checkReplyExistence (name) {
57 return checkExistence(this[kReply].prototype, name)
58}
59
60function checkDependencies (instance, deps) {
61 for (var i = 0; i < deps.length; i++) {
62 if (!checkExistence(instance, deps[i])) {
63 throw new FST_ERR_DEC_MISSING_DEPENDENCY(deps[i])
64 }
65 }
66}
67
68function decorateReply (name, fn, dependencies) {
69 assertNotStarted(this, name)
70 decorate(this[kReply].prototype, name, fn, dependencies)
71 return this
72}
73
74function decorateRequest (name, fn, dependencies) {
75 assertNotStarted(this, name)
76 decorate(this[kRequest].prototype, name, fn, dependencies)
77 return this
78}
79
80function assertNotStarted (instance, name) {
81 if (instance[kState].started) {
82 throw new FST_ERR_DEC_AFTER_START(name)
83 }
84}
85
86module.exports = {
87 add: decorateFastify,
88 exist: checkExistence,
89 existRequest: checkRequestExistence,
90 existReply: checkReplyExistence,
91 dependencies: checkDependencies,
92 decorateReply: decorateReply,
93 decorateRequest: decorateRequest
94}