@volcanicminds/backend 0.2.0 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -256,3 +256,39 @@ You can use something like this to specify which roles (routes.ts) can recall so
256
256
  ```js
257
257
  roles: [roles.admin, roles.public]
258
258
  ```
259
+
260
+ ## Hooks
261
+
262
+ It's possible add hook to application or request/reply lifecycles. More info on [Fastify Hooks](https://www.fastify.io/docs/latest/Reference/Hooks/).
263
+
264
+ Available hooks are:
265
+
266
+ ```js
267
+ const hooks = [
268
+ 'onRequest',
269
+ 'onError',
270
+ 'onSend',
271
+ 'onResponse',
272
+ 'onTimeout',
273
+ 'onReady',
274
+ 'onClose',
275
+ 'onRoute',
276
+ 'onRegistry',
277
+ 'preParsing',
278
+ 'preValidation',
279
+ 'preSeralization',
280
+ 'preHandler'
281
+ ]
282
+ ```
283
+
284
+ Under `src` create the `hooks` folder and inside add the hook as shown in the fastify docs, for example:
285
+
286
+ ```js
287
+ // src/hooks/onRequest.ts
288
+
289
+ async function hook(req, reply) {
290
+ log.debug('onRequest called')
291
+ }
292
+
293
+ export { hook }
294
+ ```
@@ -1,2 +1,19 @@
1
1
  "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.hook = void 0;
13
+ function hook(req, reply) {
14
+ return __awaiter(this, void 0, void 0, function* () {
15
+ log.debug('aaaaaaaaaa');
16
+ });
17
+ }
18
+ exports.hook = hook;
2
19
  //# sourceMappingURL=onRequest.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"onRequest.js","sourceRoot":"","sources":["../../../lib/hooks/onRequest.ts"],"names":[],"mappings":""}
