node-server-engine 1.1.1 → 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.
Files changed (471) hide show
  1. package/.env.example +193 -193
  2. package/.mocharc.js +13 -13
  3. package/.nycrc +18 -18
  4. package/.prettierrc +7 -7
  5. package/Dockerfile +30 -30
  6. package/README.md +991 -1025
  7. package/babel.config.json +35 -35
  8. package/dist/const/DebeziumEvent.js.map +1 -1
  9. package/dist/const/LogSeverity.js.map +1 -1
  10. package/dist/const/index.js.map +1 -1
  11. package/dist/const/metrics.js.map +1 -1
  12. package/dist/const/mime.js.map +1 -1
  13. package/dist/const/tokenIssuer.js.map +1 -1
  14. package/dist/db/migrations/20241030121500-create-sequelize-meta-table.js.map +1 -1
  15. package/dist/db/models/SequelizeMeta.js.map +1 -1
  16. package/dist/db/models/index.js.map +1 -1
  17. package/dist/entities/ElasticSearch/ElasticSearch.js +7 -7
  18. package/dist/entities/ElasticSearch/ElasticSearch.js.map +1 -1
  19. package/dist/entities/ElasticSearch/ElasticSearch.types.js.map +1 -1
  20. package/dist/entities/ElasticSearch/index.js.map +1 -1
  21. package/dist/entities/Endpoint/Endpoint.js +8 -8
  22. package/dist/entities/Endpoint/Endpoint.js.map +1 -1
  23. package/dist/entities/Endpoint/Endpoint.types.js.map +1 -1
  24. package/dist/entities/Endpoint/index.js.map +1 -1
  25. package/dist/entities/EngineError/EngineError.js +2 -2
  26. package/dist/entities/EngineError/EngineError.js.map +1 -1
  27. package/dist/entities/EngineError/EngineError.types.js.map +1 -1
  28. package/dist/entities/EngineError/index.js.map +1 -1
  29. package/dist/entities/KeySet/KeySet.js +3 -3
  30. package/dist/entities/KeySet/KeySet.js.map +1 -1
  31. package/dist/entities/KeySet/KeySet.types.js.map +1 -1
  32. package/dist/entities/KeySet/index.js.map +1 -1
  33. package/dist/entities/LifecycleController/LifecycleController.js.map +1 -1
  34. package/dist/entities/LifecycleController/LifecycleController.types.js.map +1 -1
  35. package/dist/entities/LifecycleController/index.js.map +1 -1
  36. package/dist/entities/Localizator/Localizator.js +7 -7
  37. package/dist/entities/Localizator/Localizator.js.map +1 -1
  38. package/dist/entities/Localizator/Localizator.types.js.map +1 -1
  39. package/dist/entities/Localizator/guessNamingConvention/guessNamingConvention.js.map +1 -1
  40. package/dist/entities/Localizator/guessNamingConvention/index.js.map +1 -1
  41. package/dist/entities/Localizator/index.js.map +1 -1
  42. package/dist/entities/MessageHandler/MessageHandler.js +2 -2
  43. package/dist/entities/MessageHandler/MessageHandler.js.map +1 -1
  44. package/dist/entities/MessageHandler/MessageHandler.types.js.map +1 -1
  45. package/dist/entities/MessageHandler/index.js.map +1 -1
  46. package/dist/entities/PubSub/PubSub.js +25 -25
  47. package/dist/entities/PubSub/PubSub.js.map +1 -1
  48. package/dist/entities/PubSub/PubSub.types.js.map +1 -1
  49. package/dist/entities/PubSub/handleMessage/handleMessage.js +6 -6
  50. package/dist/entities/PubSub/handleMessage/handleMessage.js.map +1 -1
  51. package/dist/entities/PubSub/handleMessage/index.js.map +1 -1
  52. package/dist/entities/PubSub/index.js.map +1 -1
  53. package/dist/entities/PushNotification/PushNotification.js +4 -4
  54. package/dist/entities/PushNotification/PushNotification.js.map +1 -1
  55. package/dist/entities/PushNotification/PushNotification.types.js.map +1 -1
  56. package/dist/entities/PushNotification/index.js.map +1 -1
  57. package/dist/entities/Redis/Redis.js +8 -8
  58. package/dist/entities/Redis/Redis.js.map +1 -1
  59. package/dist/entities/Redis/Redis.types.js.map +1 -1
  60. package/dist/entities/Redis/Redis.validate.js +2 -2
  61. package/dist/entities/Redis/Redis.validate.js.map +1 -1
  62. package/dist/entities/Redis/index.js.map +1 -1
  63. package/dist/entities/Sequelize/Sequelize.config.js +42 -2
  64. package/dist/entities/Sequelize/Sequelize.config.js.map +1 -1
  65. package/dist/entities/Sequelize/Sequelize.js +3 -3
  66. package/dist/entities/Sequelize/Sequelize.js.map +1 -1
  67. package/dist/entities/Sequelize/Sequelize.types.js.map +1 -1
  68. package/dist/entities/Sequelize/Sequelize.validate.js +2 -2
  69. package/dist/entities/Sequelize/Sequelize.validate.js.map +1 -1
  70. package/dist/entities/Sequelize/index.js.map +1 -1
  71. package/dist/entities/Server/Server.const.js.map +1 -1
  72. package/dist/entities/Server/Server.js +2 -2
  73. package/dist/entities/Server/Server.js.map +1 -1
  74. package/dist/entities/Server/Server.types.js.map +1 -1
  75. package/dist/entities/Server/index.js.map +1 -1
  76. package/dist/entities/SocketClient/SocketClient.js +15 -15
  77. package/dist/entities/SocketClient/SocketClient.js.map +1 -1
  78. package/dist/entities/SocketClient/SocketClient.types.js.map +1 -1
  79. package/dist/entities/SocketClient/index.js.map +1 -1
  80. package/dist/entities/SocketClient/parseMessage/index.js.map +1 -1
  81. package/dist/entities/SocketClient/parseMessage/parseMessage.js +2 -2
  82. package/dist/entities/SocketClient/parseMessage/parseMessage.js.map +1 -1
  83. package/dist/entities/Storage/Storage.js +20 -20
  84. package/dist/entities/Storage/Storage.js.map +1 -1
  85. package/dist/entities/Storage/Storage.types.js.map +1 -1
  86. package/dist/entities/Storage/index.js.map +1 -1
  87. package/dist/entities/ValidationError/ValidationError.js.map +1 -1
  88. package/dist/entities/ValidationError/index.js.map +1 -1
  89. package/dist/entities/WebError/WebError.js +4 -4
  90. package/dist/entities/WebError/WebError.js.map +1 -1
  91. package/dist/entities/WebError/WebError.types.js.map +1 -1
  92. package/dist/entities/WebError/index.js.map +1 -1
  93. package/dist/entities/index.js.map +1 -1
  94. package/dist/index.js.map +1 -1
  95. package/dist/metrics/debug.js.map +1 -1
  96. package/dist/metrics/index.js.map +1 -1
  97. package/dist/metrics/request.js.map +1 -1
  98. package/dist/middleware/authAdmin/authAdmin.js.map +1 -1
  99. package/dist/middleware/authAdmin/authAdmin.types.js.map +1 -1
  100. package/dist/middleware/authAdmin/index.js.map +1 -1
  101. package/dist/middleware/authHmac/authHmac.js.map +1 -1
  102. package/dist/middleware/authHmac/authHmac.types.js.map +1 -1
  103. package/dist/middleware/authHmac/index.js.map +1 -1
  104. package/dist/middleware/authJwt/authJwt.js.map +1 -1
  105. package/dist/middleware/authJwt/authJwt.types.js.map +1 -1
  106. package/dist/middleware/authJwt/index.js.map +1 -1
  107. package/dist/middleware/authStatic/authStatic.js +3 -3
  108. package/dist/middleware/authStatic/authStatic.js.map +1 -1
  109. package/dist/middleware/authStatic/index.js.map +1 -1
  110. package/dist/middleware/authTls/authTls.js +8 -8
  111. package/dist/middleware/authTls/authTls.js.map +1 -1
  112. package/dist/middleware/authTls/authTls.types.js.map +1 -1
  113. package/dist/middleware/authTls/index.js.map +1 -1
  114. package/dist/middleware/checkPermission/checkPermission.d.ts +3 -1
  115. package/dist/middleware/checkPermission/checkPermission.js +2 -2
  116. package/dist/middleware/checkPermission/checkPermission.js.map +1 -1
  117. package/dist/middleware/error/error.js.map +1 -1
  118. package/dist/middleware/error/index.js.map +1 -1
  119. package/dist/middleware/fileUploader/compressAvatar/compressAvatar.js +2 -2
  120. package/dist/middleware/fileUploader/compressAvatar/compressAvatar.js.map +1 -1
  121. package/dist/middleware/fileUploader/compressAvatar/compressAvatar.types.js.map +1 -1
  122. package/dist/middleware/fileUploader/compressAvatar/index.js.map +1 -1
  123. package/dist/middleware/fileUploader/fileUploader.js +12 -12
  124. package/dist/middleware/fileUploader/fileUploader.js.map +1 -1
  125. package/dist/middleware/fileUploader/fileUploader.types.js.map +1 -1
  126. package/dist/middleware/fileUploader/index.js.map +1 -1
  127. package/dist/middleware/fileUploader/isMultiPart/index.js.map +1 -1
  128. package/dist/middleware/fileUploader/isMultiPart/isMultipart.js.map +1 -1
  129. package/dist/middleware/fileUploader/validate/index.js.map +1 -1
  130. package/dist/middleware/fileUploader/validate/validate.js.map +1 -1
  131. package/dist/middleware/fourOhFour/fourOhFour.js.map +1 -1
  132. package/dist/middleware/fourOhFour/index.js.map +1 -1
  133. package/dist/middleware/geminiFileUploader/geminiFileUploader.js.map +1 -1
  134. package/dist/middleware/geminiFileUploader/index.js.map +1 -1
  135. package/dist/middleware/healthCheck/healthCheck.js +2 -2
  136. package/dist/middleware/healthCheck/healthCheck.js.map +1 -1
  137. package/dist/middleware/healthCheck/index.js.map +1 -1
  138. package/dist/middleware/index.js.map +1 -1
  139. package/dist/middleware/metrics/index.js.map +1 -1
  140. package/dist/middleware/metrics/metrics.js.map +1 -1
  141. package/dist/middleware/requestMetrics/index.js.map +1 -1
  142. package/dist/middleware/requestMetrics/requestMetrics.js.map +1 -1
  143. package/dist/middleware/swaggerDocs/index.js.map +1 -1
  144. package/dist/middleware/swaggerDocs/swaggerDocs.js +7 -7
  145. package/dist/middleware/swaggerDocs/swaggerDocs.js.map +1 -1
  146. package/dist/middleware/swaggerDocs/swaggerDocs.types.js.map +1 -1
  147. package/dist/middleware/userResolver/index.js.map +1 -1
  148. package/dist/middleware/userResolver/userResolver.js.map +1 -1
  149. package/dist/middleware/validate/index.js.map +1 -1
  150. package/dist/middleware/validate/validate.js.map +1 -1
  151. package/dist/middleware/version/index.js.map +1 -1
  152. package/dist/middleware/version/version.js +3 -3
  153. package/dist/middleware/version/version.js.map +1 -1
  154. package/dist/utils/checkEnvironment/index.js +13 -13
  155. package/dist/utils/checkEnvironment/index.js.map +1 -1
  156. package/dist/utils/createHttpServer/createHttpServer.js.map +1 -1
  157. package/dist/utils/createHttpServer/createHttpServer.validate.js +2 -2
  158. package/dist/utils/createHttpServer/createHttpServer.validate.js.map +1 -1
  159. package/dist/utils/createHttpServer/index.js.map +1 -1
  160. package/dist/utils/createSortedObject/createSortedObject.js.map +1 -1
  161. package/dist/utils/createSortedObject/index.js.map +1 -1
  162. package/dist/utils/dbMigration/dbMigration.js +8 -8
  163. package/dist/utils/dbMigration/dbMigration.js.map +1 -1
  164. package/dist/utils/dbMigration/dbMigration.types.js.map +1 -1
  165. package/dist/utils/dbMigration/index.js.map +1 -1
  166. package/dist/utils/dbMigration/migrateMetadataTable/index.js.map +1 -1
  167. package/dist/utils/dbMigration/migrateMetadataTable/migrateMetadataTable.d.ts +2 -2
  168. package/dist/utils/dbMigration/migrateMetadataTable/migrateMetadataTable.js +47 -15
  169. package/dist/utils/dbMigration/migrateMetadataTable/migrateMetadataTable.js.map +1 -1
  170. package/dist/utils/envAssert/envAssert.js +6 -6
  171. package/dist/utils/envAssert/envAssert.js.map +1 -1
  172. package/dist/utils/envAssert/index.js.map +1 -1
  173. package/dist/utils/envAssert/validators/hostList.js +2 -2
  174. package/dist/utils/envAssert/validators/hostList.js.map +1 -1
  175. package/dist/utils/envAssert/validators/index.js.map +1 -1
  176. package/dist/utils/envAssert/validators/ipList.js +2 -2
  177. package/dist/utils/envAssert/validators/ipList.js.map +1 -1
  178. package/dist/utils/envAssert/validators/path.js +2 -2
  179. package/dist/utils/envAssert/validators/path.js.map +1 -1
  180. package/dist/utils/envAssert/validators/string.js +2 -2
  181. package/dist/utils/envAssert/validators/string.js.map +1 -1
  182. package/dist/utils/envAssert/validators/stringList.js +3 -3
  183. package/dist/utils/envAssert/validators/stringList.js.map +1 -1
  184. package/dist/utils/filter/filter.js +4 -4
  185. package/dist/utils/filter/filter.js.map +1 -1
  186. package/dist/utils/filter/index.js.map +1 -1
  187. package/dist/utils/getDynamicLink/getDynamicLink.js.map +1 -1
  188. package/dist/utils/getDynamicLink/getDynamicLink.types.js.map +1 -1
  189. package/dist/utils/getDynamicLink/getDynamicLink.validate.js.map +1 -1
  190. package/dist/utils/getDynamicLink/index.js.map +1 -1
  191. package/dist/utils/hmac/checkEnv/checkEnv.js +2 -2
  192. package/dist/utils/hmac/checkEnv/checkEnv.js.map +1 -1
  193. package/dist/utils/hmac/checkEnv/index.js.map +1 -1
  194. package/dist/utils/hmac/createHmac/createHmac.js.map +1 -1
  195. package/dist/utils/hmac/createHmac/index.js.map +1 -1
  196. package/dist/utils/hmac/index.js.map +1 -1
  197. package/dist/utils/hmac/index.types.js.map +1 -1
  198. package/dist/utils/hmac/signPayload/index.js.map +1 -1
  199. package/dist/utils/hmac/signPayload/signPayload.js.map +1 -1
  200. package/dist/utils/hmac/verifySignature/index.js.map +1 -1
  201. package/dist/utils/hmac/verifySignature/verifySignature.js.map +1 -1
  202. package/dist/utils/index.js.map +1 -1
  203. package/dist/utils/jwt/index.js.map +1 -1
  204. package/dist/utils/jwt/jwt.js.map +1 -1
  205. package/dist/utils/jwt/jwt.types.js.map +1 -1
  206. package/dist/utils/report/index.js.map +1 -1
  207. package/dist/utils/report/output.js.map +1 -1
  208. package/dist/utils/report/output.types.js.map +1 -1
  209. package/dist/utils/report/report.js.map +1 -1
  210. package/dist/utils/report/report.types.js.map +1 -1
  211. package/dist/utils/request/index.js.map +1 -1
  212. package/dist/utils/request/request.js.map +1 -1
  213. package/dist/utils/semverCompare/index.js.map +1 -1
  214. package/dist/utils/semverCompare/semverCompare.js +5 -5
  215. package/dist/utils/semverCompare/semverCompare.js.map +1 -1
  216. package/dist/utils/sendEmail/index.js.map +1 -1
  217. package/dist/utils/sendEmail/sendEmail.js +8 -8
  218. package/dist/utils/sendEmail/sendEmail.js.map +1 -1
  219. package/dist/utils/sendEmail/sendEmail.types.js.map +1 -1
  220. package/dist/utils/sendPush/index.js.map +1 -1
  221. package/dist/utils/sendPush/sendPush.js +5 -5
  222. package/dist/utils/sendPush/sendPush.js.map +1 -1
  223. package/dist/utils/sendPush/sendPush.types.js.map +1 -1
  224. package/dist/utils/tlsConfig/index.js.map +1 -1
  225. package/dist/utils/tlsConfig/tlsConfig.js +2 -2
  226. package/dist/utils/tlsConfig/tlsConfig.js.map +1 -1
  227. package/dist/utils/tlsConfig/tlsConfig.types.js.map +1 -1
  228. package/dist/utils/tlsConfig/tlsConfig.validate.js +2 -2
  229. package/dist/utils/tlsConfig/tlsConfig.validate.js.map +1 -1
  230. package/dist/utils/tlsRequest/index.js.map +1 -1
  231. package/dist/utils/tlsRequest/tlsRequest.js.map +1 -1
  232. package/dist/utils/trimPathSlash/index.js.map +1 -1
  233. package/dist/utils/trimPathSlash/trimPathSlash.js +4 -4
  234. package/dist/utils/trimPathSlash/trimPathSlash.js.map +1 -1
  235. package/eslint.config.mjs +11 -11
  236. package/package.json +164 -161
  237. package/src/const/DebeziumEvent.ts +6 -6
  238. package/src/const/LogSeverity.ts +7 -7
  239. package/src/const/index.ts +5 -5
  240. package/src/const/metrics.ts +6 -6
  241. package/src/const/mime.ts +37 -37
  242. package/src/const/tokenIssuer.ts +9 -9
  243. package/src/db/migrations/20241030121500-create-sequelize-meta-table.ts +29 -29
  244. package/src/db/models/SequelizeMeta.ts +16 -16
  245. package/src/db/models/index.ts +2 -2
  246. package/src/entities/ElasticSearch/ElasticSearch.ts +103 -103
  247. package/src/entities/ElasticSearch/ElasticSearch.types.ts +7 -7
  248. package/src/entities/ElasticSearch/index.ts +2 -2
  249. package/src/entities/Endpoint/Endpoint.test.ts +337 -337
  250. package/src/entities/Endpoint/Endpoint.ts +202 -202
  251. package/src/entities/Endpoint/Endpoint.types.ts +205 -205
  252. package/src/entities/Endpoint/index.ts +2 -2
  253. package/src/entities/EngineError/EngineError.ts +28 -28
  254. package/src/entities/EngineError/EngineError.types.ts +15 -15
  255. package/src/entities/EngineError/index.ts +2 -2
  256. package/src/entities/KeySet/KeySet.test.ts +126 -126
  257. package/src/entities/KeySet/KeySet.ts +172 -172
  258. package/src/entities/KeySet/KeySet.types.ts +28 -28
  259. package/src/entities/KeySet/index.ts +2 -2
  260. package/src/entities/LifecycleController/LifecycleController.test.ts +48 -48
  261. package/src/entities/LifecycleController/LifecycleController.ts +24 -24
  262. package/src/entities/LifecycleController/LifecycleController.types.ts +5 -5
  263. package/src/entities/LifecycleController/index.ts +2 -2
  264. package/src/entities/Localizator/Localizator.ts +139 -139
  265. package/src/entities/Localizator/Localizator.types.ts +52 -52
  266. package/src/entities/Localizator/guessNamingConvention/guessNamingConvention.test.ts +165 -165
  267. package/src/entities/Localizator/guessNamingConvention/guessNamingConvention.ts +58 -58
  268. package/src/entities/Localizator/guessNamingConvention/index.ts +1 -1
  269. package/src/entities/Localizator/index.ts +2 -2
  270. package/src/entities/MessageHandler/MessageHandler.test.ts +130 -130
  271. package/src/entities/MessageHandler/MessageHandler.ts +72 -72
  272. package/src/entities/MessageHandler/MessageHandler.types.ts +15 -15
  273. package/src/entities/MessageHandler/index.ts +2 -2
  274. package/src/entities/PubSub/PubSub.test.ts +297 -297
  275. package/src/entities/PubSub/PubSub.ts +202 -202
  276. package/src/entities/PubSub/PubSub.types.ts +76 -76
  277. package/src/entities/PubSub/handleMessage/handleMessage.test.ts +102 -102
  278. package/src/entities/PubSub/handleMessage/handleMessage.ts +65 -65
  279. package/src/entities/PubSub/handleMessage/index.ts +1 -1
  280. package/src/entities/PubSub/index.ts +2 -2
  281. package/src/entities/PushNotification/PushNotification.test.ts +35 -35
  282. package/src/entities/PushNotification/PushNotification.ts +44 -44
  283. package/src/entities/PushNotification/PushNotification.types.ts +25 -25
  284. package/src/entities/PushNotification/index.ts +2 -2
  285. package/src/entities/Redis/Redis.ts +71 -71
  286. package/src/entities/Redis/Redis.types.ts +19 -19
  287. package/src/entities/Redis/Redis.validate.ts +17 -17
  288. package/src/entities/Redis/index.ts +2 -2
  289. package/src/entities/Sequelize/Sequelize.config.ts +59 -29
  290. package/src/entities/Sequelize/Sequelize.test.ts +21 -21
  291. package/src/entities/Sequelize/Sequelize.ts +75 -75
  292. package/src/entities/Sequelize/Sequelize.types.ts +10 -10
  293. package/src/entities/Sequelize/Sequelize.validate.ts +15 -15
  294. package/src/entities/Sequelize/index.ts +2 -2
  295. package/src/entities/Server/Server.const.ts +56 -56
  296. package/src/entities/Server/Server.test.ts +272 -272
  297. package/src/entities/Server/Server.ts +445 -445
  298. package/src/entities/Server/Server.types.ts +88 -88
  299. package/src/entities/Server/index.ts +2 -2
  300. package/src/entities/SocketClient/SocketClient.test.ts +392 -392
  301. package/src/entities/SocketClient/SocketClient.ts +401 -401
  302. package/src/entities/SocketClient/SocketClient.types.ts +62 -62
  303. package/src/entities/SocketClient/index.ts +2 -2
  304. package/src/entities/SocketClient/parseMessage/index.ts +1 -1
  305. package/src/entities/SocketClient/parseMessage/parseMessage.test.ts +20 -20
  306. package/src/entities/SocketClient/parseMessage/parseMessage.ts +26 -26
  307. package/src/entities/Storage/Storage.test.ts +58 -58
  308. package/src/entities/Storage/Storage.ts +219 -219
  309. package/src/entities/Storage/Storage.types.ts +57 -57
  310. package/src/entities/Storage/index.ts +2 -2
  311. package/src/entities/ValidationError/ValidationError.ts +34 -34
  312. package/src/entities/ValidationError/index.ts +1 -1
  313. package/src/entities/WebError/WebError.test.ts +18 -18
  314. package/src/entities/WebError/WebError.ts +23 -23
  315. package/src/entities/WebError/WebError.types.ts +9 -9
  316. package/src/entities/WebError/index.ts +2 -2
  317. package/src/entities/index.ts +16 -16
  318. package/src/index.ts +4 -4
  319. package/src/metrics/debug.ts +10 -10
  320. package/src/metrics/index.ts +2 -2
  321. package/src/metrics/request.ts +17 -17
  322. package/src/middleware/authAdmin/authAdmin.test.ts +199 -199
  323. package/src/middleware/authAdmin/authAdmin.ts +114 -114
  324. package/src/middleware/authAdmin/authAdmin.types.ts +19 -19
  325. package/src/middleware/authAdmin/index.ts +2 -2
  326. package/src/middleware/authHmac/authHmac.test.ts +86 -86
  327. package/src/middleware/authHmac/authHmac.ts +56 -56
  328. package/src/middleware/authHmac/authHmac.types.ts +7 -7
  329. package/src/middleware/authHmac/index.ts +2 -2
  330. package/src/middleware/authJwt/authJwt.test.ts +54 -54
  331. package/src/middleware/authJwt/authJwt.ts +55 -55
  332. package/src/middleware/authJwt/authJwt.types.ts +14 -14
  333. package/src/middleware/authJwt/index.ts +2 -2
  334. package/src/middleware/authStatic/authStatic.test.ts +36 -36
  335. package/src/middleware/authStatic/authStatic.ts +45 -45
  336. package/src/middleware/authStatic/index.ts +1 -1
  337. package/src/middleware/authTls/authTls.test.ts +138 -138
  338. package/src/middleware/authTls/authTls.ts +106 -106
  339. package/src/middleware/authTls/authTls.types.ts +13 -13
  340. package/src/middleware/authTls/index.ts +2 -2
  341. package/src/middleware/checkPermission/checkPermission.ts +33 -35
  342. package/src/middleware/error/error.test.ts +60 -60
  343. package/src/middleware/error/error.ts +25 -25
  344. package/src/middleware/error/index.ts +1 -1
  345. package/src/middleware/fileUploader/compressAvatar/compressAvatar.ts +25 -25
  346. package/src/middleware/fileUploader/compressAvatar/compressAvatar.types.ts +12 -12
  347. package/src/middleware/fileUploader/compressAvatar/index.ts +2 -2
  348. package/src/middleware/fileUploader/fileUploader.test.ts +310 -310
  349. package/src/middleware/fileUploader/fileUploader.ts +303 -303
  350. package/src/middleware/fileUploader/fileUploader.types.ts +52 -52
  351. package/src/middleware/fileUploader/index.ts +2 -2
  352. package/src/middleware/fileUploader/isMultiPart/index.ts +1 -1
  353. package/src/middleware/fileUploader/isMultiPart/isMultipart.ts +9 -9
  354. package/src/middleware/fileUploader/validate/index.ts +1 -1
  355. package/src/middleware/fileUploader/validate/validate.ts +27 -27
  356. package/src/middleware/fourOhFour/fourOhFour.test.ts +14 -14
  357. package/src/middleware/fourOhFour/fourOhFour.ts +13 -13
  358. package/src/middleware/fourOhFour/index.ts +1 -1
  359. package/src/middleware/geminiFileUploader/geminiFileUploader.ts +117 -117
  360. package/src/middleware/geminiFileUploader/index.ts +1 -1
  361. package/src/middleware/healthCheck/healthCheck.test.ts +12 -12
  362. package/src/middleware/healthCheck/healthCheck.ts +14 -14
  363. package/src/middleware/healthCheck/index.ts +1 -1
  364. package/src/middleware/index.ts +17 -17
  365. package/src/middleware/metrics/index.ts +1 -1
  366. package/src/middleware/metrics/metrics.test.ts +46 -46
  367. package/src/middleware/metrics/metrics.ts +24 -24
  368. package/src/middleware/requestMetrics/index.ts +1 -1
  369. package/src/middleware/requestMetrics/requestMetrics.test.ts +77 -77
  370. package/src/middleware/requestMetrics/requestMetrics.ts +20 -20
  371. package/src/middleware/swaggerDocs/index.ts +2 -2
  372. package/src/middleware/swaggerDocs/swaggerDocs.ts +114 -114
  373. package/src/middleware/swaggerDocs/swaggerDocs.types.ts +41 -41
  374. package/src/middleware/userResolver/index.ts +1 -1
  375. package/src/middleware/userResolver/userResolver.test.ts +35 -35
  376. package/src/middleware/userResolver/userResolver.ts +35 -35
  377. package/src/middleware/validate/index.ts +1 -1
  378. package/src/middleware/validate/validate.test.ts +43 -43
  379. package/src/middleware/validate/validate.ts +25 -25
  380. package/src/middleware/version/index.ts +1 -1
  381. package/src/middleware/version/version.test.ts +23 -23
  382. package/src/middleware/version/version.ts +12 -12
  383. package/src/utils/checkEnvironment/index.ts +49 -49
  384. package/src/utils/createHttpServer/createHttpServer.test.ts +24 -24
  385. package/src/utils/createHttpServer/createHttpServer.ts +34 -34
  386. package/src/utils/createHttpServer/createHttpServer.validate.ts +17 -17
  387. package/src/utils/createHttpServer/index.ts +1 -1
  388. package/src/utils/createSortedObject/createSortedObject.ts +20 -20
  389. package/src/utils/createSortedObject/createSortedObjet.test.ts +47 -47
  390. package/src/utils/createSortedObject/index.ts +1 -1
  391. package/src/utils/dbMigration/dbMigration.test.ts +209 -209
  392. package/src/utils/dbMigration/dbMigration.ts +199 -199
  393. package/src/utils/dbMigration/dbMigration.types.ts +11 -11
  394. package/src/utils/dbMigration/index.ts +2 -2
  395. package/src/utils/dbMigration/migrateMetadataTable/index.ts +1 -1
  396. package/src/utils/dbMigration/migrateMetadataTable/migrateMetadataTable.test.ts +59 -59
  397. package/src/utils/dbMigration/migrateMetadataTable/migrateMetadataTable.ts +102 -70
  398. package/src/utils/envAssert/envAssert.ts +31 -31
  399. package/src/utils/envAssert/index.ts +1 -1
  400. package/src/utils/envAssert/validators/hostList.ts +17 -17
  401. package/src/utils/envAssert/validators/index.ts +5 -5
  402. package/src/utils/envAssert/validators/ipList.ts +13 -13
  403. package/src/utils/envAssert/validators/path.ts +13 -13
  404. package/src/utils/envAssert/validators/string.ts +9 -9
  405. package/src/utils/envAssert/validators/stringList.ts +13 -13
  406. package/src/utils/filter/filter.ts +17 -17
  407. package/src/utils/filter/index.ts +1 -1
  408. package/src/utils/getDynamicLink/getDynamicLink.test.ts +51 -51
  409. package/src/utils/getDynamicLink/getDynamicLink.ts +28 -28
  410. package/src/utils/getDynamicLink/getDynamicLink.types.ts +11 -11
  411. package/src/utils/getDynamicLink/getDynamicLink.validate.ts +6 -6
  412. package/src/utils/getDynamicLink/index.ts +2 -2
  413. package/src/utils/hmac/checkEnv/checkEnv.test.ts +18 -18
  414. package/src/utils/hmac/checkEnv/checkEnv.ts +9 -9
  415. package/src/utils/hmac/checkEnv/index.ts +1 -1
  416. package/src/utils/hmac/createHmac/createHmac.ts +33 -33
  417. package/src/utils/hmac/createHmac/index.ts +1 -1
  418. package/src/utils/hmac/index.ts +4 -4
  419. package/src/utils/hmac/index.types.ts +13 -13
  420. package/src/utils/hmac/signPayload/index.ts +1 -1
  421. package/src/utils/hmac/signPayload/signPayload.ts +16 -16
  422. package/src/utils/hmac/verifySignature/index.ts +1 -1
  423. package/src/utils/hmac/verifySignature/verifySignature.ts +24 -24
  424. package/src/utils/index.ts +26 -26
  425. package/src/utils/jwt/index.ts +2 -2
  426. package/src/utils/jwt/jwt.test.ts +41 -41
  427. package/src/utils/jwt/jwt.ts +204 -204
  428. package/src/utils/jwt/jwt.types.ts +21 -21
  429. package/src/utils/report/index.ts +3 -3
  430. package/src/utils/report/output.ts +45 -45
  431. package/src/utils/report/output.types.ts +70 -70
  432. package/src/utils/report/report.test.ts +133 -133
  433. package/src/utils/report/report.ts +134 -134
  434. package/src/utils/report/report.types.ts +13 -13
  435. package/src/utils/request/index.ts +1 -1
  436. package/src/utils/request/request.test.ts +26 -26
  437. package/src/utils/request/request.ts +48 -48
  438. package/src/utils/semverCompare/index.ts +1 -1
  439. package/src/utils/semverCompare/semverCompare.test.ts +49 -49
  440. package/src/utils/semverCompare/semverCompare.ts +60 -60
  441. package/src/utils/sendEmail/index.ts +1 -1
  442. package/src/utils/sendEmail/sendEmail.ts +27 -27
  443. package/src/utils/sendEmail/sendEmail.types.ts +7 -7
  444. package/src/utils/sendPush/index.ts +2 -2
  445. package/src/utils/sendPush/sendPush.ts +20 -20
  446. package/src/utils/sendPush/sendPush.types.ts +25 -25
  447. package/src/utils/tlsConfig/index.ts +2 -2
  448. package/src/utils/tlsConfig/tlsConfig.test.ts +32 -32
  449. package/src/utils/tlsConfig/tlsConfig.ts +47 -47
  450. package/src/utils/tlsConfig/tlsConfig.types.ts +11 -11
  451. package/src/utils/tlsConfig/tlsConfig.validate.ts +25 -25
  452. package/src/utils/tlsRequest/index.ts +1 -1
  453. package/src/utils/tlsRequest/tlsRequest.test.ts +63 -63
  454. package/src/utils/tlsRequest/tlsRequest.ts +12 -12
  455. package/src/utils/trimPathSlash/index.ts +1 -1
  456. package/src/utils/trimPathSlash/trimPathSlash.test.ts +26 -26
  457. package/src/utils/trimPathSlash/trimPathSlash.ts +8 -8
  458. package/test/env.ts +56 -56
  459. package/test/factory/index.ts +8 -8
  460. package/test/factory/sequelizeMeta.ts +12 -12
  461. package/test/hooks.ts +37 -37
  462. package/test/index.ts +3 -3
  463. package/test/stub/index.ts +3 -3
  464. package/test/stub/stubLocales.ts +68 -68
  465. package/test/stub/stubPubSub.ts +7 -7
  466. package/test/stub/stubStorage.ts +77 -77
  467. package/test/stub/stubStorage.types.ts +11 -11
  468. package/test/utils/app.ts +31 -31
  469. package/test/utils/index.ts +1 -1
  470. package/tsconfig.build.json +5 -5
  471. package/tsconfig.json +32 -32
