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.
- package/.commitlintrc.js +27 -0
- package/.releaserc.js +56 -0
- package/README.md +154 -2
- package/dist/const/tokenIssuer.js +1 -0
- package/dist/const/tokenIssuer.js.map +1 -1
- package/dist/db/models/SequelizeMeta.js +3 -1
- package/dist/db/models/SequelizeMeta.js.map +1 -1
- package/dist/entities/ElasticSearch/ElasticSearch.js +1 -2
- package/dist/entities/ElasticSearch/ElasticSearch.js.map +1 -1
- package/dist/entities/SocketClient/SocketClient.js +1 -0
- package/dist/entities/SocketClient/SocketClient.js.map +1 -1
- package/dist/index.js +1 -2
- package/dist/index.js.map +1 -1
- package/dist/middleware/checkPermission/checkPermission.d.ts +1 -1
- package/dist/middleware/checkPermission/checkPermission.js +4 -2
- package/dist/middleware/checkPermission/checkPermission.js.map +1 -1
- package/dist/utils/createHttpServer/createHttpServer.js +1 -1
- package/dist/utils/createHttpServer/createHttpServer.js.map +1 -1
- package/dist/utils/jwt/jwt.js +1 -1
- package/dist/utils/jwt/jwt.js.map +1 -1
- package/dist/utils/semverCompare/semverCompare.js +1 -5
- package/dist/utils/semverCompare/semverCompare.js.map +1 -1
- package/package.json +30 -19
- package/.env.example +0 -186
- package/.github/workflows/publish.yml +0 -41
- package/.prettierrc +0 -7
- package/Dockerfile +0 -31
- package/babel.config.json +0 -34
- package/eslint.config.mjs +0 -11
- package/src/const/DebeziumEvent.ts +0 -6
- package/src/const/LogSeverity.ts +0 -7
- package/src/const/index.ts +0 -5
- package/src/const/metrics.ts +0 -6
- package/src/const/mime.ts +0 -37
- package/src/const/tokenIssuer.ts +0 -7
- package/src/db/migrations/20241030121500-create-sequelize-meta-table.ts +0 -29
- package/src/db/models/SequelizeMeta.ts +0 -16
- package/src/db/models/index.ts +0 -2
- package/src/entities/ElasticSearch/ElasticSearch.ts +0 -103
- package/src/entities/ElasticSearch/ElasticSearch.types.ts +0 -7
- package/src/entities/ElasticSearch/index.ts +0 -2
- package/src/entities/Endpoint/Endpoint.test.ts +0 -248
- package/src/entities/Endpoint/Endpoint.ts +0 -221
- package/src/entities/Endpoint/Endpoint.types.ts +0 -181
- package/src/entities/Endpoint/index.ts +0 -2
- package/src/entities/EngineError/EngineError.ts +0 -28
- package/src/entities/EngineError/EngineError.types.ts +0 -15
- package/src/entities/EngineError/index.ts +0 -2
- package/src/entities/KeySet/KeySet.test.ts +0 -126
- package/src/entities/KeySet/KeySet.ts +0 -172
- package/src/entities/KeySet/KeySet.types.ts +0 -28
- package/src/entities/KeySet/index.ts +0 -2
- package/src/entities/LifecycleController/LifecycleController.test.ts +0 -48
- package/src/entities/LifecycleController/LifecycleController.ts +0 -24
- package/src/entities/LifecycleController/LifecycleController.types.ts +0 -5
- package/src/entities/LifecycleController/index.ts +0 -2
- package/src/entities/Localizator/Localizator.ts +0 -139
- package/src/entities/Localizator/Localizator.types.ts +0 -52
- package/src/entities/Localizator/guessNamingConvention/guessNamingConvention.test.ts +0 -165
- package/src/entities/Localizator/guessNamingConvention/guessNamingConvention.ts +0 -58
- package/src/entities/Localizator/guessNamingConvention/index.ts +0 -1
- package/src/entities/Localizator/index.ts +0 -2
- package/src/entities/MessageHandler/MessageHandler.test.ts +0 -130
- package/src/entities/MessageHandler/MessageHandler.ts +0 -72
- package/src/entities/MessageHandler/MessageHandler.types.ts +0 -15
- package/src/entities/MessageHandler/index.ts +0 -2
- package/src/entities/PubSub/PubSub.test.ts +0 -297
- package/src/entities/PubSub/PubSub.ts +0 -202
- package/src/entities/PubSub/PubSub.types.ts +0 -76
- package/src/entities/PubSub/handleMessage/handleMessage.test.ts +0 -102
- package/src/entities/PubSub/handleMessage/handleMessage.ts +0 -65
- package/src/entities/PubSub/handleMessage/index.ts +0 -1
- package/src/entities/PubSub/index.ts +0 -2
- package/src/entities/PushNotification/PushNotification.test.ts +0 -35
- package/src/entities/PushNotification/PushNotification.ts +0 -44
- package/src/entities/PushNotification/PushNotification.types.ts +0 -25
- package/src/entities/PushNotification/index.ts +0 -2
- package/src/entities/Redis/Redis.ts +0 -71
- package/src/entities/Redis/Redis.types.ts +0 -19
- package/src/entities/Redis/Redis.validate.ts +0 -17
- package/src/entities/Redis/index.ts +0 -2
- package/src/entities/Sequelize/Sequelize.config.ts +0 -59
- package/src/entities/Sequelize/Sequelize.test.ts +0 -21
- package/src/entities/Sequelize/Sequelize.ts +0 -75
- package/src/entities/Sequelize/Sequelize.types.ts +0 -10
- package/src/entities/Sequelize/Sequelize.validate.ts +0 -15
- package/src/entities/Sequelize/index.ts +0 -2
- package/src/entities/Server/Server.const.ts +0 -56
- package/src/entities/Server/Server.test.ts +0 -272
- package/src/entities/Server/Server.ts +0 -471
- package/src/entities/Server/Server.types.ts +0 -88
- package/src/entities/Server/index.ts +0 -2
- package/src/entities/SocketClient/SocketClient.test.ts +0 -392
- package/src/entities/SocketClient/SocketClient.ts +0 -401
- package/src/entities/SocketClient/SocketClient.types.ts +0 -62
- package/src/entities/SocketClient/index.ts +0 -2
- package/src/entities/SocketClient/parseMessage/index.ts +0 -1
- package/src/entities/SocketClient/parseMessage/parseMessage.test.ts +0 -20
- package/src/entities/SocketClient/parseMessage/parseMessage.ts +0 -26
- package/src/entities/Storage/Storage.test.ts +0 -58
- package/src/entities/Storage/Storage.ts +0 -219
- package/src/entities/Storage/Storage.types.ts +0 -57
- package/src/entities/Storage/index.ts +0 -2
- package/src/entities/ValidationError/ValidationError.ts +0 -34
- package/src/entities/ValidationError/index.ts +0 -1
- package/src/entities/WebError/WebError.test.ts +0 -18
- package/src/entities/WebError/WebError.ts +0 -23
- package/src/entities/WebError/WebError.types.ts +0 -9
- package/src/entities/WebError/index.ts +0 -2
- package/src/entities/index.ts +0 -16
- package/src/index.ts +0 -6
- package/src/metrics/debug.ts +0 -10
- package/src/metrics/index.ts +0 -2
- package/src/metrics/request.ts +0 -17
- package/src/middleware/authHmac/authHmac.test.ts +0 -86
- package/src/middleware/authHmac/authHmac.ts +0 -56
- package/src/middleware/authHmac/authHmac.types.ts +0 -7
- package/src/middleware/authHmac/index.ts +0 -2
- package/src/middleware/authJwt/authJwt.test.ts +0 -54
- package/src/middleware/authJwt/authJwt.ts +0 -55
- package/src/middleware/authJwt/authJwt.types.ts +0 -14
- package/src/middleware/authJwt/index.ts +0 -2
- package/src/middleware/authStatic/authStatic.test.ts +0 -36
- package/src/middleware/authStatic/authStatic.ts +0 -45
- package/src/middleware/authStatic/index.ts +0 -1
- package/src/middleware/authTls/authTls.test.ts +0 -138
- package/src/middleware/authTls/authTls.ts +0 -119
- package/src/middleware/authTls/authTls.types.ts +0 -13
- package/src/middleware/authTls/index.ts +0 -2
- package/src/middleware/checkPermission/checkPermission.ts +0 -33
- package/src/middleware/checkPermission/index.ts +0 -1
- package/src/middleware/error/error.test.ts +0 -60
- package/src/middleware/error/error.ts +0 -25
- package/src/middleware/error/index.ts +0 -1
- package/src/middleware/fileUploader/fileUploader.ts +0 -154
- package/src/middleware/fileUploader/fileUploader.types.ts +0 -35
- package/src/middleware/fileUploader/index.ts +0 -2
- package/src/middleware/fileUploader/isMultiPart/index.ts +0 -1
- package/src/middleware/fileUploader/isMultiPart/isMultipart.ts +0 -9
- package/src/middleware/fileUploader/validate/index.ts +0 -1
- package/src/middleware/fileUploader/validate/validate.ts +0 -27
- package/src/middleware/fourOhFour/fourOhFour.test.ts +0 -14
- package/src/middleware/fourOhFour/fourOhFour.ts +0 -13
- package/src/middleware/fourOhFour/index.ts +0 -1
- package/src/middleware/geminiFileUploader/geminiFileUploader.ts +0 -68
- package/src/middleware/geminiFileUploader/index.ts +0 -1
- package/src/middleware/healthCheck/healthCheck.test.ts +0 -12
- package/src/middleware/healthCheck/healthCheck.ts +0 -14
- package/src/middleware/healthCheck/index.ts +0 -1
- package/src/middleware/index.ts +0 -17
- package/src/middleware/metrics/index.ts +0 -1
- package/src/middleware/metrics/metrics.test.ts +0 -46
- package/src/middleware/metrics/metrics.ts +0 -24
- package/src/middleware/multiPartFileUploader/index.ts +0 -2
- package/src/middleware/multiPartFileUploader/multiPartFileUploader.ts +0 -249
- package/src/middleware/multiPartFileUploader/multiPartFileUploader.types.ts +0 -23
- package/src/middleware/multiPartFileUploader/validate/index.ts +0 -1
- package/src/middleware/multiPartFileUploader/validate/validate.ts +0 -27
- package/src/middleware/requestMetrics/index.ts +0 -1
- package/src/middleware/requestMetrics/requestMetrics.test.ts +0 -77
- package/src/middleware/requestMetrics/requestMetrics.ts +0 -20
- package/src/middleware/swaggerDocs/index.ts +0 -2
- package/src/middleware/swaggerDocs/swaggerDocs.ts +0 -114
- package/src/middleware/swaggerDocs/swaggerDocs.types.ts +0 -41
- package/src/middleware/userResolver/index.ts +0 -1
- package/src/middleware/userResolver/userResolver.ts +0 -53
- package/src/middleware/validate/index.ts +0 -1
- package/src/middleware/validate/validate.test.ts +0 -43
- package/src/middleware/validate/validate.ts +0 -25
- package/src/middleware/version/index.ts +0 -1
- package/src/middleware/version/version.test.ts +0 -23
- package/src/middleware/version/version.ts +0 -12
- package/src/utils/checkEnvironment/index.ts +0 -49
- package/src/utils/createHttpServer/createHttpServer.test.ts +0 -24
- package/src/utils/createHttpServer/createHttpServer.ts +0 -34
- package/src/utils/createHttpServer/createHttpServer.validate.ts +0 -17
- package/src/utils/createHttpServer/index.ts +0 -1
- package/src/utils/createSortedObject/createSortedObject.ts +0 -20
- package/src/utils/createSortedObject/createSortedObjet.test.ts +0 -47
- package/src/utils/createSortedObject/index.ts +0 -1
- package/src/utils/dbMigration/dbMigration.test.ts +0 -209
- package/src/utils/dbMigration/dbMigration.ts +0 -199
- package/src/utils/dbMigration/dbMigration.types.ts +0 -11
- package/src/utils/dbMigration/index.ts +0 -2
- package/src/utils/dbMigration/migrateMetadataTable/index.ts +0 -1
- package/src/utils/dbMigration/migrateMetadataTable/migrateMetadataTable.test.ts +0 -59
- package/src/utils/dbMigration/migrateMetadataTable/migrateMetadataTable.ts +0 -102
- package/src/utils/envAssert/envAssert.ts +0 -31
- package/src/utils/envAssert/index.ts +0 -1
- package/src/utils/envAssert/validators/hostList.ts +0 -17
- package/src/utils/envAssert/validators/index.ts +0 -5
- package/src/utils/envAssert/validators/ipList.ts +0 -13
- package/src/utils/envAssert/validators/path.ts +0 -13
- package/src/utils/envAssert/validators/string.ts +0 -9
- package/src/utils/envAssert/validators/stringList.ts +0 -13
- package/src/utils/filter/filter.ts +0 -17
- package/src/utils/filter/index.ts +0 -1
- package/src/utils/geminiFileUpload/geminiFileUpload.ts +0 -93
- package/src/utils/geminiFileUpload/index.ts +0 -1
- package/src/utils/hmac/checkEnv/checkEnv.test.ts +0 -18
- package/src/utils/hmac/checkEnv/checkEnv.ts +0 -9
- package/src/utils/hmac/checkEnv/index.ts +0 -1
- package/src/utils/hmac/createHmac/createHmac.ts +0 -33
- package/src/utils/hmac/createHmac/index.ts +0 -1
- package/src/utils/hmac/index.ts +0 -4
- package/src/utils/hmac/index.types.ts +0 -13
- package/src/utils/hmac/signPayload/index.ts +0 -1
- package/src/utils/hmac/signPayload/signPayload.ts +0 -16
- package/src/utils/hmac/verifySignature/index.ts +0 -1
- package/src/utils/hmac/verifySignature/verifySignature.ts +0 -24
- package/src/utils/index.ts +0 -29
- package/src/utils/jwt/index.ts +0 -2
- package/src/utils/jwt/jwt.test.ts +0 -28
- package/src/utils/jwt/jwt.ts +0 -182
- package/src/utils/jwt/jwt.types.ts +0 -21
- package/src/utils/report/index.ts +0 -3
- package/src/utils/report/output.ts +0 -45
- package/src/utils/report/output.types.ts +0 -70
- package/src/utils/report/report.test.ts +0 -133
- package/src/utils/report/report.ts +0 -133
- package/src/utils/report/report.types.ts +0 -13
- package/src/utils/request/index.ts +0 -1
- package/src/utils/request/request.test.ts +0 -26
- package/src/utils/request/request.ts +0 -48
- package/src/utils/secretManager/index.ts +0 -2
- package/src/utils/secretManager/secretLoader.ts +0 -62
- package/src/utils/secretManager/secretResolver.ts +0 -35
- package/src/utils/semverCompare/index.ts +0 -1
- package/src/utils/semverCompare/semverCompare.test.ts +0 -49
- package/src/utils/semverCompare/semverCompare.ts +0 -60
- package/src/utils/sendEmail/index.ts +0 -2
- package/src/utils/sendEmail/sendEmail.ts +0 -61
- package/src/utils/sendEmail/sendEmail.types.ts +0 -61
- package/src/utils/sendPush/index.ts +0 -2
- package/src/utils/sendPush/sendPush.ts +0 -20
- package/src/utils/sendPush/sendPush.types.ts +0 -25
- package/src/utils/tlsConfig/index.ts +0 -2
- package/src/utils/tlsConfig/tlsConfig.test.ts +0 -32
- package/src/utils/tlsConfig/tlsConfig.ts +0 -47
- package/src/utils/tlsConfig/tlsConfig.types.ts +0 -11
- package/src/utils/tlsConfig/tlsConfig.validate.ts +0 -25
- package/src/utils/tlsRequest/index.ts +0 -1
- package/src/utils/tlsRequest/tlsRequest.test.ts +0 -63
- package/src/utils/tlsRequest/tlsRequest.ts +0 -12
- package/src/utils/trimPathSlash/index.ts +0 -1
- package/src/utils/trimPathSlash/trimPathSlash.test.ts +0 -26
- package/src/utils/trimPathSlash/trimPathSlash.ts +0 -8
- package/test/env.ts +0 -53
- package/test/factory/index.ts +0 -8
- package/test/factory/sequelizeMeta.ts +0 -12
- package/test/hooks.ts +0 -35
- package/test/index.ts +0 -3
- package/test/stub/index.ts +0 -3
- package/test/stub/stubLocales.ts +0 -68
- package/test/stub/stubPubSub.ts +0 -7
- package/test/stub/stubStorage.ts +0 -77
- package/test/stub/stubStorage.types.ts +0 -11
- package/test/utils/app.ts +0 -31
- package/test/utils/index.ts +0 -1
- package/tsconfig.build.json +0 -5
- 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 +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';
|
package/src/middleware/index.ts
DELETED
|
@@ -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
|
-
}
|