node-server-engine 1.1.2 → 1.1.3
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/.env.example +193 -193
- package/.mocharc.js +13 -13
- package/.nycrc +18 -18
- package/.prettierrc +7 -7
- package/Dockerfile +30 -30
- package/README.md +991 -1025
- package/babel.config.json +35 -35
- package/dist/const/DebeziumEvent.js.map +1 -1
- package/dist/const/LogSeverity.js.map +1 -1
- package/dist/const/index.js.map +1 -1
- package/dist/const/metrics.js.map +1 -1
- package/dist/const/mime.js.map +1 -1
- package/dist/const/tokenIssuer.js.map +1 -1
- package/dist/db/migrations/20241030121500-create-sequelize-meta-table.js.map +1 -1
- package/dist/db/models/SequelizeMeta.js.map +1 -1
- package/dist/db/models/index.js.map +1 -1
- package/dist/entities/ElasticSearch/ElasticSearch.js +7 -7
- package/dist/entities/ElasticSearch/ElasticSearch.js.map +1 -1
- package/dist/entities/ElasticSearch/ElasticSearch.types.js.map +1 -1
- package/dist/entities/ElasticSearch/index.js.map +1 -1
- package/dist/entities/Endpoint/Endpoint.js +8 -8
- package/dist/entities/Endpoint/Endpoint.js.map +1 -1
- package/dist/entities/Endpoint/Endpoint.types.js.map +1 -1
- package/dist/entities/Endpoint/index.js.map +1 -1
- package/dist/entities/EngineError/EngineError.js +2 -2
- package/dist/entities/EngineError/EngineError.js.map +1 -1
- package/dist/entities/EngineError/EngineError.types.js.map +1 -1
- package/dist/entities/EngineError/index.js.map +1 -1
- package/dist/entities/KeySet/KeySet.js +3 -3
- package/dist/entities/KeySet/KeySet.js.map +1 -1
- package/dist/entities/KeySet/KeySet.types.js.map +1 -1
- package/dist/entities/KeySet/index.js.map +1 -1
- package/dist/entities/LifecycleController/LifecycleController.js.map +1 -1
- package/dist/entities/LifecycleController/LifecycleController.types.js.map +1 -1
- package/dist/entities/LifecycleController/index.js.map +1 -1
- package/dist/entities/Localizator/Localizator.js +7 -7
- package/dist/entities/Localizator/Localizator.js.map +1 -1
- package/dist/entities/Localizator/Localizator.types.js.map +1 -1
- package/dist/entities/Localizator/guessNamingConvention/guessNamingConvention.js.map +1 -1
- package/dist/entities/Localizator/guessNamingConvention/index.js.map +1 -1
- package/dist/entities/Localizator/index.js.map +1 -1
- package/dist/entities/MessageHandler/MessageHandler.js +2 -2
- package/dist/entities/MessageHandler/MessageHandler.js.map +1 -1
- package/dist/entities/MessageHandler/MessageHandler.types.js.map +1 -1
- package/dist/entities/MessageHandler/index.js.map +1 -1
- package/dist/entities/PubSub/PubSub.js +25 -25
- package/dist/entities/PubSub/PubSub.js.map +1 -1
- package/dist/entities/PubSub/PubSub.types.js.map +1 -1
- package/dist/entities/PubSub/handleMessage/handleMessage.js +6 -6
- package/dist/entities/PubSub/handleMessage/handleMessage.js.map +1 -1
- package/dist/entities/PubSub/handleMessage/index.js.map +1 -1
- package/dist/entities/PubSub/index.js.map +1 -1
- package/dist/entities/PushNotification/PushNotification.js +4 -4
- package/dist/entities/PushNotification/PushNotification.js.map +1 -1
- package/dist/entities/PushNotification/PushNotification.types.js.map +1 -1
- package/dist/entities/PushNotification/index.js.map +1 -1
- package/dist/entities/Redis/Redis.js +8 -8
- package/dist/entities/Redis/Redis.js.map +1 -1
- package/dist/entities/Redis/Redis.types.js.map +1 -1
- package/dist/entities/Redis/Redis.validate.js +2 -2
- package/dist/entities/Redis/Redis.validate.js.map +1 -1
- package/dist/entities/Redis/index.js.map +1 -1
- package/dist/entities/Sequelize/Sequelize.config.js +42 -2
- package/dist/entities/Sequelize/Sequelize.config.js.map +1 -1
- package/dist/entities/Sequelize/Sequelize.js +3 -3
- package/dist/entities/Sequelize/Sequelize.js.map +1 -1
- package/dist/entities/Sequelize/Sequelize.types.js.map +1 -1
- package/dist/entities/Sequelize/Sequelize.validate.js +2 -2
- package/dist/entities/Sequelize/Sequelize.validate.js.map +1 -1
- package/dist/entities/Sequelize/index.js.map +1 -1
- package/dist/entities/Server/Server.const.js.map +1 -1
- package/dist/entities/Server/Server.js +2 -2
- package/dist/entities/Server/Server.js.map +1 -1
- package/dist/entities/Server/Server.types.js.map +1 -1
- package/dist/entities/Server/index.js.map +1 -1
- package/dist/entities/SocketClient/SocketClient.js +15 -15
- package/dist/entities/SocketClient/SocketClient.js.map +1 -1
- package/dist/entities/SocketClient/SocketClient.types.js.map +1 -1
- package/dist/entities/SocketClient/index.js.map +1 -1
- package/dist/entities/SocketClient/parseMessage/index.js.map +1 -1
- package/dist/entities/SocketClient/parseMessage/parseMessage.js +2 -2
- package/dist/entities/SocketClient/parseMessage/parseMessage.js.map +1 -1
- package/dist/entities/Storage/Storage.js +20 -20
- package/dist/entities/Storage/Storage.js.map +1 -1
- package/dist/entities/Storage/Storage.types.js.map +1 -1
- package/dist/entities/Storage/index.js.map +1 -1
- package/dist/entities/ValidationError/ValidationError.js.map +1 -1
- package/dist/entities/ValidationError/index.js.map +1 -1
- package/dist/entities/WebError/WebError.js +4 -4
- package/dist/entities/WebError/WebError.js.map +1 -1
- package/dist/entities/WebError/WebError.types.js.map +1 -1
- package/dist/entities/WebError/index.js.map +1 -1
- package/dist/entities/index.js.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/metrics/debug.js.map +1 -1
- package/dist/metrics/index.js.map +1 -1
- package/dist/metrics/request.js.map +1 -1
- package/dist/middleware/authAdmin/authAdmin.js.map +1 -1
- package/dist/middleware/authAdmin/authAdmin.types.js.map +1 -1
- package/dist/middleware/authAdmin/index.js.map +1 -1
- package/dist/middleware/authHmac/authHmac.js.map +1 -1
- package/dist/middleware/authHmac/authHmac.types.js.map +1 -1
- package/dist/middleware/authHmac/index.js.map +1 -1
- package/dist/middleware/authJwt/authJwt.js.map +1 -1
- package/dist/middleware/authJwt/authJwt.types.js.map +1 -1
- package/dist/middleware/authJwt/index.js.map +1 -1
- package/dist/middleware/authStatic/authStatic.js +3 -3
- package/dist/middleware/authStatic/authStatic.js.map +1 -1
- package/dist/middleware/authStatic/index.js.map +1 -1
- package/dist/middleware/authTls/authTls.js +8 -8
- package/dist/middleware/authTls/authTls.js.map +1 -1
- package/dist/middleware/authTls/authTls.types.js.map +1 -1
- package/dist/middleware/authTls/index.js.map +1 -1
- package/dist/middleware/checkPermission/checkPermission.js.map +1 -1
- package/dist/middleware/error/error.js.map +1 -1
- package/dist/middleware/error/index.js.map +1 -1
- package/dist/middleware/fileUploader/compressAvatar/compressAvatar.js +2 -2
- package/dist/middleware/fileUploader/compressAvatar/compressAvatar.js.map +1 -1
- package/dist/middleware/fileUploader/compressAvatar/compressAvatar.types.js.map +1 -1
- package/dist/middleware/fileUploader/compressAvatar/index.js.map +1 -1
- package/dist/middleware/fileUploader/fileUploader.js +12 -12
- package/dist/middleware/fileUploader/fileUploader.js.map +1 -1
- package/dist/middleware/fileUploader/fileUploader.types.js.map +1 -1
- package/dist/middleware/fileUploader/index.js.map +1 -1
- package/dist/middleware/fileUploader/isMultiPart/index.js.map +1 -1
- package/dist/middleware/fileUploader/isMultiPart/isMultipart.js.map +1 -1
- package/dist/middleware/fileUploader/validate/index.js.map +1 -1
- package/dist/middleware/fileUploader/validate/validate.js.map +1 -1
- package/dist/middleware/fourOhFour/fourOhFour.js.map +1 -1
- package/dist/middleware/fourOhFour/index.js.map +1 -1
- package/dist/middleware/geminiFileUploader/geminiFileUploader.js.map +1 -1
- package/dist/middleware/geminiFileUploader/index.js.map +1 -1
- package/dist/middleware/healthCheck/healthCheck.js +2 -2
- package/dist/middleware/healthCheck/healthCheck.js.map +1 -1
- package/dist/middleware/healthCheck/index.js.map +1 -1
- package/dist/middleware/index.js.map +1 -1
- package/dist/middleware/metrics/index.js.map +1 -1
- package/dist/middleware/metrics/metrics.js.map +1 -1
- package/dist/middleware/requestMetrics/index.js.map +1 -1
- package/dist/middleware/requestMetrics/requestMetrics.js.map +1 -1
- package/dist/middleware/swaggerDocs/index.js.map +1 -1
- package/dist/middleware/swaggerDocs/swaggerDocs.js +7 -7
- package/dist/middleware/swaggerDocs/swaggerDocs.js.map +1 -1
- package/dist/middleware/swaggerDocs/swaggerDocs.types.js.map +1 -1
- package/dist/middleware/userResolver/index.js.map +1 -1
- package/dist/middleware/userResolver/userResolver.js.map +1 -1
- package/dist/middleware/validate/index.js.map +1 -1
- package/dist/middleware/validate/validate.js.map +1 -1
- package/dist/middleware/version/index.js.map +1 -1
- package/dist/middleware/version/version.js +3 -3
- package/dist/middleware/version/version.js.map +1 -1
- package/dist/utils/checkEnvironment/index.js +13 -13
- package/dist/utils/checkEnvironment/index.js.map +1 -1
- package/dist/utils/createHttpServer/createHttpServer.js.map +1 -1
- package/dist/utils/createHttpServer/createHttpServer.validate.js +2 -2
- package/dist/utils/createHttpServer/createHttpServer.validate.js.map +1 -1
- package/dist/utils/createHttpServer/index.js.map +1 -1
- package/dist/utils/createSortedObject/createSortedObject.js.map +1 -1
- package/dist/utils/createSortedObject/index.js.map +1 -1
- package/dist/utils/dbMigration/dbMigration.js +8 -8
- package/dist/utils/dbMigration/dbMigration.js.map +1 -1
- package/dist/utils/dbMigration/dbMigration.types.js.map +1 -1
- package/dist/utils/dbMigration/index.js.map +1 -1
- package/dist/utils/dbMigration/migrateMetadataTable/index.js.map +1 -1
- package/dist/utils/dbMigration/migrateMetadataTable/migrateMetadataTable.d.ts +2 -2
- package/dist/utils/dbMigration/migrateMetadataTable/migrateMetadataTable.js +47 -15
- package/dist/utils/dbMigration/migrateMetadataTable/migrateMetadataTable.js.map +1 -1
- package/dist/utils/envAssert/envAssert.js +6 -6
- package/dist/utils/envAssert/envAssert.js.map +1 -1
- package/dist/utils/envAssert/index.js.map +1 -1
- package/dist/utils/envAssert/validators/hostList.js +2 -2
- package/dist/utils/envAssert/validators/hostList.js.map +1 -1
- package/dist/utils/envAssert/validators/index.js.map +1 -1
- package/dist/utils/envAssert/validators/ipList.js +2 -2
- package/dist/utils/envAssert/validators/ipList.js.map +1 -1
- package/dist/utils/envAssert/validators/path.js +2 -2
- package/dist/utils/envAssert/validators/path.js.map +1 -1
- package/dist/utils/envAssert/validators/string.js +2 -2
- package/dist/utils/envAssert/validators/string.js.map +1 -1
- package/dist/utils/envAssert/validators/stringList.js +3 -3
- package/dist/utils/envAssert/validators/stringList.js.map +1 -1
- package/dist/utils/filter/filter.js +4 -4
- package/dist/utils/filter/filter.js.map +1 -1
- package/dist/utils/filter/index.js.map +1 -1
- package/dist/utils/getDynamicLink/getDynamicLink.js.map +1 -1
- package/dist/utils/getDynamicLink/getDynamicLink.types.js.map +1 -1
- package/dist/utils/getDynamicLink/getDynamicLink.validate.js.map +1 -1
- package/dist/utils/getDynamicLink/index.js.map +1 -1
- package/dist/utils/hmac/checkEnv/checkEnv.js +2 -2
- package/dist/utils/hmac/checkEnv/checkEnv.js.map +1 -1
- package/dist/utils/hmac/checkEnv/index.js.map +1 -1
- package/dist/utils/hmac/createHmac/createHmac.js.map +1 -1
- package/dist/utils/hmac/createHmac/index.js.map +1 -1
- package/dist/utils/hmac/index.js.map +1 -1
- package/dist/utils/hmac/index.types.js.map +1 -1
- package/dist/utils/hmac/signPayload/index.js.map +1 -1
- package/dist/utils/hmac/signPayload/signPayload.js.map +1 -1
- package/dist/utils/hmac/verifySignature/index.js.map +1 -1
- package/dist/utils/hmac/verifySignature/verifySignature.js.map +1 -1
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/jwt/index.js.map +1 -1
- package/dist/utils/jwt/jwt.js.map +1 -1
- package/dist/utils/jwt/jwt.types.js.map +1 -1
- package/dist/utils/report/index.js.map +1 -1
- package/dist/utils/report/output.js.map +1 -1
- package/dist/utils/report/output.types.js.map +1 -1
- package/dist/utils/report/report.js.map +1 -1
- package/dist/utils/report/report.types.js.map +1 -1
- package/dist/utils/request/index.js.map +1 -1
- package/dist/utils/request/request.js.map +1 -1
- package/dist/utils/semverCompare/index.js.map +1 -1
- package/dist/utils/semverCompare/semverCompare.js +5 -5
- package/dist/utils/semverCompare/semverCompare.js.map +1 -1
- package/dist/utils/sendEmail/index.js.map +1 -1
- package/dist/utils/sendEmail/sendEmail.js +8 -8
- package/dist/utils/sendEmail/sendEmail.js.map +1 -1
- package/dist/utils/sendEmail/sendEmail.types.js.map +1 -1
- package/dist/utils/sendPush/index.js.map +1 -1
- package/dist/utils/sendPush/sendPush.js +5 -5
- package/dist/utils/sendPush/sendPush.js.map +1 -1
- package/dist/utils/sendPush/sendPush.types.js.map +1 -1
- package/dist/utils/tlsConfig/index.js.map +1 -1
- package/dist/utils/tlsConfig/tlsConfig.js +2 -2
- package/dist/utils/tlsConfig/tlsConfig.js.map +1 -1
- package/dist/utils/tlsConfig/tlsConfig.types.js.map +1 -1
- package/dist/utils/tlsConfig/tlsConfig.validate.js +2 -2
- package/dist/utils/tlsConfig/tlsConfig.validate.js.map +1 -1
- package/dist/utils/tlsRequest/index.js.map +1 -1
- package/dist/utils/tlsRequest/tlsRequest.js.map +1 -1
- package/dist/utils/trimPathSlash/index.js.map +1 -1
- package/dist/utils/trimPathSlash/trimPathSlash.js +4 -4
- package/dist/utils/trimPathSlash/trimPathSlash.js.map +1 -1
- package/eslint.config.mjs +11 -11
- package/package.json +164 -161
- package/src/const/DebeziumEvent.ts +6 -6
- package/src/const/LogSeverity.ts +7 -7
- package/src/const/index.ts +5 -5
- package/src/const/metrics.ts +6 -6
- package/src/const/mime.ts +37 -37
- package/src/const/tokenIssuer.ts +9 -9
- package/src/db/migrations/20241030121500-create-sequelize-meta-table.ts +29 -29
- package/src/db/models/SequelizeMeta.ts +16 -16
- package/src/db/models/index.ts +2 -2
- package/src/entities/ElasticSearch/ElasticSearch.ts +103 -103
- package/src/entities/ElasticSearch/ElasticSearch.types.ts +7 -7
- package/src/entities/ElasticSearch/index.ts +2 -2
- package/src/entities/Endpoint/Endpoint.test.ts +337 -337
- package/src/entities/Endpoint/Endpoint.ts +202 -202
- package/src/entities/Endpoint/Endpoint.types.ts +205 -205
- package/src/entities/Endpoint/index.ts +2 -2
- package/src/entities/EngineError/EngineError.ts +28 -28
- package/src/entities/EngineError/EngineError.types.ts +15 -15
- package/src/entities/EngineError/index.ts +2 -2
- package/src/entities/KeySet/KeySet.test.ts +126 -126
- package/src/entities/KeySet/KeySet.ts +172 -172
- package/src/entities/KeySet/KeySet.types.ts +28 -28
- package/src/entities/KeySet/index.ts +2 -2
- package/src/entities/LifecycleController/LifecycleController.test.ts +48 -48
- package/src/entities/LifecycleController/LifecycleController.ts +24 -24
- package/src/entities/LifecycleController/LifecycleController.types.ts +5 -5
- package/src/entities/LifecycleController/index.ts +2 -2
- package/src/entities/Localizator/Localizator.ts +139 -139
- package/src/entities/Localizator/Localizator.types.ts +52 -52
- package/src/entities/Localizator/guessNamingConvention/guessNamingConvention.test.ts +165 -165
- package/src/entities/Localizator/guessNamingConvention/guessNamingConvention.ts +58 -58
- package/src/entities/Localizator/guessNamingConvention/index.ts +1 -1
- package/src/entities/Localizator/index.ts +2 -2
- package/src/entities/MessageHandler/MessageHandler.test.ts +130 -130
- package/src/entities/MessageHandler/MessageHandler.ts +72 -72
- package/src/entities/MessageHandler/MessageHandler.types.ts +15 -15
- package/src/entities/MessageHandler/index.ts +2 -2
- package/src/entities/PubSub/PubSub.test.ts +297 -297
- package/src/entities/PubSub/PubSub.ts +202 -202
- package/src/entities/PubSub/PubSub.types.ts +76 -76
- package/src/entities/PubSub/handleMessage/handleMessage.test.ts +102 -102
- package/src/entities/PubSub/handleMessage/handleMessage.ts +65 -65
- package/src/entities/PubSub/handleMessage/index.ts +1 -1
- package/src/entities/PubSub/index.ts +2 -2
- package/src/entities/PushNotification/PushNotification.test.ts +35 -35
- package/src/entities/PushNotification/PushNotification.ts +44 -44
- package/src/entities/PushNotification/PushNotification.types.ts +25 -25
- package/src/entities/PushNotification/index.ts +2 -2
- package/src/entities/Redis/Redis.ts +71 -71
- package/src/entities/Redis/Redis.types.ts +19 -19
- package/src/entities/Redis/Redis.validate.ts +17 -17
- package/src/entities/Redis/index.ts +2 -2
- package/src/entities/Sequelize/Sequelize.config.ts +59 -29
- package/src/entities/Sequelize/Sequelize.test.ts +21 -21
- package/src/entities/Sequelize/Sequelize.ts +75 -75
- package/src/entities/Sequelize/Sequelize.types.ts +10 -10
- package/src/entities/Sequelize/Sequelize.validate.ts +15 -15
- package/src/entities/Sequelize/index.ts +2 -2
- package/src/entities/Server/Server.const.ts +56 -56
- package/src/entities/Server/Server.test.ts +272 -272
- package/src/entities/Server/Server.ts +445 -445
- package/src/entities/Server/Server.types.ts +88 -88
- package/src/entities/Server/index.ts +2 -2
- package/src/entities/SocketClient/SocketClient.test.ts +392 -392
- package/src/entities/SocketClient/SocketClient.ts +401 -401
- package/src/entities/SocketClient/SocketClient.types.ts +62 -62
- package/src/entities/SocketClient/index.ts +2 -2
- package/src/entities/SocketClient/parseMessage/index.ts +1 -1
- package/src/entities/SocketClient/parseMessage/parseMessage.test.ts +20 -20
- package/src/entities/SocketClient/parseMessage/parseMessage.ts +26 -26
- package/src/entities/Storage/Storage.test.ts +58 -58
- package/src/entities/Storage/Storage.ts +219 -219
- package/src/entities/Storage/Storage.types.ts +57 -57
- package/src/entities/Storage/index.ts +2 -2
- package/src/entities/ValidationError/ValidationError.ts +34 -34
- package/src/entities/ValidationError/index.ts +1 -1
- package/src/entities/WebError/WebError.test.ts +18 -18
- package/src/entities/WebError/WebError.ts +23 -23
- package/src/entities/WebError/WebError.types.ts +9 -9
- package/src/entities/WebError/index.ts +2 -2
- package/src/entities/index.ts +16 -16
- package/src/index.ts +4 -4
- package/src/metrics/debug.ts +10 -10
- package/src/metrics/index.ts +2 -2
- package/src/metrics/request.ts +17 -17
- package/src/middleware/authAdmin/authAdmin.test.ts +199 -199
- package/src/middleware/authAdmin/authAdmin.ts +114 -114
- package/src/middleware/authAdmin/authAdmin.types.ts +19 -19
- package/src/middleware/authAdmin/index.ts +2 -2
- package/src/middleware/authHmac/authHmac.test.ts +86 -86
- package/src/middleware/authHmac/authHmac.ts +56 -56
- package/src/middleware/authHmac/authHmac.types.ts +7 -7
- package/src/middleware/authHmac/index.ts +2 -2
- package/src/middleware/authJwt/authJwt.test.ts +54 -54
- package/src/middleware/authJwt/authJwt.ts +55 -55
- package/src/middleware/authJwt/authJwt.types.ts +14 -14
- package/src/middleware/authJwt/index.ts +2 -2
- package/src/middleware/authStatic/authStatic.test.ts +36 -36
- package/src/middleware/authStatic/authStatic.ts +45 -45
- package/src/middleware/authStatic/index.ts +1 -1
- package/src/middleware/authTls/authTls.test.ts +138 -138
- package/src/middleware/authTls/authTls.ts +106 -106
- package/src/middleware/authTls/authTls.types.ts +13 -13
- package/src/middleware/authTls/index.ts +2 -2
- package/src/middleware/checkPermission/checkPermission.ts +32 -32
- package/src/middleware/error/error.test.ts +60 -60
- package/src/middleware/error/error.ts +25 -25
- package/src/middleware/error/index.ts +1 -1
- package/src/middleware/fileUploader/compressAvatar/compressAvatar.ts +25 -25
- package/src/middleware/fileUploader/compressAvatar/compressAvatar.types.ts +12 -12
- package/src/middleware/fileUploader/compressAvatar/index.ts +2 -2
- package/src/middleware/fileUploader/fileUploader.test.ts +310 -310
- package/src/middleware/fileUploader/fileUploader.ts +303 -303
- package/src/middleware/fileUploader/fileUploader.types.ts +52 -52
- package/src/middleware/fileUploader/index.ts +2 -2
- package/src/middleware/fileUploader/isMultiPart/index.ts +1 -1
- package/src/middleware/fileUploader/isMultiPart/isMultipart.ts +9 -9
- package/src/middleware/fileUploader/validate/index.ts +1 -1
- package/src/middleware/fileUploader/validate/validate.ts +27 -27
- package/src/middleware/fourOhFour/fourOhFour.test.ts +14 -14
- package/src/middleware/fourOhFour/fourOhFour.ts +13 -13
- package/src/middleware/fourOhFour/index.ts +1 -1
- package/src/middleware/geminiFileUploader/geminiFileUploader.ts +117 -117
- package/src/middleware/geminiFileUploader/index.ts +1 -1
- package/src/middleware/healthCheck/healthCheck.test.ts +12 -12
- package/src/middleware/healthCheck/healthCheck.ts +14 -14
- package/src/middleware/healthCheck/index.ts +1 -1
- package/src/middleware/index.ts +17 -17
- package/src/middleware/metrics/index.ts +1 -1
- package/src/middleware/metrics/metrics.test.ts +46 -46
- package/src/middleware/metrics/metrics.ts +24 -24
- package/src/middleware/requestMetrics/index.ts +1 -1
- package/src/middleware/requestMetrics/requestMetrics.test.ts +77 -77
- package/src/middleware/requestMetrics/requestMetrics.ts +20 -20
- package/src/middleware/swaggerDocs/index.ts +2 -2
- package/src/middleware/swaggerDocs/swaggerDocs.ts +114 -114
- package/src/middleware/swaggerDocs/swaggerDocs.types.ts +41 -41
- package/src/middleware/userResolver/index.ts +1 -1
- package/src/middleware/userResolver/userResolver.test.ts +35 -35
- package/src/middleware/userResolver/userResolver.ts +35 -35
- package/src/middleware/validate/index.ts +1 -1
- package/src/middleware/validate/validate.test.ts +43 -43
- package/src/middleware/validate/validate.ts +25 -25
- package/src/middleware/version/index.ts +1 -1
- package/src/middleware/version/version.test.ts +23 -23
- package/src/middleware/version/version.ts +12 -12
- package/src/utils/checkEnvironment/index.ts +49 -49
- package/src/utils/createHttpServer/createHttpServer.test.ts +24 -24
- package/src/utils/createHttpServer/createHttpServer.ts +34 -34
- package/src/utils/createHttpServer/createHttpServer.validate.ts +17 -17
- package/src/utils/createHttpServer/index.ts +1 -1
- package/src/utils/createSortedObject/createSortedObject.ts +20 -20
- package/src/utils/createSortedObject/createSortedObjet.test.ts +47 -47
- package/src/utils/createSortedObject/index.ts +1 -1
- package/src/utils/dbMigration/dbMigration.test.ts +209 -209
- package/src/utils/dbMigration/dbMigration.ts +199 -199
- package/src/utils/dbMigration/dbMigration.types.ts +11 -11
- package/src/utils/dbMigration/index.ts +2 -2
- package/src/utils/dbMigration/migrateMetadataTable/index.ts +1 -1
- package/src/utils/dbMigration/migrateMetadataTable/migrateMetadataTable.test.ts +59 -59
- package/src/utils/dbMigration/migrateMetadataTable/migrateMetadataTable.ts +102 -70
- package/src/utils/envAssert/envAssert.ts +31 -31
- package/src/utils/envAssert/index.ts +1 -1
- package/src/utils/envAssert/validators/hostList.ts +17 -17
- package/src/utils/envAssert/validators/index.ts +5 -5
- package/src/utils/envAssert/validators/ipList.ts +13 -13
- package/src/utils/envAssert/validators/path.ts +13 -13
- package/src/utils/envAssert/validators/string.ts +9 -9
- package/src/utils/envAssert/validators/stringList.ts +13 -13
- package/src/utils/filter/filter.ts +17 -17
- package/src/utils/filter/index.ts +1 -1
- package/src/utils/getDynamicLink/getDynamicLink.test.ts +51 -51
- package/src/utils/getDynamicLink/getDynamicLink.ts +28 -28
- package/src/utils/getDynamicLink/getDynamicLink.types.ts +11 -11
- package/src/utils/getDynamicLink/getDynamicLink.validate.ts +6 -6
- package/src/utils/getDynamicLink/index.ts +2 -2
- package/src/utils/hmac/checkEnv/checkEnv.test.ts +18 -18
- package/src/utils/hmac/checkEnv/checkEnv.ts +9 -9
- package/src/utils/hmac/checkEnv/index.ts +1 -1
- package/src/utils/hmac/createHmac/createHmac.ts +33 -33
- package/src/utils/hmac/createHmac/index.ts +1 -1
- package/src/utils/hmac/index.ts +4 -4
- package/src/utils/hmac/index.types.ts +13 -13
- package/src/utils/hmac/signPayload/index.ts +1 -1
- package/src/utils/hmac/signPayload/signPayload.ts +16 -16
- package/src/utils/hmac/verifySignature/index.ts +1 -1
- package/src/utils/hmac/verifySignature/verifySignature.ts +24 -24
- package/src/utils/index.ts +26 -26
- package/src/utils/jwt/index.ts +2 -2
- package/src/utils/jwt/jwt.test.ts +41 -41
- package/src/utils/jwt/jwt.ts +204 -204
- package/src/utils/jwt/jwt.types.ts +21 -21
- package/src/utils/report/index.ts +3 -3
- package/src/utils/report/output.ts +45 -45
- package/src/utils/report/output.types.ts +70 -70
- package/src/utils/report/report.test.ts +133 -133
- package/src/utils/report/report.ts +134 -134
- package/src/utils/report/report.types.ts +13 -13
- package/src/utils/request/index.ts +1 -1
- package/src/utils/request/request.test.ts +26 -26
- package/src/utils/request/request.ts +48 -48
- package/src/utils/semverCompare/index.ts +1 -1
- package/src/utils/semverCompare/semverCompare.test.ts +49 -49
- package/src/utils/semverCompare/semverCompare.ts +60 -60
- package/src/utils/sendEmail/index.ts +1 -1
- package/src/utils/sendEmail/sendEmail.ts +27 -27
- package/src/utils/sendEmail/sendEmail.types.ts +7 -7
- package/src/utils/sendPush/index.ts +2 -2
- package/src/utils/sendPush/sendPush.ts +20 -20
- package/src/utils/sendPush/sendPush.types.ts +25 -25
- package/src/utils/tlsConfig/index.ts +2 -2
- package/src/utils/tlsConfig/tlsConfig.test.ts +32 -32
- package/src/utils/tlsConfig/tlsConfig.ts +47 -47
- package/src/utils/tlsConfig/tlsConfig.types.ts +11 -11
- package/src/utils/tlsConfig/tlsConfig.validate.ts +25 -25
- package/src/utils/tlsRequest/index.ts +1 -1
- package/src/utils/tlsRequest/tlsRequest.test.ts +63 -63
- package/src/utils/tlsRequest/tlsRequest.ts +12 -12
- package/src/utils/trimPathSlash/index.ts +1 -1
- package/src/utils/trimPathSlash/trimPathSlash.test.ts +26 -26
- package/src/utils/trimPathSlash/trimPathSlash.ts +8 -8
- package/test/env.ts +56 -56
- package/test/factory/index.ts +8 -8
- package/test/factory/sequelizeMeta.ts +12 -12
- package/test/hooks.ts +37 -37
- package/test/index.ts +3 -3
- package/test/stub/index.ts +3 -3
- package/test/stub/stubLocales.ts +68 -68
- package/test/stub/stubPubSub.ts +7 -7
- package/test/stub/stubStorage.ts +77 -77
- package/test/stub/stubStorage.types.ts +11 -11
- package/test/utils/app.ts +31 -31
- package/test/utils/index.ts +1 -1
- package/tsconfig.build.json +5 -5
- package/tsconfig.json +32 -32
|
@@ -1,52 +1,52 @@
|
|
|
1
|
-
import { CompressionOptions } from './compressAvatar';
|
|
2
|
-
import { StorageUploadedFile } from 'entities/Storage';
|
|
3
|
-
|
|
4
|
-
// Override the Express request object to add the files
|
|
5
|
-
declare global {
|
|
6
|
-
// eslint-disable-next-line @typescript-eslint/no-namespace
|
|
7
|
-
namespace Express {
|
|
8
|
-
/** Express request object */
|
|
9
|
-
interface Request {
|
|
10
|
-
/** Configuration for files that are uploaded with the request */
|
|
11
|
-
files?: { [key: string]: Array<UploadedFile> };
|
|
12
|
-
}
|
|
13
|
-
}
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
/** Custom uploaded file metadata */
|
|
17
|
-
export interface UploadedFile extends StorageUploadedFile {
|
|
18
|
-
/** File name that was given to the file by the client */
|
|
19
|
-
originalFileName: string;
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
/** Outputs setting for the file upload. Defines where a file should be stored and how it should be processed. */
|
|
23
|
-
interface FileUploaderOutputs {
|
|
24
|
-
/** Name of the output */
|
|
25
|
-
name: string;
|
|
26
|
-
/** Path to which this specific output is stored (defaults to default path if not set) */
|
|
27
|
-
path?: string;
|
|
28
|
-
/** Bucket to which this specific output is stored (defaults to default bucket if not set) */
|
|
29
|
-
bucket?: string;
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
/** Configuration for a file upload */
|
|
33
|
-
export interface FileUploaderConfig {
|
|
34
|
-
/** Field key for which this configuration applies */
|
|
35
|
-
key: string;
|
|
36
|
-
/** A list of supported MIME Types for the file */
|
|
37
|
-
mimeTypes?: Array<string>;
|
|
38
|
-
/** Base path where the file should be stored (default used when no output config is set, will be used as temporary storage when outputs are set) */
|
|
39
|
-
path?: string;
|
|
40
|
-
/** Bucket in which the file should be stored (will be used as temporary storage when outputs are set) */
|
|
41
|
-
bucket: string;
|
|
42
|
-
/** Maximum size of the file (ex: 2MB) */
|
|
43
|
-
maxSize?: string;
|
|
44
|
-
/** Indicates that the file must be present */
|
|
45
|
-
required?: boolean;
|
|
46
|
-
/** Do not store with an extension (will simply be a uuid) */
|
|
47
|
-
noExtension?: boolean;
|
|
48
|
-
/** Specify multiple outputs with processing */
|
|
49
|
-
outputs?: Array<FileUploaderOutputs>;
|
|
50
|
-
/** @deprecated compression of images */
|
|
51
|
-
image?: CompressionOptions;
|
|
52
|
-
}
|
|
1
|
+
import { CompressionOptions } from './compressAvatar';
|
|
2
|
+
import { StorageUploadedFile } from 'entities/Storage';
|
|
3
|
+
|
|
4
|
+
// Override the Express request object to add the files
|
|
5
|
+
declare global {
|
|
6
|
+
// eslint-disable-next-line @typescript-eslint/no-namespace
|
|
7
|
+
namespace Express {
|
|
8
|
+
/** Express request object */
|
|
9
|
+
interface Request {
|
|
10
|
+
/** Configuration for files that are uploaded with the request */
|
|
11
|
+
files?: { [key: string]: Array<UploadedFile> };
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
/** Custom uploaded file metadata */
|
|
17
|
+
export interface UploadedFile extends StorageUploadedFile {
|
|
18
|
+
/** File name that was given to the file by the client */
|
|
19
|
+
originalFileName: string;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/** Outputs setting for the file upload. Defines where a file should be stored and how it should be processed. */
|
|
23
|
+
interface FileUploaderOutputs {
|
|
24
|
+
/** Name of the output */
|
|
25
|
+
name: string;
|
|
26
|
+
/** Path to which this specific output is stored (defaults to default path if not set) */
|
|
27
|
+
path?: string;
|
|
28
|
+
/** Bucket to which this specific output is stored (defaults to default bucket if not set) */
|
|
29
|
+
bucket?: string;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/** Configuration for a file upload */
|
|
33
|
+
export interface FileUploaderConfig {
|
|
34
|
+
/** Field key for which this configuration applies */
|
|
35
|
+
key: string;
|
|
36
|
+
/** A list of supported MIME Types for the file */
|
|
37
|
+
mimeTypes?: Array<string>;
|
|
38
|
+
/** Base path where the file should be stored (default used when no output config is set, will be used as temporary storage when outputs are set) */
|
|
39
|
+
path?: string;
|
|
40
|
+
/** Bucket in which the file should be stored (will be used as temporary storage when outputs are set) */
|
|
41
|
+
bucket: string;
|
|
42
|
+
/** Maximum size of the file (ex: 2MB) */
|
|
43
|
+
maxSize?: string;
|
|
44
|
+
/** Indicates that the file must be present */
|
|
45
|
+
required?: boolean;
|
|
46
|
+
/** Do not store with an extension (will simply be a uuid) */
|
|
47
|
+
noExtension?: boolean;
|
|
48
|
+
/** Specify multiple outputs with processing */
|
|
49
|
+
outputs?: Array<FileUploaderOutputs>;
|
|
50
|
+
/** @deprecated compression of images */
|
|
51
|
+
image?: CompressionOptions;
|
|
52
|
+
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export * from './fileUploader';
|
|
2
|
-
export * from './fileUploader.types';
|
|
1
|
+
export * from './fileUploader';
|
|
2
|
+
export * from './fileUploader.types';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export * from './isMultipart';
|
|
1
|
+
export * from './isMultipart';
|
|
@@ -1,9 +1,9 @@
|
|
|
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
|
+
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 +1 @@
|
|
|
1
|
-
export * from './validate';
|
|
1
|
+
export * from './validate';
|
|
@@ -1,27 +1,27 @@
|
|
|
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
|
+
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 +1,14 @@
|
|
|
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
|
+
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 +1,13 @@
|
|
|
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
|
+
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 +1 @@
|
|
|
1
|
-
export * from './fourOhFour';
|
|
1
|
+
export * from './fourOhFour';
|
|
@@ -1,117 +1,117 @@
|
|
|
1
|
-
import express from 'express';
|
|
2
|
-
import multer from 'multer';
|
|
3
|
-
import { GoogleAIFileManager } from '@google/generative-ai/server';
|
|
4
|
-
import fs from 'fs';
|
|
5
|
-
import path from 'path';
|
|
6
|
-
import tmp from 'tmp';
|
|
7
|
-
import { reportError, reportDebug } from 'utils/report';
|
|
8
|
-
import { checkEnvironment } from 'utils/checkEnvironment';
|
|
9
|
-
import { envAssert } from 'utils/envAssert';
|
|
10
|
-
|
|
11
|
-
const namespace = 'engine:middleware:geminiFileUploader';
|
|
12
|
-
|
|
13
|
-
const apiKey = process.env.GOOGLE_AI_KEY ?? '';
|
|
14
|
-
const fileManager = new GoogleAIFileManager(apiKey);
|
|
15
|
-
|
|
16
|
-
const storage = multer.memoryStorage();
|
|
17
|
-
|
|
18
|
-
async function uploadToGemini(
|
|
19
|
-
buffer: Buffer,
|
|
20
|
-
mimeType: string,
|
|
21
|
-
originalName: string
|
|
22
|
-
): Promise<{ name: string; uri: string; mimeType: string }> {
|
|
23
|
-
// Add 'name' to the return type
|
|
24
|
-
const tempFile = tmp.fileSync({ postfix: path.extname(originalName) });
|
|
25
|
-
|
|
26
|
-
fs.writeFileSync(tempFile.name, buffer);
|
|
27
|
-
|
|
28
|
-
const uploadResult = await fileManager.uploadFile(tempFile.name, {
|
|
29
|
-
mimeType,
|
|
30
|
-
displayName: originalName
|
|
31
|
-
});
|
|
32
|
-
|
|
33
|
-
tempFile.removeCallback();
|
|
34
|
-
|
|
35
|
-
const file = uploadResult.file;
|
|
36
|
-
reportDebug({
|
|
37
|
-
namespace,
|
|
38
|
-
message: 'Uploaded file',
|
|
39
|
-
data: { displayName: file.displayName, name: file.name }
|
|
40
|
-
});
|
|
41
|
-
return { name: file.name, uri: file.uri, mimeType: file.mimeType }; // Include 'name' in the return object
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
async function waitForFilesActive(
|
|
45
|
-
files: { name: string; uri: string; mimeType: string }[]
|
|
46
|
-
): Promise<void> {
|
|
47
|
-
reportDebug({
|
|
48
|
-
namespace,
|
|
49
|
-
message: 'Waiting for file processing...'
|
|
50
|
-
});
|
|
51
|
-
for (const { name } of files) {
|
|
52
|
-
let file = await fileManager.getFile(name);
|
|
53
|
-
while (file.state === 'PROCESSING') {
|
|
54
|
-
process.stdout.write('.');
|
|
55
|
-
await new Promise((resolve) => setTimeout(resolve, 10_000));
|
|
56
|
-
file = await fileManager.getFile(name);
|
|
57
|
-
}
|
|
58
|
-
if (file.state !== 'ACTIVE') {
|
|
59
|
-
reportError(`File ${file.name} failed to process`);
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
reportDebug({
|
|
63
|
-
namespace,
|
|
64
|
-
message: 'all files ready...\n'
|
|
65
|
-
});
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
export async function geminiFileUploader(
|
|
69
|
-
req: express.Request,
|
|
70
|
-
res: express.Response,
|
|
71
|
-
next: express.NextFunction
|
|
72
|
-
): Promise<void> {
|
|
73
|
-
try {
|
|
74
|
-
checkEnvironment({
|
|
75
|
-
GOOGLE_AI_KEY: envAssert.isString()
|
|
76
|
-
});
|
|
77
|
-
// Use multer.single() inside the middleware
|
|
78
|
-
const uploadSingle = multer({ storage }).single('file');
|
|
79
|
-
|
|
80
|
-
uploadSingle(req, res, async (err) => {
|
|
81
|
-
if (err) {
|
|
82
|
-
reportError(`Error uploading file`);
|
|
83
|
-
next(err);
|
|
84
|
-
return;
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
const file = req.file;
|
|
88
|
-
if (!file) {
|
|
89
|
-
reportError(`No file uploaded`);
|
|
90
|
-
next(`No file uploaded`);
|
|
91
|
-
return;
|
|
92
|
-
}
|
|
93
|
-
const mimeType = file.mimetype;
|
|
94
|
-
|
|
95
|
-
const uploadedFile = await uploadToGemini(
|
|
96
|
-
file.buffer,
|
|
97
|
-
mimeType,
|
|
98
|
-
file.originalname
|
|
99
|
-
);
|
|
100
|
-
|
|
101
|
-
await waitForFilesActive([uploadedFile]);
|
|
102
|
-
|
|
103
|
-
// Set the fileUri and mimeType in the request object for the next middleware/route handler
|
|
104
|
-
req.body.file = {
|
|
105
|
-
fileUri: uploadedFile.uri,
|
|
106
|
-
mimeType: uploadedFile.mimeType,
|
|
107
|
-
originalname: file.originalname
|
|
108
|
-
};
|
|
109
|
-
|
|
110
|
-
next(); // Proceed to the next middleware or route handler
|
|
111
|
-
});
|
|
112
|
-
} catch (error) {
|
|
113
|
-
console.error(error);
|
|
114
|
-
reportError(`Failed to upload or process file`);
|
|
115
|
-
next(error);
|
|
116
|
-
}
|
|
117
|
-
}
|
|
1
|
+
import express from 'express';
|
|
2
|
+
import multer from 'multer';
|
|
3
|
+
import { GoogleAIFileManager } from '@google/generative-ai/server';
|
|
4
|
+
import fs from 'fs';
|
|
5
|
+
import path from 'path';
|
|
6
|
+
import tmp from 'tmp';
|
|
7
|
+
import { reportError, reportDebug } from 'utils/report';
|
|
8
|
+
import { checkEnvironment } from 'utils/checkEnvironment';
|
|
9
|
+
import { envAssert } from 'utils/envAssert';
|
|
10
|
+
|
|
11
|
+
const namespace = 'engine:middleware:geminiFileUploader';
|
|
12
|
+
|
|
13
|
+
const apiKey = process.env.GOOGLE_AI_KEY ?? '';
|
|
14
|
+
const fileManager = new GoogleAIFileManager(apiKey);
|
|
15
|
+
|
|
16
|
+
const storage = multer.memoryStorage();
|
|
17
|
+
|
|
18
|
+
async function uploadToGemini(
|
|
19
|
+
buffer: Buffer,
|
|
20
|
+
mimeType: string,
|
|
21
|
+
originalName: string
|
|
22
|
+
): Promise<{ name: string; uri: string; mimeType: string }> {
|
|
23
|
+
// Add 'name' to the return type
|
|
24
|
+
const tempFile = tmp.fileSync({ postfix: path.extname(originalName) });
|
|
25
|
+
|
|
26
|
+
fs.writeFileSync(tempFile.name, buffer);
|
|
27
|
+
|
|
28
|
+
const uploadResult = await fileManager.uploadFile(tempFile.name, {
|
|
29
|
+
mimeType,
|
|
30
|
+
displayName: originalName
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
tempFile.removeCallback();
|
|
34
|
+
|
|
35
|
+
const file = uploadResult.file;
|
|
36
|
+
reportDebug({
|
|
37
|
+
namespace,
|
|
38
|
+
message: 'Uploaded file',
|
|
39
|
+
data: { displayName: file.displayName, name: file.name }
|
|
40
|
+
});
|
|
41
|
+
return { name: file.name, uri: file.uri, mimeType: file.mimeType }; // Include 'name' in the return object
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
async function waitForFilesActive(
|
|
45
|
+
files: { name: string; uri: string; mimeType: string }[]
|
|
46
|
+
): Promise<void> {
|
|
47
|
+
reportDebug({
|
|
48
|
+
namespace,
|
|
49
|
+
message: 'Waiting for file processing...'
|
|
50
|
+
});
|
|
51
|
+
for (const { name } of files) {
|
|
52
|
+
let file = await fileManager.getFile(name);
|
|
53
|
+
while (file.state === 'PROCESSING') {
|
|
54
|
+
process.stdout.write('.');
|
|
55
|
+
await new Promise((resolve) => setTimeout(resolve, 10_000));
|
|
56
|
+
file = await fileManager.getFile(name);
|
|
57
|
+
}
|
|
58
|
+
if (file.state !== 'ACTIVE') {
|
|
59
|
+
reportError(`File ${file.name} failed to process`);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
reportDebug({
|
|
63
|
+
namespace,
|
|
64
|
+
message: 'all files ready...\n'
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
export async function geminiFileUploader(
|
|
69
|
+
req: express.Request,
|
|
70
|
+
res: express.Response,
|
|
71
|
+
next: express.NextFunction
|
|
72
|
+
): Promise<void> {
|
|
73
|
+
try {
|
|
74
|
+
checkEnvironment({
|
|
75
|
+
GOOGLE_AI_KEY: envAssert.isString()
|
|
76
|
+
});
|
|
77
|
+
// Use multer.single() inside the middleware
|
|
78
|
+
const uploadSingle = multer({ storage }).single('file');
|
|
79
|
+
|
|
80
|
+
uploadSingle(req, res, async (err) => {
|
|
81
|
+
if (err) {
|
|
82
|
+
reportError(`Error uploading file`);
|
|
83
|
+
next(err);
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
const file = req.file;
|
|
88
|
+
if (!file) {
|
|
89
|
+
reportError(`No file uploaded`);
|
|
90
|
+
next(`No file uploaded`);
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
const mimeType = file.mimetype;
|
|
94
|
+
|
|
95
|
+
const uploadedFile = await uploadToGemini(
|
|
96
|
+
file.buffer,
|
|
97
|
+
mimeType,
|
|
98
|
+
file.originalname
|
|
99
|
+
);
|
|
100
|
+
|
|
101
|
+
await waitForFilesActive([uploadedFile]);
|
|
102
|
+
|
|
103
|
+
// Set the fileUri and mimeType in the request object for the next middleware/route handler
|
|
104
|
+
req.body.file = {
|
|
105
|
+
fileUri: uploadedFile.uri,
|
|
106
|
+
mimeType: uploadedFile.mimeType,
|
|
107
|
+
originalname: file.originalname
|
|
108
|
+
};
|
|
109
|
+
|
|
110
|
+
next(); // Proceed to the next middleware or route handler
|
|
111
|
+
});
|
|
112
|
+
} catch (error) {
|
|
113
|
+
console.error(error);
|
|
114
|
+
reportError(`Failed to upload or process file`);
|
|
115
|
+
next(error);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export * from './geminiFileUploader';
|
|
1
|
+
export * from './geminiFileUploader';
|
|
@@ -1,12 +1,12 @@
|
|
|
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
|
+
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 +1,14 @@
|
|
|
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
|
+
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 +1 @@
|
|
|
1
|
-
export * from './healthCheck';
|
|
1
|
+
export * from './healthCheck';
|
package/src/middleware/index.ts
CHANGED
|
@@ -1,17 +1,17 @@
|
|
|
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 './authAdmin';
|
|
16
|
-
export * from './geminiFileUploader';
|
|
17
|
-
export * from './checkPermission';
|
|
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 './authAdmin';
|
|
16
|
+
export * from './geminiFileUploader';
|
|
17
|
+
export * from './checkPermission';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export * from './metrics';
|
|
1
|
+
export * from './metrics';
|