node-server-engine 1.1.4 → 1.1.5

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 (468) 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 -991
  7. package/babel.config.json +34 -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 +1 -0
  16. package/dist/db/models/SequelizeMeta.js.map +1 -1
  17. package/dist/db/models/index.js.map +1 -1
  18. package/dist/entities/ElasticSearch/ElasticSearch.js +7 -7
  19. package/dist/entities/ElasticSearch/ElasticSearch.js.map +1 -1
  20. package/dist/entities/ElasticSearch/ElasticSearch.types.js.map +1 -1
  21. package/dist/entities/ElasticSearch/index.js.map +1 -1
  22. package/dist/entities/Endpoint/Endpoint.js +18 -17
  23. package/dist/entities/Endpoint/Endpoint.js.map +1 -1
  24. package/dist/entities/Endpoint/Endpoint.types.js.map +1 -1
  25. package/dist/entities/Endpoint/index.js.map +1 -1
  26. package/dist/entities/EngineError/EngineError.js +7 -6
  27. package/dist/entities/EngineError/EngineError.js.map +1 -1
  28. package/dist/entities/EngineError/EngineError.types.js.map +1 -1
  29. package/dist/entities/EngineError/index.js.map +1 -1
  30. package/dist/entities/KeySet/KeySet.js +10 -9
  31. package/dist/entities/KeySet/KeySet.js.map +1 -1
  32. package/dist/entities/KeySet/KeySet.types.js.map +1 -1
  33. package/dist/entities/KeySet/index.js.map +1 -1
  34. package/dist/entities/LifecycleController/LifecycleController.js.map +1 -1
  35. package/dist/entities/LifecycleController/LifecycleController.types.js.map +1 -1
  36. package/dist/entities/LifecycleController/index.js.map +1 -1
  37. package/dist/entities/Localizator/Localizator.js +7 -7
  38. package/dist/entities/Localizator/Localizator.js.map +1 -1
  39. package/dist/entities/Localizator/Localizator.types.js.map +1 -1
  40. package/dist/entities/Localizator/guessNamingConvention/guessNamingConvention.js.map +1 -1
  41. package/dist/entities/Localizator/guessNamingConvention/index.js.map +1 -1
  42. package/dist/entities/Localizator/index.js.map +1 -1
  43. package/dist/entities/MessageHandler/MessageHandler.js +7 -6
  44. package/dist/entities/MessageHandler/MessageHandler.js.map +1 -1
  45. package/dist/entities/MessageHandler/MessageHandler.types.js.map +1 -1
  46. package/dist/entities/MessageHandler/index.js.map +1 -1
  47. package/dist/entities/PubSub/PubSub.js +25 -25
  48. package/dist/entities/PubSub/PubSub.js.map +1 -1
  49. package/dist/entities/PubSub/PubSub.types.js.map +1 -1
  50. package/dist/entities/PubSub/handleMessage/handleMessage.js +6 -6
  51. package/dist/entities/PubSub/handleMessage/handleMessage.js.map +1 -1
  52. package/dist/entities/PubSub/handleMessage/index.js.map +1 -1
  53. package/dist/entities/PubSub/index.js.map +1 -1
  54. package/dist/entities/PushNotification/PushNotification.js +4 -4
  55. package/dist/entities/PushNotification/PushNotification.js.map +1 -1
  56. package/dist/entities/PushNotification/PushNotification.types.js.map +1 -1
  57. package/dist/entities/PushNotification/index.js.map +1 -1
  58. package/dist/entities/Redis/Redis.js +8 -8
  59. package/dist/entities/Redis/Redis.js.map +1 -1
  60. package/dist/entities/Redis/Redis.types.js.map +1 -1
  61. package/dist/entities/Redis/Redis.validate.js +2 -2
  62. package/dist/entities/Redis/Redis.validate.js.map +1 -1
  63. package/dist/entities/Redis/index.js.map +1 -1
  64. package/dist/entities/Sequelize/Sequelize.config.js.map +1 -1
  65. package/dist/entities/Sequelize/Sequelize.js +2 -2
  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 +18 -17
  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 +33 -32
  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 +7 -6
  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.js.map +1 -1
  115. package/dist/middleware/error/error.js.map +1 -1
  116. package/dist/middleware/error/index.js.map +1 -1
  117. package/dist/middleware/fileUploader/compressAvatar/compressAvatar.js +2 -2
  118. package/dist/middleware/fileUploader/compressAvatar/compressAvatar.js.map +1 -1
  119. package/dist/middleware/fileUploader/compressAvatar/compressAvatar.types.js.map +1 -1
  120. package/dist/middleware/fileUploader/compressAvatar/index.js.map +1 -1
  121. package/dist/middleware/fileUploader/fileUploader.js +12 -12
  122. package/dist/middleware/fileUploader/fileUploader.js.map +1 -1
  123. package/dist/middleware/fileUploader/fileUploader.types.js.map +1 -1
  124. package/dist/middleware/fileUploader/index.js.map +1 -1
  125. package/dist/middleware/fileUploader/isMultiPart/index.js.map +1 -1
  126. package/dist/middleware/fileUploader/isMultiPart/isMultipart.js.map +1 -1
  127. package/dist/middleware/fileUploader/validate/index.js.map +1 -1
  128. package/dist/middleware/fileUploader/validate/validate.js.map +1 -1
  129. package/dist/middleware/fourOhFour/fourOhFour.js.map +1 -1
  130. package/dist/middleware/fourOhFour/index.js.map +1 -1
  131. package/dist/middleware/geminiFileUploader/geminiFileUploader.js.map +1 -1
  132. package/dist/middleware/geminiFileUploader/index.js.map +1 -1
  133. package/dist/middleware/healthCheck/healthCheck.js +2 -2
  134. package/dist/middleware/healthCheck/healthCheck.js.map +1 -1
  135. package/dist/middleware/healthCheck/index.js.map +1 -1
  136. package/dist/middleware/index.js.map +1 -1
  137. package/dist/middleware/metrics/index.js.map +1 -1
  138. package/dist/middleware/metrics/metrics.js.map +1 -1
  139. package/dist/middleware/requestMetrics/index.js.map +1 -1
  140. package/dist/middleware/requestMetrics/requestMetrics.js.map +1 -1
  141. package/dist/middleware/swaggerDocs/index.js.map +1 -1
  142. package/dist/middleware/swaggerDocs/swaggerDocs.js +7 -7
  143. package/dist/middleware/swaggerDocs/swaggerDocs.js.map +1 -1
  144. package/dist/middleware/swaggerDocs/swaggerDocs.types.js.map +1 -1
  145. package/dist/middleware/userResolver/index.js.map +1 -1
  146. package/dist/middleware/userResolver/userResolver.js.map +1 -1
  147. package/dist/middleware/validate/index.js.map +1 -1
  148. package/dist/middleware/validate/validate.js.map +1 -1
  149. package/dist/middleware/version/index.js.map +1 -1
  150. package/dist/middleware/version/version.js +3 -3
  151. package/dist/middleware/version/version.js.map +1 -1
  152. package/dist/utils/checkEnvironment/index.js +13 -13
  153. package/dist/utils/checkEnvironment/index.js.map +1 -1
  154. package/dist/utils/createHttpServer/createHttpServer.js.map +1 -1
  155. package/dist/utils/createHttpServer/createHttpServer.validate.js +2 -2
  156. package/dist/utils/createHttpServer/createHttpServer.validate.js.map +1 -1
  157. package/dist/utils/createHttpServer/index.js.map +1 -1
  158. package/dist/utils/createSortedObject/createSortedObject.js.map +1 -1
  159. package/dist/utils/createSortedObject/index.js.map +1 -1
  160. package/dist/utils/dbMigration/dbMigration.js +8 -8
  161. package/dist/utils/dbMigration/dbMigration.js.map +1 -1
  162. package/dist/utils/dbMigration/dbMigration.types.js.map +1 -1
  163. package/dist/utils/dbMigration/index.js.map +1 -1
  164. package/dist/utils/dbMigration/migrateMetadataTable/index.js.map +1 -1
  165. package/dist/utils/dbMigration/migrateMetadataTable/migrateMetadataTable.js +4 -4
  166. package/dist/utils/dbMigration/migrateMetadataTable/migrateMetadataTable.js.map +1 -1
  167. package/dist/utils/envAssert/envAssert.js +6 -6
  168. package/dist/utils/envAssert/envAssert.js.map +1 -1
  169. package/dist/utils/envAssert/index.js.map +1 -1
  170. package/dist/utils/envAssert/validators/hostList.js +2 -2
  171. package/dist/utils/envAssert/validators/hostList.js.map +1 -1
  172. package/dist/utils/envAssert/validators/index.js.map +1 -1
  173. package/dist/utils/envAssert/validators/ipList.js +2 -2
  174. package/dist/utils/envAssert/validators/ipList.js.map +1 -1
  175. package/dist/utils/envAssert/validators/path.js +2 -2
  176. package/dist/utils/envAssert/validators/path.js.map +1 -1
  177. package/dist/utils/envAssert/validators/string.js +2 -2
  178. package/dist/utils/envAssert/validators/string.js.map +1 -1
  179. package/dist/utils/envAssert/validators/stringList.js +3 -3
  180. package/dist/utils/envAssert/validators/stringList.js.map +1 -1
  181. package/dist/utils/filter/filter.js +4 -4
  182. package/dist/utils/filter/filter.js.map +1 -1
  183. package/dist/utils/filter/index.js.map +1 -1
  184. package/dist/utils/getDynamicLink/getDynamicLink.js.map +1 -1
  185. package/dist/utils/getDynamicLink/getDynamicLink.types.js.map +1 -1
  186. package/dist/utils/getDynamicLink/getDynamicLink.validate.js.map +1 -1
  187. package/dist/utils/getDynamicLink/index.js.map +1 -1
  188. package/dist/utils/hmac/checkEnv/checkEnv.js +2 -2
  189. package/dist/utils/hmac/checkEnv/checkEnv.js.map +1 -1
  190. package/dist/utils/hmac/checkEnv/index.js.map +1 -1
  191. package/dist/utils/hmac/createHmac/createHmac.js.map +1 -1
  192. package/dist/utils/hmac/createHmac/index.js.map +1 -1
  193. package/dist/utils/hmac/index.js.map +1 -1
  194. package/dist/utils/hmac/index.types.js.map +1 -1
  195. package/dist/utils/hmac/signPayload/index.js.map +1 -1
  196. package/dist/utils/hmac/signPayload/signPayload.js.map +1 -1
  197. package/dist/utils/hmac/verifySignature/index.js.map +1 -1
  198. package/dist/utils/hmac/verifySignature/verifySignature.js.map +1 -1
  199. package/dist/utils/index.js.map +1 -1
  200. package/dist/utils/jwt/index.js.map +1 -1
  201. package/dist/utils/jwt/jwt.js.map +1 -1
  202. package/dist/utils/jwt/jwt.types.js.map +1 -1
  203. package/dist/utils/report/index.js.map +1 -1
  204. package/dist/utils/report/output.js.map +1 -1
  205. package/dist/utils/report/output.types.js.map +1 -1
  206. package/dist/utils/report/report.js.map +1 -1
  207. package/dist/utils/report/report.types.js.map +1 -1
  208. package/dist/utils/request/index.js.map +1 -1
  209. package/dist/utils/request/request.js.map +1 -1
  210. package/dist/utils/semverCompare/index.js.map +1 -1
  211. package/dist/utils/semverCompare/semverCompare.js +5 -5
  212. package/dist/utils/semverCompare/semverCompare.js.map +1 -1
  213. package/dist/utils/sendEmail/index.js.map +1 -1
  214. package/dist/utils/sendEmail/sendEmail.js +8 -8
  215. package/dist/utils/sendEmail/sendEmail.js.map +1 -1
  216. package/dist/utils/sendEmail/sendEmail.types.js.map +1 -1
  217. package/dist/utils/sendPush/index.js.map +1 -1
  218. package/dist/utils/sendPush/sendPush.js +5 -5
  219. package/dist/utils/sendPush/sendPush.js.map +1 -1
  220. package/dist/utils/sendPush/sendPush.types.js.map +1 -1
  221. package/dist/utils/tlsConfig/index.js.map +1 -1
  222. package/dist/utils/tlsConfig/tlsConfig.js +2 -2
  223. package/dist/utils/tlsConfig/tlsConfig.js.map +1 -1
  224. package/dist/utils/tlsConfig/tlsConfig.types.js.map +1 -1
  225. package/dist/utils/tlsConfig/tlsConfig.validate.js +2 -2
  226. package/dist/utils/tlsConfig/tlsConfig.validate.js.map +1 -1
  227. package/dist/utils/tlsRequest/index.js.map +1 -1
  228. package/dist/utils/tlsRequest/tlsRequest.js.map +1 -1
  229. package/dist/utils/trimPathSlash/index.js.map +1 -1
  230. package/dist/utils/trimPathSlash/trimPathSlash.js +4 -4
  231. package/dist/utils/trimPathSlash/trimPathSlash.js.map +1 -1
  232. package/eslint.config.mjs +11 -11
  233. package/package.json +159 -164
  234. package/src/const/DebeziumEvent.ts +6 -6
  235. package/src/const/LogSeverity.ts +7 -7
  236. package/src/const/index.ts +5 -5
  237. package/src/const/metrics.ts +6 -6
  238. package/src/const/mime.ts +37 -37
  239. package/src/const/tokenIssuer.ts +9 -9
  240. package/src/db/migrations/20241030121500-create-sequelize-meta-table.ts +29 -29
  241. package/src/db/models/SequelizeMeta.ts +16 -16
  242. package/src/db/models/index.ts +2 -2
  243. package/src/entities/ElasticSearch/ElasticSearch.ts +103 -103
  244. package/src/entities/ElasticSearch/ElasticSearch.types.ts +7 -7
  245. package/src/entities/ElasticSearch/index.ts +2 -2
  246. package/src/entities/Endpoint/Endpoint.test.ts +337 -337
  247. package/src/entities/Endpoint/Endpoint.ts +202 -202
  248. package/src/entities/Endpoint/Endpoint.types.ts +205 -205
  249. package/src/entities/Endpoint/index.ts +2 -2
  250. package/src/entities/EngineError/EngineError.ts +28 -28
  251. package/src/entities/EngineError/EngineError.types.ts +15 -15
  252. package/src/entities/EngineError/index.ts +2 -2
  253. package/src/entities/KeySet/KeySet.test.ts +126 -126
  254. package/src/entities/KeySet/KeySet.ts +172 -172
  255. package/src/entities/KeySet/KeySet.types.ts +28 -28
  256. package/src/entities/KeySet/index.ts +2 -2
  257. package/src/entities/LifecycleController/LifecycleController.test.ts +48 -48
  258. package/src/entities/LifecycleController/LifecycleController.ts +24 -24
  259. package/src/entities/LifecycleController/LifecycleController.types.ts +5 -5
  260. package/src/entities/LifecycleController/index.ts +2 -2
  261. package/src/entities/Localizator/Localizator.ts +139 -139
  262. package/src/entities/Localizator/Localizator.types.ts +52 -52
  263. package/src/entities/Localizator/guessNamingConvention/guessNamingConvention.test.ts +165 -165
  264. package/src/entities/Localizator/guessNamingConvention/guessNamingConvention.ts +58 -58
  265. package/src/entities/Localizator/guessNamingConvention/index.ts +1 -1
  266. package/src/entities/Localizator/index.ts +2 -2
  267. package/src/entities/MessageHandler/MessageHandler.test.ts +130 -130
  268. package/src/entities/MessageHandler/MessageHandler.ts +72 -72
  269. package/src/entities/MessageHandler/MessageHandler.types.ts +15 -15
  270. package/src/entities/MessageHandler/index.ts +2 -2
  271. package/src/entities/PubSub/PubSub.test.ts +297 -297
  272. package/src/entities/PubSub/PubSub.ts +202 -202
  273. package/src/entities/PubSub/PubSub.types.ts +76 -76
  274. package/src/entities/PubSub/handleMessage/handleMessage.test.ts +102 -102
  275. package/src/entities/PubSub/handleMessage/handleMessage.ts +65 -65
  276. package/src/entities/PubSub/handleMessage/index.ts +1 -1
  277. package/src/entities/PubSub/index.ts +2 -2
  278. package/src/entities/PushNotification/PushNotification.test.ts +35 -35
  279. package/src/entities/PushNotification/PushNotification.ts +44 -44
  280. package/src/entities/PushNotification/PushNotification.types.ts +25 -25
  281. package/src/entities/PushNotification/index.ts +2 -2
  282. package/src/entities/Redis/Redis.ts +71 -71
  283. package/src/entities/Redis/Redis.types.ts +19 -19
  284. package/src/entities/Redis/Redis.validate.ts +17 -17
  285. package/src/entities/Redis/index.ts +2 -2
  286. package/src/entities/Sequelize/Sequelize.config.ts +59 -59
  287. package/src/entities/Sequelize/Sequelize.test.ts +21 -21
  288. package/src/entities/Sequelize/Sequelize.ts +75 -75
  289. package/src/entities/Sequelize/Sequelize.types.ts +10 -10
  290. package/src/entities/Sequelize/Sequelize.validate.ts +15 -15
  291. package/src/entities/Sequelize/index.ts +2 -2
  292. package/src/entities/Server/Server.const.ts +56 -56
  293. package/src/entities/Server/Server.test.ts +272 -272
  294. package/src/entities/Server/Server.ts +445 -445
  295. package/src/entities/Server/Server.types.ts +88 -88
  296. package/src/entities/Server/index.ts +2 -2
  297. package/src/entities/SocketClient/SocketClient.test.ts +392 -392
  298. package/src/entities/SocketClient/SocketClient.ts +401 -401
  299. package/src/entities/SocketClient/SocketClient.types.ts +62 -62
  300. package/src/entities/SocketClient/index.ts +2 -2
  301. package/src/entities/SocketClient/parseMessage/index.ts +1 -1
  302. package/src/entities/SocketClient/parseMessage/parseMessage.test.ts +20 -20
  303. package/src/entities/SocketClient/parseMessage/parseMessage.ts +26 -26
  304. package/src/entities/Storage/Storage.test.ts +58 -58
  305. package/src/entities/Storage/Storage.ts +219 -219
  306. package/src/entities/Storage/Storage.types.ts +57 -57
  307. package/src/entities/Storage/index.ts +2 -2
  308. package/src/entities/ValidationError/ValidationError.ts +34 -34
  309. package/src/entities/ValidationError/index.ts +1 -1
  310. package/src/entities/WebError/WebError.test.ts +18 -18
  311. package/src/entities/WebError/WebError.ts +23 -23
  312. package/src/entities/WebError/WebError.types.ts +9 -9
  313. package/src/entities/WebError/index.ts +2 -2
  314. package/src/entities/index.ts +16 -16
  315. package/src/index.ts +4 -4
  316. package/src/metrics/debug.ts +10 -10
  317. package/src/metrics/index.ts +2 -2
  318. package/src/metrics/request.ts +17 -17
  319. package/src/middleware/authAdmin/authAdmin.test.ts +199 -199
  320. package/src/middleware/authAdmin/authAdmin.ts +114 -114
  321. package/src/middleware/authAdmin/authAdmin.types.ts +19 -19
  322. package/src/middleware/authAdmin/index.ts +2 -2
  323. package/src/middleware/authHmac/authHmac.test.ts +86 -86
  324. package/src/middleware/authHmac/authHmac.ts +56 -56
  325. package/src/middleware/authHmac/authHmac.types.ts +7 -7
  326. package/src/middleware/authHmac/index.ts +2 -2
  327. package/src/middleware/authJwt/authJwt.test.ts +54 -54
  328. package/src/middleware/authJwt/authJwt.ts +55 -55
  329. package/src/middleware/authJwt/authJwt.types.ts +14 -14
  330. package/src/middleware/authJwt/index.ts +2 -2
  331. package/src/middleware/authStatic/authStatic.test.ts +36 -36
  332. package/src/middleware/authStatic/authStatic.ts +45 -45
  333. package/src/middleware/authStatic/index.ts +1 -1
  334. package/src/middleware/authTls/authTls.test.ts +138 -138
  335. package/src/middleware/authTls/authTls.ts +106 -106
  336. package/src/middleware/authTls/authTls.types.ts +13 -13
  337. package/src/middleware/authTls/index.ts +2 -2
  338. package/src/middleware/checkPermission/checkPermission.ts +32 -32
  339. package/src/middleware/error/error.test.ts +60 -60
  340. package/src/middleware/error/error.ts +25 -25
  341. package/src/middleware/error/index.ts +1 -1
  342. package/src/middleware/fileUploader/compressAvatar/compressAvatar.ts +25 -25
  343. package/src/middleware/fileUploader/compressAvatar/compressAvatar.types.ts +12 -12
  344. package/src/middleware/fileUploader/compressAvatar/index.ts +2 -2
  345. package/src/middleware/fileUploader/fileUploader.test.ts +310 -310
  346. package/src/middleware/fileUploader/fileUploader.ts +303 -303
  347. package/src/middleware/fileUploader/fileUploader.types.ts +52 -52
  348. package/src/middleware/fileUploader/index.ts +2 -2
  349. package/src/middleware/fileUploader/isMultiPart/index.ts +1 -1
  350. package/src/middleware/fileUploader/isMultiPart/isMultipart.ts +9 -9
  351. package/src/middleware/fileUploader/validate/index.ts +1 -1
  352. package/src/middleware/fileUploader/validate/validate.ts +27 -27
  353. package/src/middleware/fourOhFour/fourOhFour.test.ts +14 -14
  354. package/src/middleware/fourOhFour/fourOhFour.ts +13 -13
  355. package/src/middleware/fourOhFour/index.ts +1 -1
  356. package/src/middleware/geminiFileUploader/geminiFileUploader.ts +117 -117
  357. package/src/middleware/geminiFileUploader/index.ts +1 -1
  358. package/src/middleware/healthCheck/healthCheck.test.ts +12 -12
  359. package/src/middleware/healthCheck/healthCheck.ts +14 -14
  360. package/src/middleware/healthCheck/index.ts +1 -1
  361. package/src/middleware/index.ts +17 -17
  362. package/src/middleware/metrics/index.ts +1 -1
  363. package/src/middleware/metrics/metrics.test.ts +46 -46
  364. package/src/middleware/metrics/metrics.ts +24 -24
  365. package/src/middleware/requestMetrics/index.ts +1 -1
  366. package/src/middleware/requestMetrics/requestMetrics.test.ts +77 -77
  367. package/src/middleware/requestMetrics/requestMetrics.ts +20 -20
  368. package/src/middleware/swaggerDocs/index.ts +2 -2
  369. package/src/middleware/swaggerDocs/swaggerDocs.ts +114 -114
  370. package/src/middleware/swaggerDocs/swaggerDocs.types.ts +41 -41
  371. package/src/middleware/userResolver/index.ts +1 -1
  372. package/src/middleware/userResolver/userResolver.test.ts +35 -35
  373. package/src/middleware/userResolver/userResolver.ts +35 -35
  374. package/src/middleware/validate/index.ts +1 -1
  375. package/src/middleware/validate/validate.test.ts +43 -43
  376. package/src/middleware/validate/validate.ts +25 -25
  377. package/src/middleware/version/index.ts +1 -1
  378. package/src/middleware/version/version.test.ts +23 -23
  379. package/src/middleware/version/version.ts +12 -12
  380. package/src/utils/checkEnvironment/index.ts +49 -49
  381. package/src/utils/createHttpServer/createHttpServer.test.ts +24 -24
  382. package/src/utils/createHttpServer/createHttpServer.ts +34 -34
  383. package/src/utils/createHttpServer/createHttpServer.validate.ts +17 -17
  384. package/src/utils/createHttpServer/index.ts +1 -1
  385. package/src/utils/createSortedObject/createSortedObject.ts +20 -20
  386. package/src/utils/createSortedObject/createSortedObjet.test.ts +47 -47
  387. package/src/utils/createSortedObject/index.ts +1 -1
  388. package/src/utils/dbMigration/dbMigration.test.ts +209 -209
  389. package/src/utils/dbMigration/dbMigration.ts +199 -199
  390. package/src/utils/dbMigration/dbMigration.types.ts +11 -11
  391. package/src/utils/dbMigration/index.ts +2 -2
  392. package/src/utils/dbMigration/migrateMetadataTable/index.ts +1 -1
  393. package/src/utils/dbMigration/migrateMetadataTable/migrateMetadataTable.test.ts +59 -59
  394. package/src/utils/dbMigration/migrateMetadataTable/migrateMetadataTable.ts +102 -102
  395. package/src/utils/envAssert/envAssert.ts +31 -31
  396. package/src/utils/envAssert/index.ts +1 -1
  397. package/src/utils/envAssert/validators/hostList.ts +17 -17
  398. package/src/utils/envAssert/validators/index.ts +5 -5
  399. package/src/utils/envAssert/validators/ipList.ts +13 -13
  400. package/src/utils/envAssert/validators/path.ts +13 -13
  401. package/src/utils/envAssert/validators/string.ts +9 -9
  402. package/src/utils/envAssert/validators/stringList.ts +13 -13
  403. package/src/utils/filter/filter.ts +17 -17
  404. package/src/utils/filter/index.ts +1 -1
  405. package/src/utils/getDynamicLink/getDynamicLink.test.ts +51 -51
  406. package/src/utils/getDynamicLink/getDynamicLink.ts +28 -28
  407. package/src/utils/getDynamicLink/getDynamicLink.types.ts +11 -11
  408. package/src/utils/getDynamicLink/getDynamicLink.validate.ts +6 -6
  409. package/src/utils/getDynamicLink/index.ts +2 -2
  410. package/src/utils/hmac/checkEnv/checkEnv.test.ts +18 -18
  411. package/src/utils/hmac/checkEnv/checkEnv.ts +9 -9
  412. package/src/utils/hmac/checkEnv/index.ts +1 -1
  413. package/src/utils/hmac/createHmac/createHmac.ts +33 -33
  414. package/src/utils/hmac/createHmac/index.ts +1 -1
  415. package/src/utils/hmac/index.ts +4 -4
  416. package/src/utils/hmac/index.types.ts +13 -13
  417. package/src/utils/hmac/signPayload/index.ts +1 -1
  418. package/src/utils/hmac/signPayload/signPayload.ts +16 -16
  419. package/src/utils/hmac/verifySignature/index.ts +1 -1
  420. package/src/utils/hmac/verifySignature/verifySignature.ts +24 -24
  421. package/src/utils/index.ts +26 -26
  422. package/src/utils/jwt/index.ts +2 -2
  423. package/src/utils/jwt/jwt.test.ts +41 -41
  424. package/src/utils/jwt/jwt.ts +204 -204
  425. package/src/utils/jwt/jwt.types.ts +21 -21
  426. package/src/utils/report/index.ts +3 -3
  427. package/src/utils/report/output.ts +45 -45
  428. package/src/utils/report/output.types.ts +70 -70
  429. package/src/utils/report/report.test.ts +133 -133
  430. package/src/utils/report/report.ts +134 -134
  431. package/src/utils/report/report.types.ts +13 -13
  432. package/src/utils/request/index.ts +1 -1
  433. package/src/utils/request/request.test.ts +26 -26
  434. package/src/utils/request/request.ts +48 -48
  435. package/src/utils/semverCompare/index.ts +1 -1
  436. package/src/utils/semverCompare/semverCompare.test.ts +49 -49
  437. package/src/utils/semverCompare/semverCompare.ts +60 -60
  438. package/src/utils/sendEmail/index.ts +1 -1
  439. package/src/utils/sendEmail/sendEmail.ts +27 -27
  440. package/src/utils/sendEmail/sendEmail.types.ts +7 -7
  441. package/src/utils/sendPush/index.ts +2 -2
  442. package/src/utils/sendPush/sendPush.ts +20 -20
  443. package/src/utils/sendPush/sendPush.types.ts +25 -25
  444. package/src/utils/tlsConfig/index.ts +2 -2
  445. package/src/utils/tlsConfig/tlsConfig.test.ts +32 -32
  446. package/src/utils/tlsConfig/tlsConfig.ts +47 -47
  447. package/src/utils/tlsConfig/tlsConfig.types.ts +11 -11
  448. package/src/utils/tlsConfig/tlsConfig.validate.ts +25 -25
  449. package/src/utils/tlsRequest/index.ts +1 -1
  450. package/src/utils/tlsRequest/tlsRequest.test.ts +63 -63
  451. package/src/utils/tlsRequest/tlsRequest.ts +12 -12
  452. package/src/utils/trimPathSlash/index.ts +1 -1
  453. package/src/utils/trimPathSlash/trimPathSlash.test.ts +26 -26
  454. package/src/utils/trimPathSlash/trimPathSlash.ts +8 -8
  455. package/test/env.ts +56 -56
  456. package/test/factory/index.ts +8 -8
  457. package/test/factory/sequelizeMeta.ts +12 -12
  458. package/test/hooks.ts +37 -37
  459. package/test/index.ts +3 -3
  460. package/test/stub/index.ts +3 -3
  461. package/test/stub/stubLocales.ts +68 -68
  462. package/test/stub/stubPubSub.ts +7 -7
  463. package/test/stub/stubStorage.ts +77 -77
  464. package/test/stub/stubStorage.types.ts +11 -11
  465. package/test/utils/app.ts +31 -31
  466. package/test/utils/index.ts +1 -1
  467. package/tsconfig.build.json +5 -5
  468. package/tsconfig.json +32 -32
