UNPKG

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