1
+ {"version":3,"file":"onRequest.js","sourceRoot":"","sources":["../../../lib/hooks/onRequest.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,SAAe,IAAI,CAAC,GAAG,EAAE,KAAK;;QAC5B,GAAG,CAAC,KAAK,CAAC,YAAY,CAAC,CAAA;IACzB,CAAC;CAAA;AAEQ,oBAAI"}
@@ -17,16 +17,29 @@ const hooks = [
17
17
  'preHandler'
18
18
  ];
19
19
  const glob = require('glob');
20
+ const path = require('path');
20
21
  function apply(server) {
21
22
  log.debug('LOAD HOOKS');
22
23
  const patterns = [`${__dirname}/../hooks/*.{ts,js}`, `${process.cwd()}/src/hooks/*.{ts,js}`];
23
- const allHooks = {};
24
+ const allHooks = hooks.reduce((acc, v) => (Object.assign(Object.assign({}, acc), { [v]: [] })), {});
24
25
  patterns.forEach((pattern) => {
25
26
  log.d && log.debug('Looking for ' + pattern);
26
27
  glob.sync(pattern).forEach((f) => {
27
- log.debug('file' + f);
28
+ const hookName = path.basename(f, path.extname(f));
29
+ const { hook: fn } = require(f);
30
+ if (fn != null) {
31
+ if (allHooks[hookName] == null) {
32
+ allHooks[hookName] = [];
33
+ }
34
+ allHooks[hookName].push((...args) => fn(...args));
35
+ }
28
36
  });
29
37
  });
38
+ hooks.map((hookName) => {
39
+ const fns = allHooks[hookName];
40
+ log.t && log.trace(`Loaded ${(fns === null || fns === void 0 ? void 0 : fns.length) || 0} hook for ${hookName}`);
41
+ (fns === null || fns === void 0 ? void 0 : fns.length) > 0 && fns.map((fn) => server.addHook(hookName, fn));
42
+ });
30
43
  }
31
44
  exports.apply = apply;
32
45
  //# sourceMappingURL=hooks.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"hooks.js","sourceRoot":"","sources":["../../../lib/loader/hooks.ts"],"names":[],"mappings":";;;AAAA,MAAM,KAAK,GAAG;IACZ,WAAW;IACX,SAAS;IACT,QAAQ;IACR,YAAY;IACZ,WAAW;IACX,SAAS;IACT,SAAS;IACT,SAAS;IACT,YAAY;IACZ,YAAY;IACZ,eAAe;IACf,iBAAiB;IACjB,YAAY;CACb,CAAA;AAED,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAA;AAG5B,SAAgB,KAAK,CAAC,MAAW;IAC/B,GAAG,CAAC,KAAK,CAAC,YAAY,CAAC,CAAA;IAEvB,MAAM,QAAQ,GAAG,CAAC,GAAG,SAAS,qBAAqB,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,sBAAsB,CAAC,CAAA;IAC5F,MAAM,QAAQ,GAAQ,EAAE,CAAA;IACxB,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC3B,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,cAAc,GAAG,OAAO,CAAC,CAAA;QAC5C,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAS,EAAE,EAAE;YACvC,GAAG,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;QACvB,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AAGJ,CAAC;AAbD,sBAaC"}
1
+ {"version":3,"file":"hooks.js","sourceRoot":"","sources":["../../../lib/loader/hooks.ts"],"names":[],"mappings":";;;AAAA,MAAM,KAAK,GAAG;IACZ,WAAW;IACX,SAAS;IACT,QAAQ;IACR,YAAY;IACZ,WAAW;IACX,SAAS;IACT,SAAS;IACT,SAAS;IACT,YAAY;IACZ,YAAY;IACZ,eAAe;IACf,iBAAiB;IACjB,YAAY;CACb,CAAA;AAED,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAA;AAC5B,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAA;AAE5B,SAAgB,KAAK,CAAC,MAAW;IAC/B,GAAG,CAAC,KAAK,CAAC,YAAY,CAAC,CAAA;IAEvB,MAAM,QAAQ,GAAG,CAAC,GAAG,SAAS,qBAAqB,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,sBAAsB,CAAC,CAAA;IAC5F,MAAM,QAAQ,GAAQ,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,iCAAM,GAAG,KAAE,CAAC,CAAC,CAAC,EAAE,EAAgB,IAAG,EAAE,EAAE,CAAC,CAAA;IAGvF,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC3B,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,cAAc,GAAG,OAAO,CAAC,CAAA;QAC5C,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAS,EAAE,EAAE;YACvC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAA;YAClD,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC,CAAA;YAE/B,IAAI,EAAE,IAAI,IAAI,EAAE;gBACd,IAAI,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,EAAE;oBAC9B,QAAQ,CAAC,QAAQ,CAAC,GAAG,EAAgB,CAAA;iBACtC;gBACD,QAAQ,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,CAAA;aAClD;QACH,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,KAAK,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE;QACrB,MAAM,GAAG,GAAe,QAAQ,CAAC,QAAQ,CAAC,CAAA;QAC1C,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,UAAU,CAAA,GAAG,aAAH,GAAG,uBAAH,GAAG,CAAE,MAAM,KAAI,CAAC,aAAa,QAAQ,EAAE,CAAC,CAAA;QACrE,CAAA,GAAG,aAAH,GAAG,uBAAH,GAAG,CAAE,MAAM,IAAG,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAc,CAAC,CAAC,CAAA;IAC9E,CAAC,CAAC,CAAA;AACJ,CAAC;AA3BD,sBA2BC"}
@@ -0,0 +1,5 @@
1
+ async function hook(req, reply) {
2
+ log.debug('aaaaaaaaaa')
3
+ }
4
+
5
+ export { hook }
@@ -15,19 +15,33 @@ const hooks = [
15
15
  ]
16
16
 
17
17
  const glob = require('glob')
18
- // const path = require('path')
18
+ const path = require('path')
19
19
 
20
20
  export function apply(server: any): void {
21
21
  log.debug('LOAD HOOKS')
22
22
  //const patterns = [`{${__dirname},${process.cwd()}}/../hooks/*.{ts,js}`]
23
23
  const patterns = [`${__dirname}/../hooks/*.{ts,js}`, `${process.cwd()}/src/hooks/*.{ts,js}`]
24
- const allHooks: any = {}
24
+ const allHooks: any = hooks.reduce((acc, v) => ({ ...acc, [v]: [] as Function[] }), {})
25
+ // log.error(allHooks)
26
+
25
27
  patterns.forEach((pattern) => {
26
28
  log.d && log.debug('Looking for ' + pattern)
27
29
  glob.sync(pattern).forEach((f: string) => {
28
- log.debug('file' + f)
30
+ const hookName = path.basename(f, path.extname(f))
31
+ const { hook: fn } = require(f)
32
+
33
+ if (fn != null) {
34
+ if (allHooks[hookName] == null) {
35
+ allHooks[hookName] = [] as Function[]
36
+ }
37
+ allHooks[hookName].push((...args) => fn(...args))
38
+ }
29
39
  })
30
40
  })
31
- // log.i && log.info('Hooks loaded: ' + Object.keys(roles).join(', '))
32
- // server.addHook()
41
+
42
+ hooks.map((hookName) => {
43
+ const fns: Function[] = allHooks[hookName]
44
+ log.t && log.trace(`Loaded ${fns?.length || 0} hook for ${hookName}`)
45
+ fns?.length > 0 && fns.map((fn) => server.addHook(hookName, fn as Function))
46
+ })
33
47
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@volcanicminds/backend",
3
- "version": "0.2.0",
3
+ "version": "0.2.1",
4
4
  "codename": "turin",
5
5
  "license": "MIT",
6
6
  "description": "The volcanic (minds) backend",
@@ -1,2 +0,0 @@
1
- "use strict";
2
- //# sourceMappingURL=onRequest.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"onRequest.js","sourceRoot":"","sources":["../../hooks/onRequest.ts"],"names":[],"mappings":""}
package/dist/lib/index.js DELETED
@@ -1,190 +0,0 @@
1
- 'use strict';
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || function (mod) {
19
- if (mod && mod.__esModule) return mod;
20
- var result = {};
21
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
- __setModuleDefault(result, mod);
23
- return result;
24
- };
25
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
26
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
27
- return new (P || (P = Promise))(function (resolve, reject) {
28
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
29
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
30
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
31
- step((generator = generator.apply(thisArg, _arguments || [])).next());
32
- });
33
- };
34
- var __importDefault = (this && this.__importDefault) || function (mod) {
35
- return (mod && mod.__esModule) ? mod : { "default": mod };
36
- };
37
- Object.defineProperty(exports, "__esModule", { value: true });
38
- const dotenv_1 = __importDefault(require("dotenv"));
39
- dotenv_1.default.config();
40
- const yn_1 = __importDefault(require("./util/yn"));
41
- const logger_1 = __importDefault(require("./util/logger"));
42
- const mark = __importStar(require("./util/mark"));
43
- const loaderRoles = __importStar(require("./loader/roles"));
44
- const loaderRouter = __importStar(require("./loader/router"));
45
- const loaderHooks = __importStar(require("./loader/hooks"));
46
- const fastify_1 = __importDefault(require("fastify"));
47
- const swagger_1 = __importDefault(require("@fastify/swagger"));
48
- const swagger_ui_1 = __importDefault(require("@fastify/swagger-ui"));
49
- const cors_1 = __importDefault(require("@fastify/cors"));
50
- const helmet_1 = __importDefault(require("@fastify/helmet"));
51
- const compress_1 = __importDefault(require("@fastify/compress"));
52
- const rate_limit_1 = __importDefault(require("@fastify/rate-limit"));
53
- const server_1 = require("@apollo/server");
54
- const fastify_2 = __importStar(require("@as-integrations/fastify"));
55
- const context_1 = require("./apollo/context");
56
- const resolvers_1 = __importDefault(require("./apollo/resolvers"));
57
- const type_defs_1 = __importDefault(require("./apollo/type-defs"));
58
- const common_1 = require("./util/common");
59
- function attachApollo(fastify) {
60
- return __awaiter(this, void 0, void 0, function* () {
61
- log.info('Attach ApolloServer to Fastify');
62
- const apollo = new server_1.ApolloServer({
63
- typeDefs: type_defs_1.default,
64
- resolvers: resolvers_1.default,
65
- plugins: [(0, fastify_2.fastifyApolloDrainPlugin)(fastify)]
66
- });
67
- yield apollo.start();
68
- return apollo;
69
- });
70
- }
71
- function addApolloRouting(fastify, apollo) {
72
- return __awaiter(this, void 0, void 0, function* () {
73
- if (apollo) {
74
- log.trace('Add graphql routes');
75
- yield fastify.register((0, fastify_2.default)(apollo), {
76
- context: context_1.myContextFunction
77
- });
78
- }
79
- });
80
- }
81
- function addFastifyRouting(fastify) {
82
- return __awaiter(this, void 0, void 0, function* () {
83
- log.trace('Add fastify routes');
84
- loaderHooks.apply(fastify);
85
- fastify.addHook('onResponse', (req, reply) => __awaiter(this, void 0, void 0, function* () {
86
- var _a;
87
- const elapsed = new Date().getTime() - (((_a = req.start) === null || _a === void 0 ? void 0 : _a.getTime()) || 0);
88
- const message = `Return ${reply.statusCode} - ${req.method} ${req.url} (${elapsed}ms)`;
89
- reply.statusCode < 300 ? log.info(message) : reply.statusCode < 400 ? log.warn(message) : log.error(message);
90
- }));
91
- fastify.addHook('onError', (req, reply, error) => __awaiter(this, void 0, void 0, function* () {
92
- log.debug(`onError ${error}`);
93
- }));
94
- fastify.addHook('onRequest', (req, reply) => __awaiter(this, void 0, void 0, function* () {
95
- req.start = new Date();
96
- req.user = {
97
- id: 306,
98
- name: 'Huseyin',
99
- roles: ['admin', 'public']
100
- };
101
- req.data = () => (0, common_1.getData)(req);
102
- req.pars = () => (0, common_1.getParams)(req);
103
- }));
104
- const routes = loaderRouter.load();
105
- routes && loaderRouter.apply(fastify, routes);
106
- });
107
- }
108
- function addFastifySwagger(fastify) {
109
- return __awaiter(this, void 0, void 0, function* () {
110
- const { NODE_ENV, SWAGGER, SWAGGER_TITLE, SWAGGER_DESCRIPTION, SWAGGER_VERSION, SWAGGER_PREFIX_URL } = process.env;
111
- const loadSwagger = (0, yn_1.default)(SWAGGER, false);
112
- if (loadSwagger && NODE_ENV !== 'production') {
113
- log.trace('Add swagger plugin');
114
- yield fastify.register(swagger_1.default, {
115
- swagger: {
116
- info: {
117
- title: SWAGGER_TITLE || 'API Documentation',
118
- description: SWAGGER_DESCRIPTION || 'List of available APIs and schemes to use',
119
- version: SWAGGER_VERSION || '0.1.0'
120
- },
121
- consumes: ['application/json'],
122
- produces: ['application/json']
123
- }
124
- });
125
- yield fastify.register(swagger_ui_1.default, {
126
- routePrefix: SWAGGER_PREFIX_URL || '/documentation',
127
- uiConfig: {
128
- docExpansion: 'list',
129
- deepLinking: true,
130
- defaultModelsExpandDepth: 1
131
- },
132
- uiHooks: {
133
- onRequest: function (request, reply, next) {
134
- next();
135
- },
136
- preHandler: function (request, reply, next) {
137
- next();
138
- }
139
- },
140
- staticCSP: true,
141
- transformStaticCSP: (header) => header
142
- });
143
- }
144
- });
145
- }
146
- const start = () => __awaiter(void 0, void 0, void 0, function* () {
147
- const begin = new Date().getTime();
148
- mark.print(logger_1.default);
149
- global.log = logger_1.default;
150
- global.roles = loaderRoles.load();
151
- const opts = (0, yn_1.default)(process.env.LOG_FASTIFY, false) ? { logger: logger_1.default } : {};
152
- const fastify = yield (0, fastify_1.default)(opts);
153
- const { HOST: host = '0.0.0.0', PORT: port = '2230', GRAPHQL } = process.env;
154
- const { SRV_CORS, SRV_HELMET, SRV_RATELIMIT, SRV_COMPRESS } = process.env;
155
- const loadApollo = (0, yn_1.default)(GRAPHQL, true);
156
- const addPluginCors = (0, yn_1.default)(SRV_CORS, true);
157
- const addPluginHelmet = (0, yn_1.default)(SRV_HELMET, true);
158
- const addPluginRateLimit = (0, yn_1.default)(SRV_RATELIMIT, true);
159
- const addPluginCompress = (0, yn_1.default)(SRV_COMPRESS, true);
160
- log.t && log.trace(`Attach Apollo Server ${loadApollo}`);
161
- log.t && log.trace(`Add plugin CORS: ${addPluginCors}`);
162
- log.t && log.trace(`Add plugin HELMET: ${!loadApollo ? addPluginHelmet : 'Not usable with Apollo'}`);
163
- log.t && log.trace(`Add plugin COMPRESS: ${addPluginCompress}`);
164
- log.t && log.trace(`Add plugin RATELIMIT: ${addPluginRateLimit}`);
165
- const apollo = loadApollo ? yield attachApollo(fastify) : null;
166
- !loadApollo && addPluginHelmet && (yield fastify.register(helmet_1.default));
167
- addPluginRateLimit && (yield fastify.register(rate_limit_1.default));
168
- addPluginCors && (yield fastify.register(cors_1.default));
169
- addPluginCompress && (yield fastify.register(compress_1.default));
170
- yield addFastifySwagger(fastify);
171
- yield addApolloRouting(fastify, apollo);
172
- yield addFastifyRouting(fastify);
173
- yield fastify
174
- .listen({
175
- port: Number(port),
176
- host: host
177
- })
178
- .then((address) => {
179
- const elapsed = (new Date().getTime() - begin) / 100;
180
- log.info(`All stuff loaded in ${elapsed} sec`);
181
- log.info(`🚀 Server ready at ${address}`);
182
- const loadSwagger = (0, yn_1.default)(process.env.SWAGGER, false);
183
- loadSwagger && log.info(`📄 Swagger ready at ${address}${process.env.SWAGGER_PREFIX_URL || '/documentation'}`);
184
- });
185
- return fastify;
186
- });
187
- module.exports = start;
188
- module.exports.server = start;
189
- module.exports.default = start;
190
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../lib/index.ts"],"names":[],"mappings":"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"}