@@ -1,297 +1,297 @@
1
- import {
2
- PubSub as PubsubClient,
3
- IAM,
4
- Topic,
5
- Subscription
6
- } from '@google-cloud/pubsub';
7
- import { expect } from 'chai';
8
- import { faker } from '@faker-js/faker';
9
- import { stub, fake, match, SinonSpy, SinonStub } from 'sinon';
10
- import { PubSub } from './PubSub';
11
- import { EngineError } from 'entities/EngineError';
12
-
13
- describe('Entities - Pub/Sub', function () {
14
- let topicExistsFake: SinonSpy;
15
- let topicIamFake: SinonSpy;
16
- let topicPublishFake: SinonSpy;
17
- let topicFlushFake: SinonSpy;
18
- let topicStub: SinonStub;
19
- let subscriptionExistsFake: SinonSpy;
20
- let subscriptionIamFake: SinonSpy;
21
- let subscriptionOnFake: SinonSpy;
22
- let subscriptionCloseFake: SinonSpy;
23
- let subscriptionStub: SinonStub;
24
-
25
- beforeEach(() => {
26
- topicExistsFake = fake.resolves([true]);
27
-
28
- topicIamFake = fake(async (permissions: Array<string>) =>
29
- permissions.reduce(
30
- (result, permission) => {
31
- result[0][permission] = true;
32
- return result;
33
- },
34
- [{} as Record<string, boolean>]
35
- )
36
- );
37
- topicPublishFake = fake.resolves(undefined);
38
- topicFlushFake = fake.resolves(undefined);
39
- topicStub = stub(PubsubClient.prototype, 'topic').callsFake(
40
- () =>
41
- ({
42
- exists: topicExistsFake,
43
- iam: { testPermissions: topicIamFake } as unknown as IAM,
44
- publishMessage: topicPublishFake,
45
- flush: topicFlushFake
46
- }) as unknown as Topic
47
- );
48
-
49
- subscriptionExistsFake = fake.resolves([true]);
50
-
51
- subscriptionIamFake = fake(async (permissions: Array<string>) =>
52
- permissions.reduce(
53
- (result, permission) => {
54
- result[0][permission] = true;
55
- return result;
56
- },
57
- [{} as Record<string, boolean>]
58
- )
59
- );
60
- subscriptionOnFake = fake();
61
- subscriptionCloseFake = fake.resolves(undefined);
62
- subscriptionStub = stub(PubsubClient.prototype, 'subscription').callsFake(
63
- () =>
64
- ({
65
- exists: subscriptionExistsFake,
66
- iam: { testPermissions: subscriptionIamFake } as unknown as IAM,
67
- on: subscriptionOnFake,
68
- close: subscriptionCloseFake
69
- }) as unknown as Subscription
70
- );
71
- });
72
-
73
- afterEach(async () => {
74
- await PubSub.shutdown();
75
- });
76
-
77
- describe('addPublisher', () => {
78
- it('should register a publisher only once', () => {
79
- const topic = faker.lorem.slug();
80
-
81
- PubSub.addPublisher(topic);
82
- PubSub.addPublisher(topic);
83
- PubSub.addPublisher(topic);
84
-
85
- expect(topicStub).to.have.been.calledOnceWithExactly(topic, match.object);
86
- });
87
-
88
- it('should register multiple publishers', () => {
89
- const [topic1, topic2, topic3] = [
90
- faker.lorem.slug(),
91
- faker.lorem.slug(),
92
- faker.lorem.slug()
93
- ];
94
-
95
- PubSub.addPublisher(topic1);
96
- PubSub.addPublisher([topic2, topic3]);
97
-
98
- expect(topicStub).to.have.been.callCount(3);
99
- expect(topicStub).to.have.been.calledWithExactly(topic1, match.object);
100
- expect(topicStub).to.have.been.calledWithExactly(topic2, match.object);
101
- expect(topicStub).to.have.been.calledWithExactly(topic3, match.object);
102
- });
103
- });
104
-
105
- describe('addSubscriber', () => {
106
- it('should register a subscription only once', () => {
107
- const subscription = faker.lorem.slug();
108
- const handler = fake();
109
-
110
- PubSub.addSubscriber(subscription, handler);
111
- PubSub.addSubscriber(subscription, handler);
112
- PubSub.addSubscriber(subscription, handler);
113
-
114
- expect(subscriptionStub).to.have.been.calledOnceWithExactly(
115
- subscription,
116
- match.object
117
- );
118
- });
119
-
120
- it('should register a subscription and making them run first when a new message arrives', () => {
121
- const subscription = faker.lorem.slug();
122
- const handler = fake();
123
-
124
- PubSub.addSubscriber(subscription, handler, { first: true });
125
- expect(subscriptionStub).to.have.been.calledOnceWithExactly(
126
- subscription,
127
- match.object
128
- );
129
- });
130
-
131
- it('should register a subscription with debezium events', () => {
132
- const subscription = faker.lorem.slug();
133
- const handler = fake();
134
-
135
- PubSub.addSubscriber(subscription, handler, { isDebezium: true });
136
- expect(subscriptionStub).to.have.been.calledOnceWithExactly(
137
- subscription,
138
- match.object
139
- );
140
- });
141
-
142
- it('should register multiple subscriptions', () => {
143
- const handler = fake();
144
- const [subscription1, subscription2, subscription3] = [
145
- faker.lorem.slug(),
146
- faker.lorem.slug(),
147
- faker.lorem.slug()
148
- ];
149
-
150
- PubSub.addSubscriber(subscription1, handler);
151
- PubSub.addSubscriber(subscription2, handler);
152
- PubSub.addSubscriber(subscription3, handler);
153
-
154
- expect(subscriptionStub).to.have.been.callCount(3);
155
- expect(subscriptionStub).to.have.been.calledWithExactly(
156
- subscription1,
157
- match.object
158
- );
159
- expect(subscriptionStub).to.have.been.calledWithExactly(
160
- subscription2,
161
- match.object
162
- );
163
- expect(subscriptionStub).to.have.been.calledWithExactly(
164
- subscription3,
165
- match.object
166
- );
167
- });
168
- });
169
-
170
- describe('init', () => {
171
- it('should throw an error if a topic does not exist', async () => {
172
- topicExistsFake = fake.resolves([false]);
173
-
174
- PubSub.addPublisher(faker.lorem.slug());
175
-
176
- await expect(PubSub.init()).to.be.rejectedWith(EngineError);
177
- });
178
-
179
- it('should throw an error if an instance has no permission on the topic', async () => {
180
- topicIamFake = fake(async (permissions: Array<string>) =>
181
- permissions.reduce(
182
- (result, permission) => {
183
- result[0][permission] = false;
184
- return result;
185
- },
186
- [{} as Record<string, boolean>]
187
- )
188
- );
189
-
190
- PubSub.addPublisher(faker.lorem.slug());
191
-
192
- await expect(PubSub.init()).to.be.rejectedWith(EngineError);
193
- });
194
-
195
- it('should throw an error if a subscription does not exist', async () => {
196
- const handler = fake();
197
- subscriptionExistsFake = fake.resolves([false]);
198
-
199
- PubSub.addSubscriber(faker.lorem.slug(), handler);
200
-
201
- await expect(PubSub.init()).to.be.rejectedWith(EngineError);
202
- });
203
-
204
- it('should throw an error if an instance has no permission on the subscription', async () => {
205
- const handler = fake();
206
-
207
- subscriptionIamFake = fake(async (permissions: Array<string>) =>
208
- permissions.reduce(
209
- (result, permission) => {
210
- result[0][permission] = false;
211
- return result;
212
- },
213
- [{} as Record<string, boolean>]
214
- )
215
- );
216
-
217
- PubSub.addSubscriber(faker.lorem.slug(), handler);
218
-
219
- await expect(PubSub.init()).to.be.rejectedWith(EngineError);
220
- });
221
-
222
- it('should successfully init', async () => {
223
- const topic = faker.lorem.slug();
224
- const subscription = faker.lorem.slug();
225
- const subscriptionHandler = fake();
226
-
227
- PubSub.addPublisher(topic);
228
- PubSub.addSubscriber(subscription, subscriptionHandler);
229
-
230
- await PubSub.init();
231
-
232
- expect(topicExistsFake).to.have.been.calledOnceWithExactly();
233
- expect(topicIamFake).to.have.been.calledOnceWithExactly([
234
- 'pubsub.topics.publish'
235
- ]);
236
- expect(subscriptionExistsFake).to.have.been.calledOnceWithExactly();
237
- expect(subscriptionIamFake).to.have.been.calledOnceWithExactly([
238
- 'pubsub.subscriptions.consume'
239
- ]);
240
- expect(subscriptionOnFake).to.have.been.calledOnceWithExactly(
241
- 'message',
242
- match.func
243
- );
244
- });
245
- });
246
-
247
- describe('shutdown', () => {
248
- it('should flush all publishers', async () => {
249
- PubSub.addPublisher([
250
- faker.lorem.slug(),
251
- faker.lorem.slug(),
252
- faker.lorem.slug()
253
- ]);
254
-
255
- await PubSub.shutdown();
256
-
257
- expect(topicFlushFake).to.have.callCount(3);
258
- });
259
-
260
- it('should close all subscriptions', async () => {
261
- const handler = fake();
262
- PubSub.addSubscriber(faker.lorem.slug(), handler);
263
- PubSub.addSubscriber(faker.lorem.slug(), handler);
264
- PubSub.addSubscriber(faker.lorem.slug(), handler);
265
-
266
- await PubSub.shutdown();
267
-
268
- expect(subscriptionCloseFake).to.have.callCount(3);
269
- });
270
- });
271
-
272
- describe('publish', () => {
273
- it('should throw an error if the topi was not previously declared', async () => {
274
- const message = { [faker.lorem.word()]: faker.lorem.word() };
275
- const attributes = { [faker.lorem.word()]: faker.lorem.word() };
276
-
277
- await expect(
278
- PubSub.publish(faker.lorem.slug(), message, attributes)
279
- ).to.be.rejectedWith(EngineError);
280
- });
281
-
282
- it('should publish a message', async () => {
283
- const topic = faker.lorem.slug();
284
- const message = { [faker.lorem.word()]: faker.lorem.word() };
285
- const attributes = { [faker.lorem.word()]: faker.lorem.word() };
286
-
287
- PubSub.addPublisher(topic);
288
- await PubSub.publish(topic, message, attributes);
289
-
290
- expect(topicPublishFake).to.have.been.calledOnceWithExactly({
291
- json: message,
292
- attributes,
293
- orderingKey: undefined
294
- });
295
- });
296
- });
297
- });
1
+ import {
2
+ PubSub as PubsubClient,
3
+ IAM,
4
+ Topic,
5
+ Subscription
6
+ } from '@google-cloud/pubsub';
7
+ import { expect } from 'chai';
8
+ import { faker } from '@faker-js/faker';
9
+ import { stub, fake, match, SinonSpy, SinonStub } from 'sinon';
10
+ import { PubSub } from './PubSub';
11
+ import { EngineError } from 'entities/EngineError';
12
+
13
+ describe('Entities - Pub/Sub', function () {
14
+ let topicExistsFake: SinonSpy;
15
+ let topicIamFake: SinonSpy;
16
+ let topicPublishFake: SinonSpy;
17
+ let topicFlushFake: SinonSpy;
18
+ let topicStub: SinonStub;
19
+ let subscriptionExistsFake: SinonSpy;
20
+ let subscriptionIamFake: SinonSpy;
21
+ let subscriptionOnFake: SinonSpy;
22
+ let subscriptionCloseFake: SinonSpy;
23
+ let subscriptionStub: SinonStub;
24
+
25
+ beforeEach(() => {
26
+ topicExistsFake = fake.resolves([true]);
27
+
28
+ topicIamFake = fake(async (permissions: Array<string>) =>
29
+ permissions.reduce(
30
+ (result, permission) => {
31
+ result[0][permission] = true;
32
+ return result;
33
+ },
34
+ [{} as Record<string, boolean>]
35
+ )
36
+ );
37
+ topicPublishFake = fake.resolves(undefined);
38
+ topicFlushFake = fake.resolves(undefined);
39
+ topicStub = stub(PubsubClient.prototype, 'topic').callsFake(
40
+ () =>
41
+ ({
42
+ exists: topicExistsFake,
43
+ iam: { testPermissions: topicIamFake } as unknown as IAM,
44
+ publishMessage: topicPublishFake,
45
+ flush: topicFlushFake
46
+ }) as unknown as Topic
47
+ );
48
+
49
+ subscriptionExistsFake = fake.resolves([true]);
50
+
51
+ subscriptionIamFake = fake(async (permissions: Array<string>) =>
52
+ permissions.reduce(
53
+ (result, permission) => {
54
+ result[0][permission] = true;
55
+ return result;
56
+ },
57
+ [{} as Record<string, boolean>]
58
+ )
59
+ );
60
+ subscriptionOnFake = fake();
61
+ subscriptionCloseFake = fake.resolves(undefined);
62
+ subscriptionStub = stub(PubsubClient.prototype, 'subscription').callsFake(
63
+ () =>
64
+ ({
65
+ exists: subscriptionExistsFake,
66
+ iam: { testPermissions: subscriptionIamFake } as unknown as IAM,
67
+ on: subscriptionOnFake,
68
+ close: subscriptionCloseFake
69
+ }) as unknown as Subscription
70
+ );
71
+ });
72
+
73
+ afterEach(async () => {
74
+ await PubSub.shutdown();
75
+ });
76
+
77
+ describe('addPublisher', () => {
78
+ it('should register a publisher only once', () => {
79
+ const topic = faker.lorem.slug();
80
+
81
+ PubSub.addPublisher(topic);
82
+ PubSub.addPublisher(topic);
83
+ PubSub.addPublisher(topic);
84
+
85
+ expect(topicStub).to.have.been.calledOnceWithExactly(topic, match.object);
86
+ });
87
+
88
+ it('should register multiple publishers', () => {
89
+ const [topic1, topic2, topic3] = [
90
+ faker.lorem.slug(),
91
+ faker.lorem.slug(),
92
+ faker.lorem.slug()
93
+ ];
94
+
95
+ PubSub.addPublisher(topic1);
96
+ PubSub.addPublisher([topic2, topic3]);
97
+
98
+ expect(topicStub).to.have.been.callCount(3);
99
+ expect(topicStub).to.have.been.calledWithExactly(topic1, match.object);
100
+ expect(topicStub).to.have.been.calledWithExactly(topic2, match.object);
101
+ expect(topicStub).to.have.been.calledWithExactly(topic3, match.object);
102
+ });
103
+ });
104
+
105
+ describe('addSubscriber', () => {
106
+ it('should register a subscription only once', () => {
107
+ const subscription = faker.lorem.slug();
108
+ const handler = fake();
109
+
110
+ PubSub.addSubscriber(subscription, handler);
111
+ PubSub.addSubscriber(subscription, handler);
112
+ PubSub.addSubscriber(subscription, handler);
113
+
114
+ expect(subscriptionStub).to.have.been.calledOnceWithExactly(
115
+ subscription,
116
+ match.object
117
+ );
118
+ });
119
+
120
+ it('should register a subscription and making them run first when a new message arrives', () => {
121
+ const subscription = faker.lorem.slug();
122
+ const handler = fake();
123
+
124
+ PubSub.addSubscriber(subscription, handler, { first: true });
125
+ expect(subscriptionStub).to.have.been.calledOnceWithExactly(
126
+ subscription,
127
+ match.object
128
+ );
129
+ });
130
+
131
+ it('should register a subscription with debezium events', () => {
132
+ const subscription = faker.lorem.slug();
133
+ const handler = fake();
134
+
135
+ PubSub.addSubscriber(subscription, handler, { isDebezium: true });
136
+ expect(subscriptionStub).to.have.been.calledOnceWithExactly(
137
+ subscription,
138
+ match.object
139
+ );
140
+ });
141
+
142
+ it('should register multiple subscriptions', () => {
143
+ const handler = fake();
144
+ const [subscription1, subscription2, subscription3] = [
145
+ faker.lorem.slug(),
146
+ faker.lorem.slug(),
147
+ faker.lorem.slug()
148
+ ];
149
+
150
+ PubSub.addSubscriber(subscription1, handler);
151
+ PubSub.addSubscriber(subscription2, handler);
152
+ PubSub.addSubscriber(subscription3, handler);
153
+
154
+ expect(subscriptionStub).to.have.been.callCount(3);
155
+ expect(subscriptionStub).to.have.been.calledWithExactly(
156
+ subscription1,
157
+ match.object
158
+ );
159
+ expect(subscriptionStub).to.have.been.calledWithExactly(
160
+ subscription2,
161
+ match.object
162
+ );
163
+ expect(subscriptionStub).to.have.been.calledWithExactly(
164
+ subscription3,
165
+ match.object
166
+ );
167
+ });
168
+ });
169
+
170
+ describe('init', () => {
171
+ it('should throw an error if a topic does not exist', async () => {
172
+ topicExistsFake = fake.resolves([false]);
173
+
174
+ PubSub.addPublisher(faker.lorem.slug());
175
+
176
+ await expect(PubSub.init()).to.be.rejectedWith(EngineError);
177
+ });
178
+
179
+ it('should throw an error if an instance has no permission on the topic', async () => {
180
+ topicIamFake = fake(async (permissions: Array<string>) =>
181
+ permissions.reduce(
182
+ (result, permission) => {
183
+ result[0][permission] = false;
184
+ return result;
185
+ },
186
+ [{} as Record<string, boolean>]
187
+ )
188
+ );
189
+
190
+ PubSub.addPublisher(faker.lorem.slug());
191
+
192
+ await expect(PubSub.init()).to.be.rejectedWith(EngineError);
193
+ });
194
+
195
+ it('should throw an error if a subscription does not exist', async () => {
196
+ const handler = fake();
197
+ subscriptionExistsFake = fake.resolves([false]);
198
+
199
+ PubSub.addSubscriber(faker.lorem.slug(), handler);
200
+
201
+ await expect(PubSub.init()).to.be.rejectedWith(EngineError);
202
+ });
203
+
204
+ it('should throw an error if an instance has no permission on the subscription', async () => {
205
+ const handler = fake();
206
+
207
+ subscriptionIamFake = fake(async (permissions: Array<string>) =>
208
+ permissions.reduce(
209
+ (result, permission) => {
210
+ result[0][permission] = false;
211
+ return result;
212
+ },
213
+ [{} as Record<string, boolean>]
214
+ )
215
+ );
216
+
217
+ PubSub.addSubscriber(faker.lorem.slug(), handler);
218
+
219
+ await expect(PubSub.init()).to.be.rejectedWith(EngineError);
220
+ });
221
+
222
+ it('should successfully init', async () => {
223
+ const topic = faker.lorem.slug();
224
+ const subscription = faker.lorem.slug();
225
+ const subscriptionHandler = fake();
226
+
227
+ PubSub.addPublisher(topic);
228
+ PubSub.addSubscriber(subscription, subscriptionHandler);
229
+
230
+ await PubSub.init();
231
+
232
+ expect(topicExistsFake).to.have.been.calledOnceWithExactly();
233
+ expect(topicIamFake).to.have.been.calledOnceWithExactly([
234
+ 'pubsub.topics.publish'
235
+ ]);
236
+ expect(subscriptionExistsFake).to.have.been.calledOnceWithExactly();
237
+ expect(subscriptionIamFake).to.have.been.calledOnceWithExactly([
238
+ 'pubsub.subscriptions.consume'
239
+ ]);
240
+ expect(subscriptionOnFake).to.have.been.calledOnceWithExactly(
241
+ 'message',
242
+ match.func
243
+ );
244
+ });
245
+ });
246
+
247
+ describe('shutdown', () => {
248
+ it('should flush all publishers', async () => {
249
+ PubSub.addPublisher([
250
+ faker.lorem.slug(),
251
+ faker.lorem.slug(),
252
+ faker.lorem.slug()
253
+ ]);
254
+
255
+ await PubSub.shutdown();
256
+
257
+ expect(topicFlushFake).to.have.callCount(3);
258
+ });
259
+
260
+ it('should close all subscriptions', async () => {
261
+ const handler = fake();
262
+ PubSub.addSubscriber(faker.lorem.slug(), handler);
263
+ PubSub.addSubscriber(faker.lorem.slug(), handler);
264
+ PubSub.addSubscriber(faker.lorem.slug(), handler);
265
+
266
+ await PubSub.shutdown();
267
+
268
+ expect(subscriptionCloseFake).to.have.callCount(3);
269
+ });
270
+ });
271
+
272
+ describe('publish', () => {
273
+ it('should throw an error if the topi was not previously declared', async () => {
274
+ const message = { [faker.lorem.word()]: faker.lorem.word() };
275
+ const attributes = { [faker.lorem.word()]: faker.lorem.word() };
276
+
277
+ await expect(
278
+ PubSub.publish(faker.lorem.slug(), message, attributes)
279
+ ).to.be.rejectedWith(EngineError);
280
+ });
281
+
282
+ it('should publish a message', async () => {
283
+ const topic = faker.lorem.slug();
284
+ const message = { [faker.lorem.word()]: faker.lorem.word() };
285
+ const attributes = { [faker.lorem.word()]: faker.lorem.word() };
286
+
287
+ PubSub.addPublisher(topic);
288
+ await PubSub.publish(topic, message, attributes);
289
+
290
+ expect(topicPublishFake).to.have.been.calledOnceWithExactly({
291
+ json: message,
292
+ attributes,
293
+ orderingKey: undefined
294
+ });
295
+ });
296
+ });
297
+ });