@@ -1,303 +1,303 @@
1
- import Busboy from 'busboy';
2
- import { Request, Response, NextFunction } from 'express';
3
- import { Schema } from 'express-validator';
4
- import { compressAvatar } from './compressAvatar';
5
- import { FileUploaderConfig } from './fileUploader.types';
6
- import { isMultipart } from './isMultiPart';
7
- import { validate } from './validate';
8
- import { Storage } from 'entities/Storage';
9
- import { WebError } from 'entities/WebError';
10
- import { reportError, reportDebug } from 'utils/report';
11
- import { Readable } from 'stream';
12
-
13
- const namespace = 'engine:middleware:fileUploader';
14
-
15
- /**
16
- * Generate a custom fileUploader middleware
17
- */
18
- export function fileUploader(
19
- options: Array<FileUploaderConfig>,
20
- validator: Schema
21
- ) {
22
- return (
23
- request: Request,
24
- response: Response,
25
- next: NextFunction
26
- ): Busboy.Busboy =>
27
- fileUploaderMiddleware(request, response, next, options, validator);
28
- }
29
-
30
- /** Handle file upload and generic multi-part parsing */
31
- export function fileUploaderMiddleware(
32
- request: Request,
33
- response: Response,
34
- next: NextFunction,
35
- filesOptions: Array<FileUploaderConfig>,
36
- validator: Schema
37
- ): Busboy.Busboy {
38
- reportDebug({
39
- namespace,
40
- message: 'Received request to upload file',
41
- data: { filesOptions, validator }
42
- });
43
- // Check that the request is a proper multipart request
44
- if (!isMultipart(request))
45
- throw new WebError({
46
- statusCode: 415,
47
- errorCode: 'invalid-content-type',
48
- message: 'Request is not of type multipart/form-data',
49
- data: { contentType: request.get('Content-Type') }
50
- });
51
- // If no files to handle ignore
52
- if (!filesOptions.length) next();
53
- // Parse multipart data with Busboy
54
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
55
- const busboy = new (Busboy as any)({
56
- headers: {
57
- ...request.headers,
58
- 'content-type': request.headers['content-type'] ?? ''
59
- }
60
- });
61
-
62
- let hasError = false;
63
-
64
- /**
65
- * Function called when an error happened in the process
66
- * It immediately stops and drains all connection and deletes all files that have already been uploaded
67
- */
68
- function triggerError(error: unknown): void {
69
- pendingWrites--;
70
- if (hasError) return;
71
- hasError = true;
72
- request.unpipe(busboy);
73
- request.on('readable', request.read.bind(request));
74
- busboy.removeAllListeners();
75
- next(error);
76
- if (request.files) {
77
- Object.values(request.files).forEach((files) => {
78
- files.forEach((file) => {
79
- Storage.delete(file.bucket, file.name).catch((error) => {
80
- reportError(error);
81
- });
82
- });
83
- });
84
- }
85
- }
86
-
87
- let readFinished = false;
88
- let fieldsValidated = false;
89
- let pendingWrites = 0;
90
-
91
- /** Function called when all the body has been parsed */
92
- function done(): void {
93
- if (readFinished && pendingWrites === 0 && fieldsValidated && !hasError) {
94
- const uploadedFiles = Object.keys(request.files ?? {});
95
- if (
96
- filesOptions.some(
97
- (options) => options.required && !uploadedFiles.includes(options.key)
98
- )
99
- ) {
100
- triggerError(
101
- new WebError({
102
- statusCode: 400,
103
- errorCode: 'missing-field',
104
- message: 'Some required files have not been uploaded',
105
- data: { filesOptions, validator, uploadedFiles }
106
- })
107
- );
108
- return;
109
- }
110
- next();
111
- }
112
- }
113
-
114
- /*
115
- * On cancel request, while processing
116
- */
117
- request.connection.on('close', function () {
118
- if (!response.writableEnded) triggerError(new Error('Request cancelled'));
119
- });
120
-
121
- /**
122
- * Once all the fields have been read they are checked against the validation schema
123
- */
124
- async function validateFields(): Promise<void> {
125
- try {
126
- await validate(request, validator);
127
- } catch (error) {
128
- triggerError(error);
129
- }
130
- reportDebug({
131
- namespace,
132
- message: 'Validation processed',
133
- data: { hasError, filesOptions, validator }
134
- });
135
- fieldsValidated = true;
136
- done();
137
- }
138
-
139
- busboy.on(
140
- 'file',
141
- (
142
- field: string,
143
- file: Readable,
144
- fileName: string,
145
- encoding: unknown,
146
- mimeType: string
147
- ) => {
148
- (async (): Promise<void> => {
149
- reportDebug({
150
- namespace,
151
- message: 'Found file in request',
152
- data: { hasError, field, fileName, encoding, mimeType, pendingWrites }
153
- });
154
- // Do not handle the stream if there has been an error previously
155
- if (hasError) file.destroy();
156
- pendingWrites++;
157
- // Find related file options based on the field name
158
- const options = filesOptions.find(
159
- (fileOption) => fileOption.key === field
160
- );
161
- // Make sure that the field is in the config
162
- if (!options) {
163
- triggerError(
164
- new WebError({
165
- statusCode: 400,
166
- errorCode: 'invalid-file-field',
167
- message: 'Request contains a file at an invalid field',
168
- hint: { field },
169
- data: { field }
170
- })
171
- );
172
- return;
173
- }
174
- reportDebug({
175
- namespace,
176
- message: 'Found options for file',
177
- data: {
178
- hasError,
179
- field,
180
- fileName,
181
- encoding,
182
- mimeType,
183
- pendingWrites,
184
- options
185
- }
186
- });
187
- // If a specific MIME type is required check it
188
- if (options.mimeTypes && !options.mimeTypes.includes(mimeType)) {
189
- triggerError(
190
- new WebError({
191
- statusCode: 415,
192
- errorCode: 'invalid-mime-type',
193
- message: 'Request contains a file with an invalid MIME type',
194
- hint: { field },
195
- data: { field, mimeType, expected: options.mimeTypes }
196
- })
197
- );
198
- return;
199
- }
200
- // Generate the destination path of the file and upload
201
- reportDebug({
202
- namespace,
203
- message: 'Starting file upload',
204
- data: {
205
- hasError,
206
- field,
207
- fileName,
208
- encoding,
209
- mimeType,
210
- pendingWrites,
211
- options
212
- }
213
- });
214
- try {
215
- const fileToUpload = options.image
216
- ? compressAvatar(file, options.image)
217
- : file;
218
-
219
- const uploadedFile = await Storage.upload(
220
- fileToUpload,
221
- options.bucket,
222
- {
223
- directory: options.path,
224
- mime: mimeType,
225
- noExtension: options.noExtension
226
- },
227
- {
228
- metadata: { contentType: mimeType }
229
- },
230
- { maxSize: options.maxSize }
231
- );
232
-
233
- reportDebug({
234
- namespace,
235
- message: 'File uploaded',
236
- data: {
237
- hasError,
238
- field,
239
- fileName,
240
- encoding,
241
- mimeType,
242
- pendingWrites,
243
- options,
244
- uploadedFile
245
- }
246
- });
247
- if (hasError) {
248
- // If some other failed before this one terminated
249
- // Delete file
250
- await Storage.delete(uploadedFile.bucket, uploadedFile.name);
251
- } else {
252
- // Handle successful upload
253
- // Add the file's data to the request
254
- pendingWrites--;
255
- if (!request.files) request.files = {};
256
- if (!request.files[field]) request.files[field] = [];
257
- request.files[field].push({
258
- ...uploadedFile,
259
- originalFileName: fileName
260
- });
261
- done();
262
- }
263
- } catch (error) {
264
- triggerError(error);
265
- }
266
- })().catch((error) => {
267
- triggerError(error);
268
- });
269
- }
270
- );
271
-
272
- /**
273
- * Handle non file fields
274
- * These fields will be pushed to the body as array of strings
275
- */
276
- busboy.on('field', (fieldName: string, value: unknown) => {
277
- if (!request.body) request.body = {};
278
-
279
- if (request.body[fieldName]) {
280
- request.body[fieldName].push(value);
281
- } else {
282
- request.body[fieldName] = [value];
283
- }
284
- });
285
- busboy.on('error', function (error: unknown) {
286
- triggerError(error);
287
- });
288
- busboy.on('finish', () => {
289
- (async (): Promise<void> => {
290
- reportDebug({
291
- namespace,
292
- message: 'Busboy finished reading',
293
- data: { hasError, filesOptions, validator, pendingWrites }
294
- });
295
- readFinished = true;
296
- await validateFields();
297
- done();
298
- })().catch((error) => {
299
- triggerError(error);
300
- });
301
- });
302
- return request.pipe(busboy);
303
- }
1
+ import Busboy from 'busboy';
2
+ import { Request, Response, NextFunction } from 'express';
3
+ import { Schema } from 'express-validator';
4
+ import { compressAvatar } from './compressAvatar';
5
+ import { FileUploaderConfig } from './fileUploader.types';
6
+ import { isMultipart } from './isMultiPart';
7
+ import { validate } from './validate';
8
+ import { Storage } from 'entities/Storage';
9
+ import { WebError } from 'entities/WebError';
10
+ import { reportError, reportDebug } from 'utils/report';
11
+ import { Readable } from 'stream';
12
+
13
+ const namespace = 'engine:middleware:fileUploader';
14
+
15
+ /**
16
+ * Generate a custom fileUploader middleware
17
+ */
18
+ export function fileUploader(
19
+ options: Array<FileUploaderConfig>,
20
+ validator: Schema
21
+ ) {
22
+ return (
23
+ request: Request,
24
+ response: Response,
25
+ next: NextFunction
26
+ ): Busboy.Busboy =>
27
+ fileUploaderMiddleware(request, response, next, options, validator);
28
+ }
29
+
30
+ /** Handle file upload and generic multi-part parsing */
31
+ export function fileUploaderMiddleware(
32
+ request: Request,
33
+ response: Response,
34
+ next: NextFunction,
35
+ filesOptions: Array<FileUploaderConfig>,
36
+ validator: Schema
37
+ ): Busboy.Busboy {
38
+ reportDebug({
39
+ namespace,
40
+ message: 'Received request to upload file',
41
+ data: { filesOptions, validator }
42
+ });
43
+ // Check that the request is a proper multipart request
44
+ if (!isMultipart(request))
45
+ throw new WebError({
46
+ statusCode: 415,
47
+ errorCode: 'invalid-content-type',
48
+ message: 'Request is not of type multipart/form-data',
49
+ data: { contentType: request.get('Content-Type') }
50
+ });
51
+ // If no files to handle ignore
52
+ if (!filesOptions.length) next();
53
+ // Parse multipart data with Busboy
54
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
55
+ const busboy = new (Busboy as any)({
56
+ headers: {
57
+ ...request.headers,
58
+ 'content-type': request.headers['content-type'] ?? ''
59
+ }
60
+ });
61
+
62
+ let hasError = false;
63
+
64
+ /**
65
+ * Function called when an error happened in the process
66
+ * It immediately stops and drains all connection and deletes all files that have already been uploaded
67
+ */
68
+ function triggerError(error: unknown): void {
69
+ pendingWrites--;
70
+ if (hasError) return;
71
+ hasError = true;
72
+ request.unpipe(busboy);
73
+ request.on('readable', request.read.bind(request));
74
+ busboy.removeAllListeners();
75
+ next(error);
76
+ if (request.files) {
77
+ Object.values(request.files).forEach((files) => {
78
+ files.forEach((file) => {
79
+ Storage.delete(file.bucket, file.name).catch((error) => {
80
+ reportError(error);
81
+ });
82
+ });
83
+ });
84
+ }
85
+ }
86
+
87
+ let readFinished = false;
88
+ let fieldsValidated = false;
89
+ let pendingWrites = 0;
90
+
91
+ /** Function called when all the body has been parsed */
92
+ function done(): void {
93
+ if (readFinished && pendingWrites === 0 && fieldsValidated && !hasError) {
94
+ const uploadedFiles = Object.keys(request.files ?? {});
95
+ if (
96
+ filesOptions.some(
97
+ (options) => options.required && !uploadedFiles.includes(options.key)
98
+ )
99
+ ) {
100
+ triggerError(
101
+ new WebError({
102
+ statusCode: 400,
103
+ errorCode: 'missing-field',
104
+ message: 'Some required files have not been uploaded',
105
+ data: { filesOptions, validator, uploadedFiles }
106
+ })
107
+ );
108
+ return;
109
+ }
110
+ next();
111
+ }
112
+ }
113
+
114
+ /*
115
+ * On cancel request, while processing
116
+ */
117
+ request.connection.on('close', function () {
118
+ if (!response.writableEnded) triggerError(new Error('Request cancelled'));
119
+ });
120
+
121
+ /**
122
+ * Once all the fields have been read they are checked against the validation schema
123
+ */
124
+ async function validateFields(): Promise<void> {
125
+ try {
126
+ await validate(request, validator);
127
+ } catch (error) {
128
+ triggerError(error);
129
+ }
130
+ reportDebug({
131
+ namespace,
132
+ message: 'Validation processed',
133
+ data: { hasError, filesOptions, validator }
134
+ });
135
+ fieldsValidated = true;
136
+ done();
137
+ }
138
+
139
+ busboy.on(
140
+ 'file',
141
+ (
142
+ field: string,
143
+ file: Readable,
144
+ fileName: string,
145
+ encoding: unknown,
146
+ mimeType: string
147
+ ) => {
148
+ (async (): Promise<void> => {
149
+ reportDebug({
150
+ namespace,
151
+ message: 'Found file in request',
152
+ data: { hasError, field, fileName, encoding, mimeType, pendingWrites }
153
+ });
154
+ // Do not handle the stream if there has been an error previously
155
+ if (hasError) file.destroy();
156
+ pendingWrites++;
157
+ // Find related file options based on the field name
158
+ const options = filesOptions.find(
159
+ (fileOption) => fileOption.key === field
160
+ );
161
+ // Make sure that the field is in the config
162
+ if (!options) {
163
+ triggerError(
164
+ new WebError({
165
+ statusCode: 400,
166
+ errorCode: 'invalid-file-field',
167
+ message: 'Request contains a file at an invalid field',
168
+ hint: { field },
169
+ data: { field }
170
+ })
171
+ );
172
+ return;
173
+ }
174
+ reportDebug({
175
+ namespace,
176
+ message: 'Found options for file',
177
+ data: {
178
+ hasError,
179
+ field,
180
+ fileName,
181
+ encoding,
182
+ mimeType,
183
+ pendingWrites,
184
+ options
185
+ }
186
+ });
187
+ // If a specific MIME type is required check it
188
+ if (options.mimeTypes && !options.mimeTypes.includes(mimeType)) {
189
+ triggerError(
190
+ new WebError({
191
+ statusCode: 415,
192
+ errorCode: 'invalid-mime-type',
193
+ message: 'Request contains a file with an invalid MIME type',
194
+ hint: { field },
195
+ data: { field, mimeType, expected: options.mimeTypes }
196
+ })
197
+ );
198
+ return;
199
+ }
200
+ // Generate the destination path of the file and upload
201
+ reportDebug({
202
+ namespace,
203
+ message: 'Starting file upload',
204
+ data: {
205
+ hasError,
206
+ field,
207
+ fileName,
208
+ encoding,
209
+ mimeType,
210
+ pendingWrites,
211
+ options
212
+ }
213
+ });
214
+ try {
215
+ const fileToUpload = options.image
216
+ ? compressAvatar(file, options.image)
217
+ : file;
218
+
219
+ const uploadedFile = await Storage.upload(
220
+ fileToUpload,
221
+ options.bucket,
222
+ {
223
+ directory: options.path,
224
+ mime: mimeType,
225
+ noExtension: options.noExtension
226
+ },
227
+ {
228
+ metadata: { contentType: mimeType }
229
+ },
230
+ { maxSize: options.maxSize }
231
+ );
232
+
233
+ reportDebug({
234
+ namespace,
235
+ message: 'File uploaded',
236
+ data: {
237
+ hasError,
238
+ field,
239
+ fileName,
240
+ encoding,
241
+ mimeType,
242
+ pendingWrites,
243
+ options,
244
+ uploadedFile
245
+ }
246
+ });
247
+ if (hasError) {
248
+ // If some other failed before this one terminated
249
+ // Delete file
250
+ await Storage.delete(uploadedFile.bucket, uploadedFile.name);
251
+ } else {
252
+ // Handle successful upload
253
+ // Add the file's data to the request
254
+ pendingWrites--;
255
+ if (!request.files) request.files = {};
256
+ if (!request.files[field]) request.files[field] = [];
257
+ request.files[field].push({
258
+ ...uploadedFile,
259
+ originalFileName: fileName
260
+ });
261
+ done();
262
+ }
263
+ } catch (error) {
264
+ triggerError(error);
265
+ }
266
+ })().catch((error) => {
267
+ triggerError(error);
268
+ });
269
+ }
270
+ );
271
+
272
+ /**
273
+ * Handle non file fields
274
+ * These fields will be pushed to the body as array of strings
275
+ */
276
+ busboy.on('field', (fieldName: string, value: unknown) => {
277
+ if (!request.body) request.body = {};
278
+
279
+ if (request.body[fieldName]) {
280
+ request.body[fieldName].push(value);
281
+ } else {
282
+ request.body[fieldName] = [value];
283
+ }
284
+ });
285
+ busboy.on('error', function (error: unknown) {
286
+ triggerError(error);
287
+ });
288
+ busboy.on('finish', () => {
289
+ (async (): Promise<void> => {
290
+ reportDebug({
291
+ namespace,
292
+ message: 'Busboy finished reading',
293
+ data: { hasError, filesOptions, validator, pendingWrites }
294
+ });
295
+ readFinished = true;
296
+ await validateFields();
297
+ done();
298
+ })().catch((error) => {
299
+ triggerError(error);
300
+ });
301
+ });
302
+ return request.pipe(busboy);
303
+ }