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,392 +1,392 @@
1
- import { randomUUID } from 'crypto';
2
- import { generateAccessToken } from 'backend-test-tools';
3
- import Ajv, { JSONSchemaType } from 'ajv';
4
- import { expect } from 'chai';
5
- import { faker } from '@faker-js/faker';
6
- import { Sequelize } from 'sequelize';
7
- import { fake, stub, match } from 'sinon';
8
- import WS from 'ws';
9
- import { SocketClient } from './SocketClient';
10
- import { SocketMessage } from './SocketClient.types';
11
- import { MessageHandler } from 'entities/MessageHandler';
12
- import { Server } from 'entities/Server';
13
- import { stubPubSub } from 'test';
14
- import { httpsAgent, loadTlsConfig } from 'utils';
15
-
16
- /** */
17
- interface AuthTestMessagePayload {
18
- /** Is the user authenticated */
19
- authenticated: boolean;
20
- /** Id of the user when authenticated */
21
- userId?: string;
22
- }
23
- type AuthTestMessage = SocketMessage<AuthTestMessagePayload>;
24
-
25
- const schema: JSONSchemaType<string> = { type: 'string' };
26
- const stringPayloadValidator = new Ajv().compile(schema);
27
-
28
- describe('Entity SocketClient', () => {
29
- before(() => {
30
- if (!httpsAgent) loadTlsConfig();
31
- });
32
-
33
- beforeEach(() => {
34
- stub(Sequelize.prototype, 'close');
35
- stubPubSub();
36
- });
37
-
38
- it('should authenticate a user with WebsSocket [auth-service]', (done) => {
39
- const type = faker.lorem.word();
40
- const payload = faker.lorem.word();
41
- const userId = randomUUID();
42
- const token = generateAccessToken(userId);
43
-
44
- // The handler will return a fake message
45
- const handler = fake((payload: unknown, client: SocketClient) => {
46
- client.sendMessage(type, {
47
- authenticated: client.isAuthenticated(),
48
- userId: client.getUser()?.userId
49
- });
50
- });
51
-
52
- const messageHandler = new MessageHandler(
53
- type,
54
- handler,
55
- stringPayloadValidator
56
- );
57
-
58
- const server = new Server({
59
- endpoints: [],
60
- webSocket: {
61
- server: { path: '/ws' },
62
- client: { handlers: [messageHandler] }
63
- }
64
- });
65
-
66
- server
67
- .init()
68
- .then(() => {
69
- const ws = new WS(`wss://localhost:${process.env.PORT as string}/ws`, {
70
- agent: httpsAgent
71
- });
72
-
73
- // When the connection is established we send a message
74
- ws.on('open', () => {
75
- ws.send(JSON.stringify({ type: 'authenticate', payload: { token } }));
76
- ws.send(JSON.stringify({ type, payload }));
77
- });
78
-
79
- // We check that we correctly received the return message
80
- ws.on('message', (message: Buffer) => {
81
- const parsedMessage = JSON.parse(
82
- message.toString('utf-8')
83
- ) as AuthTestMessage;
84
-
85
- expect(parsedMessage).to.deep.equal({
86
- type,
87
- payload: { userId, authenticated: true }
88
- });
89
-
90
- server
91
- .shutdown()
92
- .then(() => {
93
- done();
94
- })
95
- .catch((error) => {
96
- done(error);
97
- });
98
- });
99
- })
100
- .catch((error) => {
101
- done(error);
102
- });
103
- });
104
-
105
- it('should send message even user is not authenticated when noAuth options set as true', (done) => {
106
- const type = faker.lorem.word();
107
- const payload = faker.lorem.word();
108
-
109
- // The handler will return a fake message
110
- const handler = fake((payload: unknown, client: SocketClient) => {
111
- // noAuth options set as true
112
- client.sendMessage(type, payload, { noAuth: true });
113
- });
114
-
115
- const messageHandler = new MessageHandler(
116
- type,
117
- handler,
118
- stringPayloadValidator,
119
- {
120
- authenticated: false
121
- }
122
- );
123
-
124
- const server = new Server({
125
- endpoints: [],
126
- webSocket: {
127
- server: { path: '/ws' },
128
- client: { handlers: [messageHandler] }
129
- }
130
- });
131
-
132
- server
133
- .init()
134
- .then(() => {
135
- const ws = new WS(`wss://localhost:${process.env.PORT as string}/ws`, {
136
- agent: httpsAgent
137
- });
138
-
139
- // When the connection is established we send a message
140
- ws.on('open', () => {
141
- ws.send(JSON.stringify({ type, payload }));
142
- });
143
-
144
- // We check that we correctly received the return message
145
- ws.on('message', (message) => {
146
- const parsedMessage = JSON.parse(
147
- message.toString('utf-8')
148
- ) as AuthTestMessage;
149
- expect(parsedMessage).to.deep.equal({
150
- type,
151
- payload
152
- });
153
- server
154
- .shutdown()
155
- .then(() => {
156
- done();
157
- })
158
- .catch((error) => {
159
- done(error);
160
- });
161
- });
162
- })
163
- .catch((error) => {
164
- done(error);
165
- });
166
- });
167
-
168
- it('should send message on user authenticated with given audience', (done) => {
169
- const type = faker.lorem.word();
170
- const payload = faker.lorem.word();
171
- const userId = randomUUID();
172
- const token = generateAccessToken(userId);
173
-
174
- // The handler will return a fake message
175
- const handler = fake((payload: unknown, client: SocketClient) => {
176
- client.sendMessage(
177
- type,
178
- {
179
- authenticated: client.isAuthenticated(),
180
- userId: client.getUser()?.userId
181
- },
182
- { audience: process.env.ACCESS_TOKEN_AUDIENCE as string }
183
- );
184
- });
185
- const messageHandler = new MessageHandler(
186
- type,
187
- handler,
188
- stringPayloadValidator
189
- );
190
-
191
- const server = new Server({
192
- endpoints: [],
193
- webSocket: {
194
- server: { path: '/ws' },
195
- client: { handlers: [messageHandler] }
196
- }
197
- });
198
-
199
- server
200
- .init()
201
- .then(() => {
202
- const ws = new WS(`wss://localhost:${process.env.PORT as string}/ws`, {
203
- agent: httpsAgent
204
- });
205
-
206
- // When the connection is established we send a message
207
- ws.on('open', () => {
208
- ws.send(JSON.stringify({ type: 'authenticate', payload: { token } }));
209
- ws.send(JSON.stringify({ type, payload }));
210
- });
211
-
212
- // We check that we correctly received the return message
213
- ws.on('message', (message) => {
214
- const parsedMessage = JSON.parse(
215
- message.toString('utf-8')
216
- ) as AuthTestMessage;
217
-
218
- expect(parsedMessage).to.deep.equal({
219
- type,
220
- payload: { userId, authenticated: true }
221
- });
222
-
223
- server
224
- .shutdown()
225
- .then(() => {
226
- done();
227
- })
228
- .catch((error) => {
229
- done(error);
230
- });
231
- });
232
- })
233
- .catch((error) => {
234
- done(error);
235
- });
236
- });
237
-
238
- it('should handle the auth callback', (done) => {
239
- const type = faker.lorem.word();
240
- const payload = faker.lorem.word();
241
- const userId = randomUUID();
242
- const token = generateAccessToken(userId);
243
- const authCallback = fake();
244
-
245
- // The handler will return a fake message
246
- const handler = fake((payload: unknown, client: SocketClient) => {
247
- client.sendMessage(type, {
248
- authenticated: client.isAuthenticated(),
249
- userId: client.getUser()?.userId
250
- });
251
- });
252
- const messageHandler = new MessageHandler(
253
- type,
254
- handler,
255
- stringPayloadValidator
256
- );
257
-
258
- const server = new Server({
259
- endpoints: [],
260
- webSocket: {
261
- server: { path: '/ws' },
262
- client: { handlers: [messageHandler], authCallbacks: authCallback }
263
- }
264
- });
265
-
266
- server
267
- .init()
268
- .then(() => {
269
- const ws = new WS(`wss://localhost:${process.env.PORT as string}/ws`, {
270
- agent: httpsAgent
271
- });
272
-
273
- // When the connection is established we send a message
274
- ws.on('open', () => {
275
- ws.send(JSON.stringify({ type: 'authenticate', payload: { token } }));
276
- ws.send(JSON.stringify({ type, payload }));
277
- });
278
-
279
- ws.on('message', () => {
280
- expect(authCallback).to.have.been.calledOnceWithExactly(
281
- match.instanceOf(SocketClient)
282
- );
283
-
284
- server
285
- .shutdown()
286
- .then(() => {
287
- done();
288
- })
289
- .catch((error) => {
290
- done(error);
291
- });
292
- });
293
- })
294
- .catch((error) => {
295
- done(error);
296
- });
297
- });
298
-
299
- it('should call init an shutdown callbacks', (done) => {
300
- const initCallbacks = fake();
301
- const shutdownCallbacks = fake();
302
-
303
- const server = new Server({
304
- endpoints: [],
305
- webSocket: {
306
- server: { path: '/ws' },
307
- client: { handlers: [], initCallbacks, shutdownCallbacks }
308
- }
309
- });
310
-
311
- server
312
- .init()
313
- .then(() => {
314
- const ws = new WS(`wss://localhost:${process.env.PORT as string}/ws`, {
315
- agent: httpsAgent
316
- });
317
-
318
- ws.on('open', () => {
319
- expect(initCallbacks).to.have.been.calledOnceWithExactly(
320
- match.instanceOf(SocketClient)
321
- );
322
- expect(shutdownCallbacks).to.not.have.been.called;
323
- ws.close();
324
- });
325
-
326
- ws.on('close', () => {
327
- // We give 5ms for the delete to ba handled on the socket server side
328
- setTimeout(() => {
329
- expect(initCallbacks).to.have.been.calledOnceWithExactly(
330
- match.instanceOf(SocketClient)
331
- );
332
- expect(shutdownCallbacks).to.have.been.calledOnceWithExactly(
333
- match.instanceOf(SocketClient)
334
- );
335
- server
336
- .shutdown()
337
- .then(() => {
338
- done();
339
- })
340
- .catch((error) => {
341
- done(error);
342
- });
343
- }, 5);
344
- });
345
- })
346
- .catch((error) => {
347
- done(error);
348
- });
349
- });
350
-
351
- it('should keep track of connected clients', (done) => {
352
- const server = new Server({
353
- endpoints: [],
354
- webSocket: { server: { path: '/ws' }, client: { handlers: [] } }
355
- });
356
-
357
- server
358
- .init()
359
- .then(() => {
360
- const ws = new WS(`wss://localhost:${process.env.PORT as string}/ws`, {
361
- agent: httpsAgent
362
- });
363
-
364
- ws.on('open', () => {
365
- expect(Object.keys(SocketClient.getSocketClients())).to.have.length(
366
- 1
367
- );
368
- ws.close();
369
- });
370
-
371
- ws.on('close', () => {
372
- // We give 5ms for the delete to ba handled on the socket server side
373
- setTimeout(() => {
374
- expect(Object.keys(SocketClient.getSocketClients())).to.have.length(
375
- 0
376
- );
377
- server
378
- .shutdown()
379
- .then(() => {
380
- done();
381
- })
382
- .catch((error) => {
383
- done(error);
384
- });
385
- }, 5);
386
- });
387
- })
388
- .catch((error) => {
389
- done(error);
390
- });
391
- });
392
- });
1
+ import { randomUUID } from 'crypto';
2
+ import { generateAccessToken } from 'backend-test-tools';
3
+ import Ajv, { JSONSchemaType } from 'ajv';
4
+ import { expect } from 'chai';
5
+ import { faker } from '@faker-js/faker';
6
+ import { Sequelize } from 'sequelize';
7
+ import { fake, stub, match } from 'sinon';
8
+ import WS from 'ws';
9
+ import { SocketClient } from './SocketClient';
10
+ import { SocketMessage } from './SocketClient.types';
11
+ import { MessageHandler } from 'entities/MessageHandler';
12
+ import { Server } from 'entities/Server';
13
+ import { stubPubSub } from 'test';
14
+ import { httpsAgent, loadTlsConfig } from 'utils';
15
+
16
+ /** */
17
+ interface AuthTestMessagePayload {
18
+ /** Is the user authenticated */
19
+ authenticated: boolean;
20
+ /** Id of the user when authenticated */
21
+ userId?: string;
22
+ }
23
+ type AuthTestMessage = SocketMessage<AuthTestMessagePayload>;
24
+
25
+ const schema: JSONSchemaType<string> = { type: 'string' };
26
+ const stringPayloadValidator = new Ajv().compile(schema);
27
+
28
+ describe('Entity SocketClient', () => {
29
+ before(() => {
30
+ if (!httpsAgent) loadTlsConfig();
31
+ });
32
+
33
+ beforeEach(() => {
34
+ stub(Sequelize.prototype, 'close');
35
+ stubPubSub();
36
+ });
37
+
38
+ it('should authenticate a user with WebsSocket [auth-service]', (done) => {
39
+ const type = faker.lorem.word();
40
+ const payload = faker.lorem.word();
41
+ const userId = randomUUID();
42
+ const token = generateAccessToken(userId);
43
+
44
+ // The handler will return a fake message
45
+ const handler = fake((payload: unknown, client: SocketClient) => {
46
+ client.sendMessage(type, {
47
+ authenticated: client.isAuthenticated(),
48
+ userId: client.getUser()?.userId
49
+ });
50
+ });
51
+
52
+ const messageHandler = new MessageHandler(
53
+ type,
54
+ handler,
55
+ stringPayloadValidator
56
+ );
57
+
58
+ const server = new Server({
59
+ endpoints: [],
60
+ webSocket: {
61
+ server: { path: '/ws' },
62
+ client: { handlers: [messageHandler] }
63
+ }
64
+ });
65
+
66
+ server
67
+ .init()
68
+ .then(() => {
69
+ const ws = new WS(`wss://localhost:${process.env.PORT as string}/ws`, {
70
+ agent: httpsAgent
71
+ });
72
+
73
+ // When the connection is established we send a message
74
+ ws.on('open', () => {
75
+ ws.send(JSON.stringify({ type: 'authenticate', payload: { token } }));
76
+ ws.send(JSON.stringify({ type, payload }));
77
+ });
78
+
79
+ // We check that we correctly received the return message
80
+ ws.on('message', (message: Buffer) => {
81
+ const parsedMessage = JSON.parse(
82
+ message.toString('utf-8')
83
+ ) as AuthTestMessage;
84
+
85
+ expect(parsedMessage).to.deep.equal({
86
+ type,
87
+ payload: { userId, authenticated: true }
88
+ });
89
+
90
+ server
91
+ .shutdown()
92
+ .then(() => {
93
+ done();
94
+ })
95
+ .catch((error) => {
96
+ done(error);
97
+ });
98
+ });
99
+ })
100
+ .catch((error) => {
101
+ done(error);
102
+ });
103
+ });
104
+
105
+ it('should send message even user is not authenticated when noAuth options set as true', (done) => {
106
+ const type = faker.lorem.word();
107
+ const payload = faker.lorem.word();
108
+
109
+ // The handler will return a fake message
110
+ const handler = fake((payload: unknown, client: SocketClient) => {
111
+ // noAuth options set as true
112
+ client.sendMessage(type, payload, { noAuth: true });
113
+ });
114
+
115
+ const messageHandler = new MessageHandler(
116
+ type,
117
+ handler,
118
+ stringPayloadValidator,
119
+ {
120
+ authenticated: false
121
+ }
122
+ );
123
+
124
+ const server = new Server({
125
+ endpoints: [],
126
+ webSocket: {
127
+ server: { path: '/ws' },
128
+ client: { handlers: [messageHandler] }
129
+ }
130
+ });
131
+
132
+ server
133
+ .init()
134
+ .then(() => {
135
+ const ws = new WS(`wss://localhost:${process.env.PORT as string}/ws`, {
136
+ agent: httpsAgent
137
+ });
138
+
139
+ // When the connection is established we send a message
140
+ ws.on('open', () => {
141
+ ws.send(JSON.stringify({ type, payload }));
142
+ });
143
+
144
+ // We check that we correctly received the return message
145
+ ws.on('message', (message) => {
146
+ const parsedMessage = JSON.parse(
147
+ message.toString('utf-8')
148
+ ) as AuthTestMessage;
149
+ expect(parsedMessage).to.deep.equal({
150
+ type,
151
+ payload
152
+ });
153
+ server
154
+ .shutdown()
155
+ .then(() => {
156
+ done();
157
+ })
158
+ .catch((error) => {
159
+ done(error);
160
+ });
161
+ });
162
+ })
163
+ .catch((error) => {
164
+ done(error);
165
+ });
166
+ });
167
+
168
+ it('should send message on user authenticated with given audience', (done) => {
169
+ const type = faker.lorem.word();
170
+ const payload = faker.lorem.word();
171
+ const userId = randomUUID();
172
+ const token = generateAccessToken(userId);
173
+
174
+ // The handler will return a fake message
175
+ const handler = fake((payload: unknown, client: SocketClient) => {
176
+ client.sendMessage(
177
+ type,
178
+ {
179
+ authenticated: client.isAuthenticated(),
180
+ userId: client.getUser()?.userId
181
+ },
182
+ { audience: process.env.ACCESS_TOKEN_AUDIENCE as string }
183
+ );
184
+ });
185
+ const messageHandler = new MessageHandler(
186
+ type,
187
+ handler,
188
+ stringPayloadValidator
189
+ );
190
+
191
+ const server = new Server({
192
+ endpoints: [],
193
+ webSocket: {
194
+ server: { path: '/ws' },
195
+ client: { handlers: [messageHandler] }
196
+ }
197
+ });
198
+
199
+ server
200
+ .init()
201
+ .then(() => {
202
+ const ws = new WS(`wss://localhost:${process.env.PORT as string}/ws`, {
203
+ agent: httpsAgent
204
+ });
205
+
206
+ // When the connection is established we send a message
207
+ ws.on('open', () => {
208
+ ws.send(JSON.stringify({ type: 'authenticate', payload: { token } }));
209
+ ws.send(JSON.stringify({ type, payload }));
210
+ });
211
+
212
+ // We check that we correctly received the return message
213
+ ws.on('message', (message) => {
214
+ const parsedMessage = JSON.parse(
215
+ message.toString('utf-8')
216
+ ) as AuthTestMessage;
217
+
218
+ expect(parsedMessage).to.deep.equal({
219
+ type,
220
+ payload: { userId, authenticated: true }
221
+ });
222
+
223
+ server
224
+ .shutdown()
225
+ .then(() => {
226
+ done();
227
+ })
228
+ .catch((error) => {
229
+ done(error);
230
+ });
231
+ });
232
+ })
233
+ .catch((error) => {
234
+ done(error);
235
+ });
236
+ });
237
+
238
+ it('should handle the auth callback', (done) => {
239
+ const type = faker.lorem.word();
240
+ const payload = faker.lorem.word();
241
+ const userId = randomUUID();
242
+ const token = generateAccessToken(userId);
243
+ const authCallback = fake();
244
+
245
+ // The handler will return a fake message
246
+ const handler = fake((payload: unknown, client: SocketClient) => {
247
+ client.sendMessage(type, {
248
+ authenticated: client.isAuthenticated(),
249
+ userId: client.getUser()?.userId
250
+ });
251
+ });
252
+ const messageHandler = new MessageHandler(
253
+ type,
254
+ handler,
255
+ stringPayloadValidator
256
+ );
257
+
258
+ const server = new Server({
259
+ endpoints: [],
260
+ webSocket: {
261
+ server: { path: '/ws' },
262
+ client: { handlers: [messageHandler], authCallbacks: authCallback }
263
+ }
264
+ });
265
+
266
+ server
267
+ .init()
268
+ .then(() => {
269
+ const ws = new WS(`wss://localhost:${process.env.PORT as string}/ws`, {
270
+ agent: httpsAgent
271
+ });
272
+
273
+ // When the connection is established we send a message
274
+ ws.on('open', () => {
275
+ ws.send(JSON.stringify({ type: 'authenticate', payload: { token } }));
276
+ ws.send(JSON.stringify({ type, payload }));
277
+ });
278
+
279
+ ws.on('message', () => {
280
+ expect(authCallback).to.have.been.calledOnceWithExactly(
281
+ match.instanceOf(SocketClient)
282
+ );
283
+
284
+ server
285
+ .shutdown()
286
+ .then(() => {
287
+ done();
288
+ })
289
+ .catch((error) => {
290
+ done(error);
291
+ });
292
+ });
293
+ })
294
+ .catch((error) => {
295
+ done(error);
296
+ });
297
+ });
298
+
299
+ it('should call init an shutdown callbacks', (done) => {
300
+ const initCallbacks = fake();
301
+ const shutdownCallbacks = fake();
302
+
303
+ const server = new Server({
304
+ endpoints: [],
305
+ webSocket: {
306
+ server: { path: '/ws' },
307
+ client: { handlers: [], initCallbacks, shutdownCallbacks }
308
+ }
309
+ });
310
+
311
+ server
312
+ .init()
313
+ .then(() => {
314
+ const ws = new WS(`wss://localhost:${process.env.PORT as string}/ws`, {
315
+ agent: httpsAgent
316
+ });
317
+
318
+ ws.on('open', () => {
319
+ expect(initCallbacks).to.have.been.calledOnceWithExactly(
320
+ match.instanceOf(SocketClient)
321
+ );
322
+ expect(shutdownCallbacks).to.not.have.been.called;
323
+ ws.close();
324
+ });
325
+
326
+ ws.on('close', () => {
327
+ // We give 5ms for the delete to ba handled on the socket server side
328
+ setTimeout(() => {
329
+ expect(initCallbacks).to.have.been.calledOnceWithExactly(
330
+ match.instanceOf(SocketClient)
331
+ );
332
+ expect(shutdownCallbacks).to.have.been.calledOnceWithExactly(
333
+ match.instanceOf(SocketClient)
334
+ );
335
+ server
336
+ .shutdown()
337
+ .then(() => {
338
+ done();
339
+ })
340
+ .catch((error) => {
341
+ done(error);
342
+ });
343
+ }, 5);
344
+ });
345
+ })
346
+ .catch((error) => {
347
+ done(error);
348
+ });
349
+ });
350
+
351
+ it('should keep track of connected clients', (done) => {
352
+ const server = new Server({
353
+ endpoints: [],
354
+ webSocket: { server: { path: '/ws' }, client: { handlers: [] } }
355
+ });
356
+
357
+ server
358
+ .init()
359
+ .then(() => {
360
+ const ws = new WS(`wss://localhost:${process.env.PORT as string}/ws`, {
361
+ agent: httpsAgent
362
+ });
363
+
364
+ ws.on('open', () => {
365
+ expect(Object.keys(SocketClient.getSocketClients())).to.have.length(
366
+ 1
367
+ );
368
+ ws.close();
369
+ });
370
+
371
+ ws.on('close', () => {
372
+ // We give 5ms for the delete to ba handled on the socket server side
373
+ setTimeout(() => {
374
+ expect(Object.keys(SocketClient.getSocketClients())).to.have.length(
375
+ 0
376
+ );
377
+ server
378
+ .shutdown()
379
+ .then(() => {
380
+ done();
381
+ })
382
+ .catch((error) => {
383
+ done(error);
384
+ });
385
+ }, 5);
386
+ });
387
+ })
388
+ .catch((error) => {
389
+ done(error);
390
+ });
391
+ });
392
+ });