node-server-engine 1.4.8 → 1.5.0

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.
Files changed (261) hide show
  1. package/.commitlintrc.js +27 -0
  2. package/.releaserc.js +56 -0
  3. package/README.md +154 -2
  4. package/dist/const/tokenIssuer.js +1 -0
  5. package/dist/const/tokenIssuer.js.map +1 -1
  6. package/dist/db/models/SequelizeMeta.js +3 -1
  7. package/dist/db/models/SequelizeMeta.js.map +1 -1
  8. package/dist/entities/ElasticSearch/ElasticSearch.js +1 -2
  9. package/dist/entities/ElasticSearch/ElasticSearch.js.map +1 -1
  10. package/dist/entities/SocketClient/SocketClient.js +1 -0
  11. package/dist/entities/SocketClient/SocketClient.js.map +1 -1
  12. package/dist/index.js +1 -2
  13. package/dist/index.js.map +1 -1
  14. package/dist/middleware/checkPermission/checkPermission.d.ts +1 -1
  15. package/dist/middleware/checkPermission/checkPermission.js +4 -2
  16. package/dist/middleware/checkPermission/checkPermission.js.map +1 -1
  17. package/dist/utils/createHttpServer/createHttpServer.js +1 -1
  18. package/dist/utils/createHttpServer/createHttpServer.js.map +1 -1
  19. package/dist/utils/jwt/jwt.js +1 -1
  20. package/dist/utils/jwt/jwt.js.map +1 -1
  21. package/dist/utils/semverCompare/semverCompare.js +1 -5
  22. package/dist/utils/semverCompare/semverCompare.js.map +1 -1
  23. package/package.json +30 -19
  24. package/.env.example +0 -186
  25. package/.github/workflows/publish.yml +0 -41
  26. package/.prettierrc +0 -7
  27. package/Dockerfile +0 -31
  28. package/babel.config.json +0 -34
  29. package/eslint.config.mjs +0 -11
  30. package/src/const/DebeziumEvent.ts +0 -6
  31. package/src/const/LogSeverity.ts +0 -7
  32. package/src/const/index.ts +0 -5
  33. package/src/const/metrics.ts +0 -6
  34. package/src/const/mime.ts +0 -37
  35. package/src/const/tokenIssuer.ts +0 -7
  36. package/src/db/migrations/20241030121500-create-sequelize-meta-table.ts +0 -29
  37. package/src/db/models/SequelizeMeta.ts +0 -16
  38. package/src/db/models/index.ts +0 -2
  39. package/src/entities/ElasticSearch/ElasticSearch.ts +0 -103
  40. package/src/entities/ElasticSearch/ElasticSearch.types.ts +0 -7
  41. package/src/entities/ElasticSearch/index.ts +0 -2
  42. package/src/entities/Endpoint/Endpoint.test.ts +0 -248
  43. package/src/entities/Endpoint/Endpoint.ts +0 -221
  44. package/src/entities/Endpoint/Endpoint.types.ts +0 -181
  45. package/src/entities/Endpoint/index.ts +0 -2
  46. package/src/entities/EngineError/EngineError.ts +0 -28
  47. package/src/entities/EngineError/EngineError.types.ts +0 -15
  48. package/src/entities/EngineError/index.ts +0 -2
  49. package/src/entities/KeySet/KeySet.test.ts +0 -126
  50. package/src/entities/KeySet/KeySet.ts +0 -172
  51. package/src/entities/KeySet/KeySet.types.ts +0 -28
  52. package/src/entities/KeySet/index.ts +0 -2
  53. package/src/entities/LifecycleController/LifecycleController.test.ts +0 -48
  54. package/src/entities/LifecycleController/LifecycleController.ts +0 -24
  55. package/src/entities/LifecycleController/LifecycleController.types.ts +0 -5
  56. package/src/entities/LifecycleController/index.ts +0 -2
  57. package/src/entities/Localizator/Localizator.ts +0 -139
  58. package/src/entities/Localizator/Localizator.types.ts +0 -52
  59. package/src/entities/Localizator/guessNamingConvention/guessNamingConvention.test.ts +0 -165
  60. package/src/entities/Localizator/guessNamingConvention/guessNamingConvention.ts +0 -58
  61. package/src/entities/Localizator/guessNamingConvention/index.ts +0 -1
  62. package/src/entities/Localizator/index.ts +0 -2
  63. package/src/entities/MessageHandler/MessageHandler.test.ts +0 -130
  64. package/src/entities/MessageHandler/MessageHandler.ts +0 -72
  65. package/src/entities/MessageHandler/MessageHandler.types.ts +0 -15
  66. package/src/entities/MessageHandler/index.ts +0 -2
  67. package/src/entities/PubSub/PubSub.test.ts +0 -297
  68. package/src/entities/PubSub/PubSub.ts +0 -202
  69. package/src/entities/PubSub/PubSub.types.ts +0 -76
  70. package/src/entities/PubSub/handleMessage/handleMessage.test.ts +0 -102
  71. package/src/entities/PubSub/handleMessage/handleMessage.ts +0 -65
  72. package/src/entities/PubSub/handleMessage/index.ts +0 -1
  73. package/src/entities/PubSub/index.ts +0 -2
  74. package/src/entities/PushNotification/PushNotification.test.ts +0 -35
  75. package/src/entities/PushNotification/PushNotification.ts +0 -44
  76. package/src/entities/PushNotification/PushNotification.types.ts +0 -25
  77. package/src/entities/PushNotification/index.ts +0 -2
  78. package/src/entities/Redis/Redis.ts +0 -71
  79. package/src/entities/Redis/Redis.types.ts +0 -19
  80. package/src/entities/Redis/Redis.validate.ts +0 -17
  81. package/src/entities/Redis/index.ts +0 -2
  82. package/src/entities/Sequelize/Sequelize.config.ts +0 -59
  83. package/src/entities/Sequelize/Sequelize.test.ts +0 -21
  84. package/src/entities/Sequelize/Sequelize.ts +0 -75
  85. package/src/entities/Sequelize/Sequelize.types.ts +0 -10
  86. package/src/entities/Sequelize/Sequelize.validate.ts +0 -15
  87. package/src/entities/Sequelize/index.ts +0 -2
  88. package/src/entities/Server/Server.const.ts +0 -56
  89. package/src/entities/Server/Server.test.ts +0 -272
  90. package/src/entities/Server/Server.ts +0 -471
  91. package/src/entities/Server/Server.types.ts +0 -88
  92. package/src/entities/Server/index.ts +0 -2
  93. package/src/entities/SocketClient/SocketClient.test.ts +0 -392
  94. package/src/entities/SocketClient/SocketClient.ts +0 -401
  95. package/src/entities/SocketClient/SocketClient.types.ts +0 -62
  96. package/src/entities/SocketClient/index.ts +0 -2
  97. package/src/entities/SocketClient/parseMessage/index.ts +0 -1
  98. package/src/entities/SocketClient/parseMessage/parseMessage.test.ts +0 -20
  99. package/src/entities/SocketClient/parseMessage/parseMessage.ts +0 -26
  100. package/src/entities/Storage/Storage.test.ts +0 -58
  101. package/src/entities/Storage/Storage.ts +0 -219
  102. package/src/entities/Storage/Storage.types.ts +0 -57
  103. package/src/entities/Storage/index.ts +0 -2
  104. package/src/entities/ValidationError/ValidationError.ts +0 -34
  105. package/src/entities/ValidationError/index.ts +0 -1
  106. package/src/entities/WebError/WebError.test.ts +0 -18
  107. package/src/entities/WebError/WebError.ts +0 -23
  108. package/src/entities/WebError/WebError.types.ts +0 -9
  109. package/src/entities/WebError/index.ts +0 -2
  110. package/src/entities/index.ts +0 -16
  111. package/src/index.ts +0 -6
  112. package/src/metrics/debug.ts +0 -10
  113. package/src/metrics/index.ts +0 -2
  114. package/src/metrics/request.ts +0 -17
  115. package/src/middleware/authHmac/authHmac.test.ts +0 -86
  116. package/src/middleware/authHmac/authHmac.ts +0 -56
  117. package/src/middleware/authHmac/authHmac.types.ts +0 -7
  118. package/src/middleware/authHmac/index.ts +0 -2
  119. package/src/middleware/authJwt/authJwt.test.ts +0 -54
  120. package/src/middleware/authJwt/authJwt.ts +0 -55
  121. package/src/middleware/authJwt/authJwt.types.ts +0 -14
  122. package/src/middleware/authJwt/index.ts +0 -2
  123. package/src/middleware/authStatic/authStatic.test.ts +0 -36
  124. package/src/middleware/authStatic/authStatic.ts +0 -45
  125. package/src/middleware/authStatic/index.ts +0 -1
  126. package/src/middleware/authTls/authTls.test.ts +0 -138
  127. package/src/middleware/authTls/authTls.ts +0 -119
  128. package/src/middleware/authTls/authTls.types.ts +0 -13
  129. package/src/middleware/authTls/index.ts +0 -2
  130. package/src/middleware/checkPermission/checkPermission.ts +0 -33
  131. package/src/middleware/checkPermission/index.ts +0 -1
  132. package/src/middleware/error/error.test.ts +0 -60
  133. package/src/middleware/error/error.ts +0 -25
  134. package/src/middleware/error/index.ts +0 -1
  135. package/src/middleware/fileUploader/fileUploader.ts +0 -154
  136. package/src/middleware/fileUploader/fileUploader.types.ts +0 -35
  137. package/src/middleware/fileUploader/index.ts +0 -2
  138. package/src/middleware/fileUploader/isMultiPart/index.ts +0 -1
  139. package/src/middleware/fileUploader/isMultiPart/isMultipart.ts +0 -9
  140. package/src/middleware/fileUploader/validate/index.ts +0 -1
  141. package/src/middleware/fileUploader/validate/validate.ts +0 -27
  142. package/src/middleware/fourOhFour/fourOhFour.test.ts +0 -14
  143. package/src/middleware/fourOhFour/fourOhFour.ts +0 -13
  144. package/src/middleware/fourOhFour/index.ts +0 -1
  145. package/src/middleware/geminiFileUploader/geminiFileUploader.ts +0 -68
  146. package/src/middleware/geminiFileUploader/index.ts +0 -1
  147. package/src/middleware/healthCheck/healthCheck.test.ts +0 -12
  148. package/src/middleware/healthCheck/healthCheck.ts +0 -14
  149. package/src/middleware/healthCheck/index.ts +0 -1
  150. package/src/middleware/index.ts +0 -17
  151. package/src/middleware/metrics/index.ts +0 -1
  152. package/src/middleware/metrics/metrics.test.ts +0 -46
  153. package/src/middleware/metrics/metrics.ts +0 -24
  154. package/src/middleware/multiPartFileUploader/index.ts +0 -2
  155. package/src/middleware/multiPartFileUploader/multiPartFileUploader.ts +0 -249
  156. package/src/middleware/multiPartFileUploader/multiPartFileUploader.types.ts +0 -23
  157. package/src/middleware/multiPartFileUploader/validate/index.ts +0 -1
  158. package/src/middleware/multiPartFileUploader/validate/validate.ts +0 -27
  159. package/src/middleware/requestMetrics/index.ts +0 -1
  160. package/src/middleware/requestMetrics/requestMetrics.test.ts +0 -77
  161. package/src/middleware/requestMetrics/requestMetrics.ts +0 -20
  162. package/src/middleware/swaggerDocs/index.ts +0 -2
  163. package/src/middleware/swaggerDocs/swaggerDocs.ts +0 -114
  164. package/src/middleware/swaggerDocs/swaggerDocs.types.ts +0 -41
  165. package/src/middleware/userResolver/index.ts +0 -1
  166. package/src/middleware/userResolver/userResolver.ts +0 -53
  167. package/src/middleware/validate/index.ts +0 -1
  168. package/src/middleware/validate/validate.test.ts +0 -43
  169. package/src/middleware/validate/validate.ts +0 -25
  170. package/src/middleware/version/index.ts +0 -1
  171. package/src/middleware/version/version.test.ts +0 -23
  172. package/src/middleware/version/version.ts +0 -12
  173. package/src/utils/checkEnvironment/index.ts +0 -49
  174. package/src/utils/createHttpServer/createHttpServer.test.ts +0 -24
  175. package/src/utils/createHttpServer/createHttpServer.ts +0 -34
  176. package/src/utils/createHttpServer/createHttpServer.validate.ts +0 -17
  177. package/src/utils/createHttpServer/index.ts +0 -1
  178. package/src/utils/createSortedObject/createSortedObject.ts +0 -20
  179. package/src/utils/createSortedObject/createSortedObjet.test.ts +0 -47
  180. package/src/utils/createSortedObject/index.ts +0 -1
  181. package/src/utils/dbMigration/dbMigration.test.ts +0 -209
  182. package/src/utils/dbMigration/dbMigration.ts +0 -199
  183. package/src/utils/dbMigration/dbMigration.types.ts +0 -11
  184. package/src/utils/dbMigration/index.ts +0 -2
  185. package/src/utils/dbMigration/migrateMetadataTable/index.ts +0 -1
  186. package/src/utils/dbMigration/migrateMetadataTable/migrateMetadataTable.test.ts +0 -59
  187. package/src/utils/dbMigration/migrateMetadataTable/migrateMetadataTable.ts +0 -102
  188. package/src/utils/envAssert/envAssert.ts +0 -31
  189. package/src/utils/envAssert/index.ts +0 -1
  190. package/src/utils/envAssert/validators/hostList.ts +0 -17
  191. package/src/utils/envAssert/validators/index.ts +0 -5
  192. package/src/utils/envAssert/validators/ipList.ts +0 -13
  193. package/src/utils/envAssert/validators/path.ts +0 -13
  194. package/src/utils/envAssert/validators/string.ts +0 -9
  195. package/src/utils/envAssert/validators/stringList.ts +0 -13
  196. package/src/utils/filter/filter.ts +0 -17
  197. package/src/utils/filter/index.ts +0 -1
  198. package/src/utils/geminiFileUpload/geminiFileUpload.ts +0 -93
  199. package/src/utils/geminiFileUpload/index.ts +0 -1
  200. package/src/utils/hmac/checkEnv/checkEnv.test.ts +0 -18
  201. package/src/utils/hmac/checkEnv/checkEnv.ts +0 -9
  202. package/src/utils/hmac/checkEnv/index.ts +0 -1
  203. package/src/utils/hmac/createHmac/createHmac.ts +0 -33
  204. package/src/utils/hmac/createHmac/index.ts +0 -1
  205. package/src/utils/hmac/index.ts +0 -4
  206. package/src/utils/hmac/index.types.ts +0 -13
  207. package/src/utils/hmac/signPayload/index.ts +0 -1
  208. package/src/utils/hmac/signPayload/signPayload.ts +0 -16
  209. package/src/utils/hmac/verifySignature/index.ts +0 -1
  210. package/src/utils/hmac/verifySignature/verifySignature.ts +0 -24
  211. package/src/utils/index.ts +0 -29
  212. package/src/utils/jwt/index.ts +0 -2
  213. package/src/utils/jwt/jwt.test.ts +0 -28
  214. package/src/utils/jwt/jwt.ts +0 -182
  215. package/src/utils/jwt/jwt.types.ts +0 -21
  216. package/src/utils/report/index.ts +0 -3
  217. package/src/utils/report/output.ts +0 -45
  218. package/src/utils/report/output.types.ts +0 -70
  219. package/src/utils/report/report.test.ts +0 -133
  220. package/src/utils/report/report.ts +0 -133
  221. package/src/utils/report/report.types.ts +0 -13
  222. package/src/utils/request/index.ts +0 -1
  223. package/src/utils/request/request.test.ts +0 -26
  224. package/src/utils/request/request.ts +0 -48
  225. package/src/utils/secretManager/index.ts +0 -2
  226. package/src/utils/secretManager/secretLoader.ts +0 -62
  227. package/src/utils/secretManager/secretResolver.ts +0 -35
  228. package/src/utils/semverCompare/index.ts +0 -1
  229. package/src/utils/semverCompare/semverCompare.test.ts +0 -49
  230. package/src/utils/semverCompare/semverCompare.ts +0 -60
  231. package/src/utils/sendEmail/index.ts +0 -2
  232. package/src/utils/sendEmail/sendEmail.ts +0 -61
  233. package/src/utils/sendEmail/sendEmail.types.ts +0 -61
  234. package/src/utils/sendPush/index.ts +0 -2
  235. package/src/utils/sendPush/sendPush.ts +0 -20
  236. package/src/utils/sendPush/sendPush.types.ts +0 -25
  237. package/src/utils/tlsConfig/index.ts +0 -2
  238. package/src/utils/tlsConfig/tlsConfig.test.ts +0 -32
  239. package/src/utils/tlsConfig/tlsConfig.ts +0 -47
  240. package/src/utils/tlsConfig/tlsConfig.types.ts +0 -11
  241. package/src/utils/tlsConfig/tlsConfig.validate.ts +0 -25
  242. package/src/utils/tlsRequest/index.ts +0 -1
  243. package/src/utils/tlsRequest/tlsRequest.test.ts +0 -63
  244. package/src/utils/tlsRequest/tlsRequest.ts +0 -12
  245. package/src/utils/trimPathSlash/index.ts +0 -1
  246. package/src/utils/trimPathSlash/trimPathSlash.test.ts +0 -26
  247. package/src/utils/trimPathSlash/trimPathSlash.ts +0 -8
  248. package/test/env.ts +0 -53
  249. package/test/factory/index.ts +0 -8
  250. package/test/factory/sequelizeMeta.ts +0 -12
  251. package/test/hooks.ts +0 -35
  252. package/test/index.ts +0 -3
  253. package/test/stub/index.ts +0 -3
  254. package/test/stub/stubLocales.ts +0 -68
  255. package/test/stub/stubPubSub.ts +0 -7
  256. package/test/stub/stubStorage.ts +0 -77
  257. package/test/stub/stubStorage.types.ts +0 -11
  258. package/test/utils/app.ts +0 -31
  259. package/test/utils/index.ts +0 -1
  260. package/tsconfig.build.json +0 -5
  261. package/tsconfig.json +0 -32
@@ -1,154 +0,0 @@
1
- import { Request, Response, NextFunction } from 'express';
2
- import { Schema } from 'express-validator';
3
- import { WebError } from 'entities/WebError';
4
- import { reportDebug } from 'utils/report';
5
- import multer from 'multer';
6
- import { FileUploaderConfig } from './fileUploader.types';
7
- import { validate } from './validate';
8
- import path from 'path';
9
- import bytes from 'bytes';
10
-
11
- const namespace = 'engine:middleware:fileUploader';
12
-
13
- /**
14
- * Middleware for handling file uploads.
15
- * @param filesOptions Configuration options for expected files.
16
- * @param validator Validation schema for request fields.
17
- */
18
- export function fileUploader(
19
- filesOptions: Array<FileUploaderConfig>,
20
- validator: Schema
21
- ) {
22
- return async (
23
- request: Request,
24
- response: Response,
25
- next: NextFunction
26
- ): Promise<void> => {
27
- reportDebug({
28
- namespace,
29
- message: 'Received request to upload file',
30
- data: { filesOptions, validator }
31
- });
32
-
33
- // Setup multer with memory storage
34
- const storage = multer.memoryStorage();
35
- const upload = multer({
36
- storage,
37
- limits: { fileSize: 32 * 1024 * 1024 } // Default global limit (10MB)
38
- }).any();
39
-
40
- upload(request, response, async (err) => {
41
- if (err) {
42
- reportDebug({
43
- namespace,
44
- message: 'Multer upload error',
45
- data: { error: err.message }
46
- });
47
- return next(err);
48
- }
49
-
50
- // Ensure `request.files` is properly typed
51
- let uploadedFiles: Express.Multer.File[] = [];
52
- if (Array.isArray(request.files)) {
53
- uploadedFiles = request.files;
54
- } else if (typeof request.files === 'object') {
55
- uploadedFiles = Object.values(request.files).flat();
56
- }
57
-
58
- // Log uploaded files
59
- reportDebug({
60
- namespace,
61
- message: 'Files Received',
62
- data: { uploadedFiles: uploadedFiles.map((file) => file.originalname) }
63
- });
64
-
65
- // Validate request body fields
66
- try {
67
- await validate(request, validator);
68
- } catch (error) {
69
- reportDebug({
70
- namespace,
71
- message: 'Validation failed',
72
- data: { error }
73
- });
74
- return next(error);
75
- }
76
-
77
- // Extract uploaded field names
78
- const uploadedFileKeys = uploadedFiles.map((file) => file.fieldname);
79
-
80
- // Check for missing required files
81
- const missingFiles = filesOptions.filter(
82
- (option) => option.required && !uploadedFileKeys.includes(option.key)
83
- );
84
-
85
- if (missingFiles.length > 0) {
86
- reportDebug({
87
- namespace,
88
- message: 'Missing required files',
89
- data: { missingFiles, uploadedFileKeys }
90
- });
91
-
92
- return next(
93
- new WebError({
94
- statusCode: 400,
95
- errorCode: 'missing-field',
96
- message: 'Some required files have not been uploaded',
97
- data: { missingFiles, uploadedFileKeys }
98
- })
99
- );
100
- }
101
-
102
- // Validate each uploaded file
103
- for (const file of uploadedFiles) {
104
- const fileOption = filesOptions.find(
105
- (option) => option.key === file.fieldname
106
- );
107
-
108
- if (!fileOption) continue;
109
-
110
- // MIME Type Validation
111
- if (
112
- fileOption.mimeTypes &&
113
- !fileOption.mimeTypes.includes(file.mimetype)
114
- ) {
115
- return next(
116
- new WebError({
117
- statusCode: 400,
118
- errorCode: 'invalid-mime-type',
119
- message: `Invalid file type for ${file.fieldname}`,
120
- data: { expected: fileOption.mimeTypes, received: file.mimetype }
121
- })
122
- );
123
- }
124
-
125
- // Max File Size Validation
126
- if (fileOption.maxSize) {
127
- const maxSizeInBytes = bytes(fileOption.maxSize);
128
- if (maxSizeInBytes && file.size > maxSizeInBytes) {
129
- return next(
130
- new WebError({
131
- statusCode: 400,
132
- errorCode: 'file-too-large',
133
- message: `File ${file.originalname} exceeds the allowed size`,
134
- data: { maxSize: fileOption.maxSize, receivedSize: file.size }
135
- })
136
- );
137
- }
138
- }
139
-
140
- // No Extension Handling
141
- if (fileOption.noExtension) {
142
- file.originalname = path.basename(
143
- file.originalname,
144
- path.extname(file.originalname)
145
- );
146
- }
147
- }
148
-
149
- request.files = uploadedFiles;
150
-
151
- next();
152
- });
153
- };
154
- }
@@ -1,35 +0,0 @@
1
- // Extend Express request object to include `files`
2
- declare global {
3
- // eslint-disable-next-line @typescript-eslint/no-namespace
4
- namespace Express {
5
- interface Request {
6
- /** Uploaded files mapped by field name */
7
- files?:
8
- | { [key: string]: Express.Multer.File[] }
9
- | Express.Multer.File[]
10
- | undefined;
11
- }
12
- }
13
- }
14
-
15
- /** Custom uploaded file metadata */
16
- export interface UploadedFile extends Express.Multer.File {
17
- /** Original file name (use `originalname` from `Express.Multer.File`) */
18
- originalFileName: string;
19
- /** File data buffer (use `buffer` from `Express.Multer.File`) */
20
- file: Buffer;
21
- }
22
-
23
- /** Configuration for file upload */
24
- export interface FileUploaderConfig {
25
- /** Field name expected in the request */
26
- key: string;
27
- /** Allowed MIME types */
28
- mimeTypes?: Array<string>;
29
- /** Maximum file size (e.g., "2MB") */
30
- maxSize?: string;
31
- /** Whether the file is required */
32
- required?: boolean;
33
- /** Whether to store without an extension */
34
- noExtension?: boolean;
35
- }
@@ -1,2 +0,0 @@
1
- export * from './fileUploader';
2
- export * from './fileUploader.types';
@@ -1 +0,0 @@
1
- export * from './isMultipart';
@@ -1,9 +0,0 @@
1
- import { Request } from 'express';
2
-
3
- const multipartRegex = /^multipart\/form-data.+$/;
4
-
5
- /** Determines if the content type of a request is multipart/form-data */
6
- export function isMultipart(request: Request): boolean {
7
- const type = request.get('Content-Type');
8
- return !!type && multipartRegex.test(type.toLowerCase());
9
- }
@@ -1 +0,0 @@
1
- export * from './validate';
@@ -1,27 +0,0 @@
1
- import { Request } from 'express';
2
- import { Schema } from 'express-validator';
3
- import { validate as validateMiddleware } from 'middleware/validate';
4
-
5
- /** Validate a schema against a request using our validation middleware */
6
- export async function validate(
7
- request: Request,
8
- schema: Schema
9
- ): Promise<void> {
10
- return new Promise((resolve, reject) => {
11
- // Generate a validation chain using our middleware
12
- const validationChain = validateMiddleware(schema).flat();
13
- if (!validationChain.length) resolve();
14
- // Recursively go through each middleware by imitating the next function from express
15
- let position = -1;
16
- const next = (error?: unknown): void => {
17
- if (error) reject(error);
18
- position++;
19
- if (position === validationChain.length) {
20
- resolve();
21
- return;
22
- }
23
- validationChain[position](request, undefined, next);
24
- };
25
- next();
26
- });
27
- }
@@ -1,14 +0,0 @@
1
- import express from 'express';
2
- import supertest from 'supertest';
3
- import { fourOhFour } from './fourOhFour';
4
-
5
- describe('Middleware - fourOhFour', () => {
6
- it('should 404 everything', async () => {
7
- const app = express();
8
- app.get('/example', (req: any, res: any) => res.sendStatus(200));
9
- app.use(fourOhFour);
10
-
11
- await supertest(app).get('/example').expect(200);
12
- await supertest(app).get('/nope').expect(404);
13
- });
14
- });
@@ -1,13 +0,0 @@
1
- import { Request, Response } from 'express';
2
- import { reportDebug } from 'utils';
3
-
4
- const namespace = 'engine:middleware:fourOhFour';
5
-
6
- /** Unhandled path middleware */
7
- export function fourOhFour(request: Request, response: Response): void {
8
- reportDebug({
9
- namespace,
10
- message: `No route found [${request.method} - ${request.path}]`
11
- });
12
- response.sendStatus(404);
13
- }
@@ -1 +0,0 @@
1
- export * from './fourOhFour';
@@ -1,68 +0,0 @@
1
- import express from 'express';
2
- import multer from 'multer';
3
- import { reportError, geminiFileUpload, reportDebug } from 'utils';
4
- import { checkEnvironment } from 'utils/checkEnvironment';
5
- import { envAssert } from 'utils/envAssert';
6
-
7
- const namespace = 'engine:middleware:geminiFileUploader';
8
- const storage = multer.memoryStorage();
9
-
10
- export async function geminiFileUploader(
11
- req: express.Request,
12
- res: express.Response,
13
- next: express.NextFunction
14
- ): Promise<void> {
15
- try {
16
- checkEnvironment({
17
- GOOGLE_AI_KEY: envAssert.isString()
18
- });
19
- // Use multer.single() inside the middleware
20
- const uploadSingle = multer({ storage }).single('file');
21
-
22
- uploadSingle(req, res, async (err) => {
23
- if (err) {
24
- reportError(`Error uploading file`);
25
- next(err);
26
- return;
27
- }
28
-
29
- const file = req.file;
30
- if (!file) {
31
- reportError(`No file uploaded`);
32
- next(`No file uploaded`);
33
- return;
34
- }
35
- const mimeType = file.mimetype;
36
-
37
- reportDebug({
38
- namespace,
39
- message: 'Upload to Gemini AI',
40
- data: {
41
- hasBuffer: !!file.buffer,
42
- mimeType,
43
- originalFileName: file.originalname
44
- }
45
- });
46
-
47
- const fileResponse = await geminiFileUpload(
48
- file.buffer,
49
- mimeType,
50
- file.originalname
51
- );
52
-
53
- reportDebug({
54
- namespace,
55
- message: 'File Uploaded to Gemini AI',
56
- data: fileResponse
57
- });
58
-
59
- req.body.file = fileResponse;
60
-
61
- next();
62
- });
63
- } catch (error) {
64
- console.error(error);
65
- reportError(`Failed to upload or process file`);
66
- next(error);
67
- }
68
- }
@@ -1 +0,0 @@
1
- export * from './geminiFileUploader';
@@ -1,12 +0,0 @@
1
- import express from 'express';
2
- import request from 'supertest';
3
- import { healthCheck } from './healthCheck';
4
-
5
- describe('Middleware - healthCheck', () => {
6
- it('default healtcheck route', async () => {
7
- const app = express();
8
- app.use(healthCheck());
9
- await request(app).get('/').expect(200);
10
- await request(app).get('/heartbeat').expect(200);
11
- });
12
- });
@@ -1,14 +0,0 @@
1
- import { Router, Request, Response } from 'express';
2
-
3
- /**
4
- * respond to Kubernetes health-checks with 200
5
- */
6
- export function healthCheck(path = '/heartbeat'): Router {
7
- return Router()
8
- .get('/', (req: Request, res: Response) => {
9
- res.sendStatus(200);
10
- })
11
- .get(path, (req: Request, res: Response) => {
12
- res.sendStatus(200);
13
- });
14
- }
@@ -1 +0,0 @@
1
- export * from './healthCheck';
@@ -1,17 +0,0 @@
1
- export * from './error';
2
- export * from './healthCheck';
3
- export * from './validate';
4
- export * from './fourOhFour';
5
- export * from './authJwt';
6
- export * from './authHmac';
7
- export * from './authStatic';
8
- export * from './swaggerDocs';
9
- export * from './authTls';
10
- export * from './userResolver';
11
- export * from './fileUploader';
12
- export * from './metrics';
13
- export * from './requestMetrics';
14
- export * from './version';
15
- export * from './geminiFileUploader';
16
- export * from './checkPermission';
17
- export * from './multiPartFileUploader';
@@ -1 +0,0 @@
1
- export * from './metrics';
@@ -1,46 +0,0 @@
1
- import { expect } from 'chai';
2
- import express from 'express';
3
- import { Counter } from 'prom-client';
4
- import request from 'supertest';
5
- import { metrics } from './metrics';
6
- import { serviceRegistry, instanceRegistry } from 'const/metrics';
7
-
8
- describe('Middleware - metrics', () => {
9
- beforeEach(() => {
10
- instanceRegistry.clear();
11
- serviceRegistry.clear();
12
- });
13
-
14
- it('should export instance metrics', async () => {
15
- new Counter({
16
- name: 'instance_test',
17
- help: 'instance_test',
18
- registers: [instanceRegistry]
19
- });
20
-
21
- const app = express();
22
- app.use(metrics());
23
-
24
- const { text } = await request(app).get('/metrics/instance').expect(200);
25
- expect(text).to.equal(
26
- '# HELP instance_test instance_test\n# TYPE instance_test counter\ninstance_test 0\n'
27
- );
28
- });
29
-
30
- it('should export service metrics', async () => {
31
- new Counter({
32
- name: 'service_test',
33
- help: 'service_test',
34
- registers: [serviceRegistry]
35
- });
36
-
37
- const app = express();
38
- app.use(metrics());
39
-
40
- const { text } = await request(app).get('/metrics/service').expect(200);
41
-
42
- expect(text).to.equal(
43
- '# HELP service_test service_test\n# TYPE service_test counter\nservice_test 0\n'
44
- );
45
- });
46
- });
@@ -1,24 +0,0 @@
1
- import { Router, Request, Response } from 'express';
2
- import { instanceRegistry, serviceRegistry } from 'const/metrics';
3
- import { reportError } from 'utils/report';
4
-
5
- /** Middleware that calculates request time, and exposes metrics related to requests processed by this service */
6
- export function metrics(): Router {
7
- return Router()
8
- .use('/metrics/instance', (req: Request, res: Response) => {
9
- (async (): Promise<void> => {
10
- res.set('Content-Type', instanceRegistry.contentType);
11
- res.end(await instanceRegistry.metrics());
12
- })().catch((error: Error) => {
13
- reportError(error);
14
- });
15
- })
16
- .use('/metrics/service', (req: Request, res: Response) => {
17
- (async (): Promise<void> => {
18
- res.set('Content-Type', serviceRegistry.contentType);
19
- res.end(await serviceRegistry.metrics());
20
- })().catch((error: Error) => {
21
- reportError(error);
22
- });
23
- });
24
- }
@@ -1,2 +0,0 @@
1
- export * from './multiPartFileUploader';
2
- export * from './multiPartFileUploader.types';