node-server-engine 1.4.9 → 1.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (259) hide show
  1. package/.commitlintrc.js +27 -0
  2. package/.releaserc.js +56 -0
  3. package/README.md +154 -2
  4. package/dist/const/tokenIssuer.js +1 -0
  5. package/dist/const/tokenIssuer.js.map +1 -1
  6. package/dist/db/models/SequelizeMeta.js +3 -1
  7. package/dist/db/models/SequelizeMeta.js.map +1 -1
  8. package/dist/entities/ElasticSearch/ElasticSearch.js +1 -2
  9. package/dist/entities/ElasticSearch/ElasticSearch.js.map +1 -1
  10. package/dist/entities/SocketClient/SocketClient.js +1 -0
  11. package/dist/entities/SocketClient/SocketClient.js.map +1 -1
  12. package/dist/index.js +1 -2
  13. package/dist/index.js.map +1 -1
  14. package/dist/middleware/checkPermission/checkPermission.d.ts +1 -1
  15. package/dist/middleware/checkPermission/checkPermission.js +4 -2
  16. package/dist/middleware/checkPermission/checkPermission.js.map +1 -1
  17. package/dist/utils/jwt/jwt.js +1 -1
  18. package/dist/utils/jwt/jwt.js.map +1 -1
  19. package/dist/utils/semverCompare/semverCompare.js +1 -5
  20. package/dist/utils/semverCompare/semverCompare.js.map +1 -1
  21. package/package.json +30 -19
  22. package/.env.example +0 -186
  23. package/.github/workflows/publish.yml +0 -41
  24. package/.prettierrc +0 -7
  25. package/Dockerfile +0 -31
  26. package/babel.config.json +0 -34
  27. package/eslint.config.mjs +0 -11
  28. package/src/const/DebeziumEvent.ts +0 -6
  29. package/src/const/LogSeverity.ts +0 -7
  30. package/src/const/index.ts +0 -5
  31. package/src/const/metrics.ts +0 -6
  32. package/src/const/mime.ts +0 -37
  33. package/src/const/tokenIssuer.ts +0 -7
  34. package/src/db/migrations/20241030121500-create-sequelize-meta-table.ts +0 -29
  35. package/src/db/models/SequelizeMeta.ts +0 -16
  36. package/src/db/models/index.ts +0 -2
  37. package/src/entities/ElasticSearch/ElasticSearch.ts +0 -103
  38. package/src/entities/ElasticSearch/ElasticSearch.types.ts +0 -7
  39. package/src/entities/ElasticSearch/index.ts +0 -2
  40. package/src/entities/Endpoint/Endpoint.test.ts +0 -248
  41. package/src/entities/Endpoint/Endpoint.ts +0 -221
  42. package/src/entities/Endpoint/Endpoint.types.ts +0 -181
  43. package/src/entities/Endpoint/index.ts +0 -2
  44. package/src/entities/EngineError/EngineError.ts +0 -28
  45. package/src/entities/EngineError/EngineError.types.ts +0 -15
  46. package/src/entities/EngineError/index.ts +0 -2
  47. package/src/entities/KeySet/KeySet.test.ts +0 -126
  48. package/src/entities/KeySet/KeySet.ts +0 -172
  49. package/src/entities/KeySet/KeySet.types.ts +0 -28
  50. package/src/entities/KeySet/index.ts +0 -2
  51. package/src/entities/LifecycleController/LifecycleController.test.ts +0 -48
  52. package/src/entities/LifecycleController/LifecycleController.ts +0 -24
  53. package/src/entities/LifecycleController/LifecycleController.types.ts +0 -5
  54. package/src/entities/LifecycleController/index.ts +0 -2
  55. package/src/entities/Localizator/Localizator.ts +0 -139
  56. package/src/entities/Localizator/Localizator.types.ts +0 -52
  57. package/src/entities/Localizator/guessNamingConvention/guessNamingConvention.test.ts +0 -165
  58. package/src/entities/Localizator/guessNamingConvention/guessNamingConvention.ts +0 -58
  59. package/src/entities/Localizator/guessNamingConvention/index.ts +0 -1
  60. package/src/entities/Localizator/index.ts +0 -2
  61. package/src/entities/MessageHandler/MessageHandler.test.ts +0 -130
  62. package/src/entities/MessageHandler/MessageHandler.ts +0 -72
  63. package/src/entities/MessageHandler/MessageHandler.types.ts +0 -15
  64. package/src/entities/MessageHandler/index.ts +0 -2
  65. package/src/entities/PubSub/PubSub.test.ts +0 -297
  66. package/src/entities/PubSub/PubSub.ts +0 -202
  67. package/src/entities/PubSub/PubSub.types.ts +0 -76
  68. package/src/entities/PubSub/handleMessage/handleMessage.test.ts +0 -102
  69. package/src/entities/PubSub/handleMessage/handleMessage.ts +0 -65
  70. package/src/entities/PubSub/handleMessage/index.ts +0 -1
  71. package/src/entities/PubSub/index.ts +0 -2
  72. package/src/entities/PushNotification/PushNotification.test.ts +0 -35
  73. package/src/entities/PushNotification/PushNotification.ts +0 -44
  74. package/src/entities/PushNotification/PushNotification.types.ts +0 -25
  75. package/src/entities/PushNotification/index.ts +0 -2
  76. package/src/entities/Redis/Redis.ts +0 -71
  77. package/src/entities/Redis/Redis.types.ts +0 -19
  78. package/src/entities/Redis/Redis.validate.ts +0 -17
  79. package/src/entities/Redis/index.ts +0 -2
  80. package/src/entities/Sequelize/Sequelize.config.ts +0 -59
  81. package/src/entities/Sequelize/Sequelize.test.ts +0 -21
  82. package/src/entities/Sequelize/Sequelize.ts +0 -75
  83. package/src/entities/Sequelize/Sequelize.types.ts +0 -10
  84. package/src/entities/Sequelize/Sequelize.validate.ts +0 -15
  85. package/src/entities/Sequelize/index.ts +0 -2
  86. package/src/entities/Server/Server.const.ts +0 -56
  87. package/src/entities/Server/Server.test.ts +0 -272
  88. package/src/entities/Server/Server.ts +0 -471
  89. package/src/entities/Server/Server.types.ts +0 -88
  90. package/src/entities/Server/index.ts +0 -2
  91. package/src/entities/SocketClient/SocketClient.test.ts +0 -392
  92. package/src/entities/SocketClient/SocketClient.ts +0 -401
  93. package/src/entities/SocketClient/SocketClient.types.ts +0 -62
  94. package/src/entities/SocketClient/index.ts +0 -2
  95. package/src/entities/SocketClient/parseMessage/index.ts +0 -1
  96. package/src/entities/SocketClient/parseMessage/parseMessage.test.ts +0 -20
  97. package/src/entities/SocketClient/parseMessage/parseMessage.ts +0 -26
  98. package/src/entities/Storage/Storage.test.ts +0 -58
  99. package/src/entities/Storage/Storage.ts +0 -219
  100. package/src/entities/Storage/Storage.types.ts +0 -57
  101. package/src/entities/Storage/index.ts +0 -2
  102. package/src/entities/ValidationError/ValidationError.ts +0 -34
  103. package/src/entities/ValidationError/index.ts +0 -1
  104. package/src/entities/WebError/WebError.test.ts +0 -18
  105. package/src/entities/WebError/WebError.ts +0 -23
  106. package/src/entities/WebError/WebError.types.ts +0 -9
  107. package/src/entities/WebError/index.ts +0 -2
  108. package/src/entities/index.ts +0 -16
  109. package/src/index.ts +0 -6
  110. package/src/metrics/debug.ts +0 -10
  111. package/src/metrics/index.ts +0 -2
  112. package/src/metrics/request.ts +0 -17
  113. package/src/middleware/authHmac/authHmac.test.ts +0 -86
  114. package/src/middleware/authHmac/authHmac.ts +0 -56
  115. package/src/middleware/authHmac/authHmac.types.ts +0 -7
  116. package/src/middleware/authHmac/index.ts +0 -2
  117. package/src/middleware/authJwt/authJwt.test.ts +0 -54
  118. package/src/middleware/authJwt/authJwt.ts +0 -55
  119. package/src/middleware/authJwt/authJwt.types.ts +0 -14
  120. package/src/middleware/authJwt/index.ts +0 -2
  121. package/src/middleware/authStatic/authStatic.test.ts +0 -36
  122. package/src/middleware/authStatic/authStatic.ts +0 -45
  123. package/src/middleware/authStatic/index.ts +0 -1
  124. package/src/middleware/authTls/authTls.test.ts +0 -138
  125. package/src/middleware/authTls/authTls.ts +0 -119
  126. package/src/middleware/authTls/authTls.types.ts +0 -13
  127. package/src/middleware/authTls/index.ts +0 -2
  128. package/src/middleware/checkPermission/checkPermission.ts +0 -33
  129. package/src/middleware/checkPermission/index.ts +0 -1
  130. package/src/middleware/error/error.test.ts +0 -60
  131. package/src/middleware/error/error.ts +0 -25
  132. package/src/middleware/error/index.ts +0 -1
  133. package/src/middleware/fileUploader/fileUploader.ts +0 -154
  134. package/src/middleware/fileUploader/fileUploader.types.ts +0 -35
  135. package/src/middleware/fileUploader/index.ts +0 -2
  136. package/src/middleware/fileUploader/isMultiPart/index.ts +0 -1
  137. package/src/middleware/fileUploader/isMultiPart/isMultipart.ts +0 -9
  138. package/src/middleware/fileUploader/validate/index.ts +0 -1
  139. package/src/middleware/fileUploader/validate/validate.ts +0 -27
  140. package/src/middleware/fourOhFour/fourOhFour.test.ts +0 -14
  141. package/src/middleware/fourOhFour/fourOhFour.ts +0 -13
  142. package/src/middleware/fourOhFour/index.ts +0 -1
  143. package/src/middleware/geminiFileUploader/geminiFileUploader.ts +0 -68
  144. package/src/middleware/geminiFileUploader/index.ts +0 -1
  145. package/src/middleware/healthCheck/healthCheck.test.ts +0 -12
  146. package/src/middleware/healthCheck/healthCheck.ts +0 -14
  147. package/src/middleware/healthCheck/index.ts +0 -1
  148. package/src/middleware/index.ts +0 -17
  149. package/src/middleware/metrics/index.ts +0 -1
  150. package/src/middleware/metrics/metrics.test.ts +0 -46
  151. package/src/middleware/metrics/metrics.ts +0 -24
  152. package/src/middleware/multiPartFileUploader/index.ts +0 -2
  153. package/src/middleware/multiPartFileUploader/multiPartFileUploader.ts +0 -249
  154. package/src/middleware/multiPartFileUploader/multiPartFileUploader.types.ts +0 -23
  155. package/src/middleware/multiPartFileUploader/validate/index.ts +0 -1
  156. package/src/middleware/multiPartFileUploader/validate/validate.ts +0 -27
  157. package/src/middleware/requestMetrics/index.ts +0 -1
  158. package/src/middleware/requestMetrics/requestMetrics.test.ts +0 -77
  159. package/src/middleware/requestMetrics/requestMetrics.ts +0 -20
  160. package/src/middleware/swaggerDocs/index.ts +0 -2
  161. package/src/middleware/swaggerDocs/swaggerDocs.ts +0 -114
  162. package/src/middleware/swaggerDocs/swaggerDocs.types.ts +0 -41
  163. package/src/middleware/userResolver/index.ts +0 -1
  164. package/src/middleware/userResolver/userResolver.ts +0 -53
  165. package/src/middleware/validate/index.ts +0 -1
  166. package/src/middleware/validate/validate.test.ts +0 -43
  167. package/src/middleware/validate/validate.ts +0 -25
  168. package/src/middleware/version/index.ts +0 -1
  169. package/src/middleware/version/version.test.ts +0 -23
  170. package/src/middleware/version/version.ts +0 -12
  171. package/src/utils/checkEnvironment/index.ts +0 -49
  172. package/src/utils/createHttpServer/createHttpServer.test.ts +0 -24
  173. package/src/utils/createHttpServer/createHttpServer.ts +0 -34
  174. package/src/utils/createHttpServer/createHttpServer.validate.ts +0 -17
  175. package/src/utils/createHttpServer/index.ts +0 -1
  176. package/src/utils/createSortedObject/createSortedObject.ts +0 -20
  177. package/src/utils/createSortedObject/createSortedObjet.test.ts +0 -47
  178. package/src/utils/createSortedObject/index.ts +0 -1
  179. package/src/utils/dbMigration/dbMigration.test.ts +0 -209
  180. package/src/utils/dbMigration/dbMigration.ts +0 -199
  181. package/src/utils/dbMigration/dbMigration.types.ts +0 -11
  182. package/src/utils/dbMigration/index.ts +0 -2
  183. package/src/utils/dbMigration/migrateMetadataTable/index.ts +0 -1
  184. package/src/utils/dbMigration/migrateMetadataTable/migrateMetadataTable.test.ts +0 -59
  185. package/src/utils/dbMigration/migrateMetadataTable/migrateMetadataTable.ts +0 -102
  186. package/src/utils/envAssert/envAssert.ts +0 -31
  187. package/src/utils/envAssert/index.ts +0 -1
  188. package/src/utils/envAssert/validators/hostList.ts +0 -17
  189. package/src/utils/envAssert/validators/index.ts +0 -5
  190. package/src/utils/envAssert/validators/ipList.ts +0 -13
  191. package/src/utils/envAssert/validators/path.ts +0 -13
  192. package/src/utils/envAssert/validators/string.ts +0 -9
  193. package/src/utils/envAssert/validators/stringList.ts +0 -13
  194. package/src/utils/filter/filter.ts +0 -17
  195. package/src/utils/filter/index.ts +0 -1
  196. package/src/utils/geminiFileUpload/geminiFileUpload.ts +0 -93
  197. package/src/utils/geminiFileUpload/index.ts +0 -1
  198. package/src/utils/hmac/checkEnv/checkEnv.test.ts +0 -18
  199. package/src/utils/hmac/checkEnv/checkEnv.ts +0 -9
  200. package/src/utils/hmac/checkEnv/index.ts +0 -1
  201. package/src/utils/hmac/createHmac/createHmac.ts +0 -33
  202. package/src/utils/hmac/createHmac/index.ts +0 -1
  203. package/src/utils/hmac/index.ts +0 -4
  204. package/src/utils/hmac/index.types.ts +0 -13
  205. package/src/utils/hmac/signPayload/index.ts +0 -1
  206. package/src/utils/hmac/signPayload/signPayload.ts +0 -16
  207. package/src/utils/hmac/verifySignature/index.ts +0 -1
  208. package/src/utils/hmac/verifySignature/verifySignature.ts +0 -24
  209. package/src/utils/index.ts +0 -29
  210. package/src/utils/jwt/index.ts +0 -2
  211. package/src/utils/jwt/jwt.test.ts +0 -28
  212. package/src/utils/jwt/jwt.ts +0 -182
  213. package/src/utils/jwt/jwt.types.ts +0 -21
  214. package/src/utils/report/index.ts +0 -3
  215. package/src/utils/report/output.ts +0 -45
  216. package/src/utils/report/output.types.ts +0 -70
  217. package/src/utils/report/report.test.ts +0 -133
  218. package/src/utils/report/report.ts +0 -133
  219. package/src/utils/report/report.types.ts +0 -13
  220. package/src/utils/request/index.ts +0 -1
  221. package/src/utils/request/request.test.ts +0 -26
  222. package/src/utils/request/request.ts +0 -48
  223. package/src/utils/secretManager/index.ts +0 -2
  224. package/src/utils/secretManager/secretLoader.ts +0 -62
  225. package/src/utils/secretManager/secretResolver.ts +0 -35
  226. package/src/utils/semverCompare/index.ts +0 -1
  227. package/src/utils/semverCompare/semverCompare.test.ts +0 -49
  228. package/src/utils/semverCompare/semverCompare.ts +0 -60
  229. package/src/utils/sendEmail/index.ts +0 -2
  230. package/src/utils/sendEmail/sendEmail.ts +0 -61
  231. package/src/utils/sendEmail/sendEmail.types.ts +0 -61
  232. package/src/utils/sendPush/index.ts +0 -2
  233. package/src/utils/sendPush/sendPush.ts +0 -20
  234. package/src/utils/sendPush/sendPush.types.ts +0 -25
  235. package/src/utils/tlsConfig/index.ts +0 -2
  236. package/src/utils/tlsConfig/tlsConfig.test.ts +0 -32
  237. package/src/utils/tlsConfig/tlsConfig.ts +0 -47
  238. package/src/utils/tlsConfig/tlsConfig.types.ts +0 -11
  239. package/src/utils/tlsConfig/tlsConfig.validate.ts +0 -25
  240. package/src/utils/tlsRequest/index.ts +0 -1
  241. package/src/utils/tlsRequest/tlsRequest.test.ts +0 -63
  242. package/src/utils/tlsRequest/tlsRequest.ts +0 -12
  243. package/src/utils/trimPathSlash/index.ts +0 -1
  244. package/src/utils/trimPathSlash/trimPathSlash.test.ts +0 -26
  245. package/src/utils/trimPathSlash/trimPathSlash.ts +0 -8
  246. package/test/env.ts +0 -53
  247. package/test/factory/index.ts +0 -8
  248. package/test/factory/sequelizeMeta.ts +0 -12
  249. package/test/hooks.ts +0 -35
  250. package/test/index.ts +0 -3
  251. package/test/stub/index.ts +0 -3
  252. package/test/stub/stubLocales.ts +0 -68
  253. package/test/stub/stubPubSub.ts +0 -7
  254. package/test/stub/stubStorage.ts +0 -77
  255. package/test/stub/stubStorage.types.ts +0 -11
  256. package/test/utils/app.ts +0 -31
  257. package/test/utils/index.ts +0 -1
  258. package/tsconfig.build.json +0 -5
  259. package/tsconfig.json +0 -32
@@ -1 +1 @@
1
- {"version":3,"file":"jwt.js","names":["_jsonwebtoken","require","_const","_EngineError","_KeySet","_WebError","_checkEnvironment","_envAssert","_report","_","keySet","exports","namespace","initKeySets","process","env","CHART","ECDSA_PUBLIC_KEY","EngineError","message","KeySet","file","AUTH_SERVICE_URL","internal","promise","init","bind","Promise","all","shutdownKeySets","shutdown","jwtGetKey","header","callback","NODE_ENV","JWT_SECRET","kid","data","reportDebug","key","getKey","error","Error","WebError","statusCode","errorCode","jwtVerify","token","issuer","TokenIssuer","AUTH_SERVICE","algorithms","assertEnvironment","envAssert","isString","ACCESS_TOKEN_AUDIENCE","ACCESS_TOKEN_ISSUER","ACCESS_TOKEN_EXPIRATION_TIME","options","audience","resolve","reject","verify","result","undefined","generateJwtToken","user","signOptions","algorithm","expiresIn","parseInt","keyid","Object","keys","getKeys","privateKey","getSecretOrFile","sign"],"sources":["../../../src/utils/jwt/jwt.ts"],"sourcesContent":["import {\n verify,\n JwtHeader,\n SigningKeyCallback,\n Algorithm,\n VerifyOptions,\n sign\n} from 'jsonwebtoken';\nimport { UserTokenPayload } from './jwt.types';\nimport { TokenIssuer } from 'const';\nimport { EngineError } from 'entities/EngineError';\nimport { KeySet } from 'entities/KeySet';\nimport { WebError } from 'entities/WebError';\nimport { assertEnvironment } from 'utils/checkEnvironment';\nimport { envAssert } from 'utils/envAssert';\nimport { reportDebug } from 'utils/report';\nimport { getSecretOrFile } from 'utils';\n\nexport let keySet: KeySet | undefined;\n\nconst namespace = 'engine:utils:jwt';\n\n/** Initiate key fetching mechanism */\nexport async function initKeySets(): Promise<void> {\n // Create the KeySet instance\n // The auth-service fetches its key from its disk and not from a network request\n // This prevents fetch failures the first time the auth-service is started\n if (process.env.CHART === 'auth-service') {\n if (!process.env.ECDSA_PUBLIC_KEY)\n throw new EngineError({\n message: 'Environment variable \"ECDSA_PUBLIC_KEY\" is not defined'\n });\n keySet = new KeySet(process.env.ECDSA_PUBLIC_KEY, { file: true });\n } else {\n if (process.env.AUTH_SERVICE_URL)\n keySet = new KeySet(\n `${process.env.AUTH_SERVICE_URL}/.well-known/jwks.json`,\n { internal: true }\n );\n else\n keySet = new KeySet(`./keys/jwks.json`, { internal: true, file: true });\n\n if (!keySet)\n throw new EngineError({\n message:\n 'Environment variable \"AUTH_SERVICE_URL\" is not defined or JWKS not found'\n });\n }\n const promise = [keySet.init.bind(keySet)()];\n\n await Promise.all(promise);\n}\n\n/** Stop fetching keys regularly */\nexport function shutdownKeySets(): void {\n if (keySet) keySet.shutdown.bind(keySet)();\n}\n\n/** Get the JWT public key */\nfunction jwtGetKey(header: JwtHeader, callback: SigningKeyCallback): void {\n // In test environment we return the symmetric signature secret\n if (process.env.NODE_ENV === 'test') {\n callback(null, process.env.JWT_SECRET);\n return;\n }\n // Check that KeySet has been initialized\n if (!keySet) {\n callback(new EngineError({ message: 'KeySet has not been initialized' }));\n return;\n }\n // Check that the token has a key ID\n if (!header.kid) {\n callback(\n new EngineError({\n message:\n 'Token has not key ID in header, impossible to match with known key',\n data: header\n })\n );\n return;\n }\n\n // In test environment we use a symmetrical secret bases signature\n if (process.env.NODE_ENV === 'test') {\n callback(null, process.env.JWT_SECRET);\n return;\n }\n reportDebug({\n namespace,\n message: `Looking for key with ID \"${header.kid}\"`\n });\n // Go through each key set to check if the token's key is in one of them\n let key;\n try {\n key = keySet.getKey(header.kid);\n } catch (error: Error | null | unknown) {\n callback(error instanceof Error ? error : null);\n return;\n }\n\n if (key) {\n reportDebug({ namespace, message: `Found key with ID \"${header.kid}\"` });\n callback(null, key);\n return;\n }\n callback(\n new WebError({\n statusCode: 401,\n errorCode: 'unauthorized',\n message: 'Could not find the tokens key in any key set',\n data: { kid: header.kid }\n })\n );\n}\n\n/** Verify an user Json Web Token */\nexport async function jwtVerify(\n token: string,\n issuer: TokenIssuer = TokenIssuer.AUTH_SERVICE\n): Promise<UserTokenPayload> {\n let algorithms = ['ES256' as Algorithm];\n if (process.env.NODE_ENV === 'test') {\n assertEnvironment({ JWT_SECRET: envAssert.isString() });\n algorithms = ['HS256' as Algorithm];\n }\n assertEnvironment({\n ACCESS_TOKEN_AUDIENCE: envAssert.isString(),\n ACCESS_TOKEN_ISSUER: envAssert.isString(),\n ACCESS_TOKEN_EXPIRATION_TIME: envAssert.isString()\n });\n let options: VerifyOptions | undefined;\n\n switch (issuer) {\n case TokenIssuer.AUTH_SERVICE:\n options = {\n audience: [process.env.ACCESS_TOKEN_AUDIENCE as string],\n issuer: [process.env.ACCESS_TOKEN_ISSUER as string],\n algorithms\n };\n break;\n default:\n throw new EngineError({\n message: `Invalid token issuer specified \"${issuer as string}\"`\n });\n }\n\n return new Promise<UserTokenPayload>((resolve, reject) => {\n verify(token, jwtGetKey, options, (error, result) => {\n if (error) {\n reject(\n new WebError({\n errorCode: 'unauthorized',\n statusCode: 401,\n message: 'Invalid token supplied',\n data: { token },\n error: error instanceof Error ? error : undefined\n })\n );\n return;\n }\n resolve(result as UserTokenPayload);\n });\n });\n}\n\nexport function generateJwtToken(user: unknown) {\n const signOptions = {\n algorithm: 'ES256' as const, // or 'ES256' as Algorithm\n expiresIn: process.env.ACCESS_TOKEN_EXPIRATION_TIME\n ? parseInt(process.env.ACCESS_TOKEN_EXPIRATION_TIME, 10)\n : undefined,\n issuer: process.env.ACCESS_TOKEN_ISSUER,\n audience: process.env.ACCESS_TOKEN_AUDIENCE,\n keyid: Object.keys(keySet?.getKeys() ?? {})[0]\n };\n\n const privateKey = getSecretOrFile('PRIVATE_KEY_PATH');\n\n const token = sign({ user }, privateKey, signOptions);\n\n return token;\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"jwt.js","names":["_jsonwebtoken","require","_const","_EngineError","_KeySet","_WebError","_checkEnvironment","_envAssert","_report","_","keySet","exports","namespace","initKeySets","process","env","CHART","ECDSA_PUBLIC_KEY","EngineError","message","KeySet","file","AUTH_SERVICE_URL","internal","promise","init","bind","Promise","all","shutdownKeySets","shutdown","jwtGetKey","header","callback","NODE_ENV","JWT_SECRET","kid","data","reportDebug","key","getKey","error","Error","WebError","statusCode","errorCode","jwtVerify","token","issuer","TokenIssuer","AUTH_SERVICE","algorithms","assertEnvironment","envAssert","isString","ACCESS_TOKEN_AUDIENCE","ACCESS_TOKEN_ISSUER","ACCESS_TOKEN_EXPIRATION_TIME","options","audience","resolve","reject","verify","result","undefined","generateJwtToken","user","signOptions","algorithm","expiresIn","parseInt","keyid","Object","keys","getKeys","privateKey","getSecretOrFile","sign"],"sources":["../../../src/utils/jwt/jwt.ts"],"sourcesContent":["import {\n verify,\n JwtHeader,\n SigningKeyCallback,\n Algorithm,\n VerifyOptions,\n sign\n} from 'jsonwebtoken';\nimport { UserTokenPayload } from './jwt.types';\nimport { TokenIssuer } from 'const';\nimport { EngineError } from 'entities/EngineError';\nimport { KeySet } from 'entities/KeySet';\nimport { WebError } from 'entities/WebError';\nimport { assertEnvironment } from 'utils/checkEnvironment';\nimport { envAssert } from 'utils/envAssert';\nimport { reportDebug } from 'utils/report';\nimport { getSecretOrFile } from 'utils';\n\nexport let keySet: KeySet | undefined;\n\nconst namespace = 'engine:utils:jwt';\n\n/** Initiate key fetching mechanism */\nexport async function initKeySets(): Promise<void> {\n // Create the KeySet instance\n // The auth-service fetches its key from its disk and not from a network request\n // This prevents fetch failures the first time the auth-service is started\n if (process.env.CHART === 'auth-service') {\n if (!process.env.ECDSA_PUBLIC_KEY)\n throw new EngineError({\n message: 'Environment variable \"ECDSA_PUBLIC_KEY\" is not defined'\n });\n keySet = new KeySet(process.env.ECDSA_PUBLIC_KEY, { file: true });\n } else {\n if (process.env.AUTH_SERVICE_URL)\n keySet = new KeySet(\n `${process.env.AUTH_SERVICE_URL}/.well-known/jwks.json`,\n { internal: true }\n );\n else\n keySet = new KeySet(`./keys/jwks.json`, { internal: true, file: true });\n\n if (!keySet)\n throw new EngineError({\n message:\n 'Environment variable \"AUTH_SERVICE_URL\" is not defined or JWKS not found'\n });\n }\n const promise = [keySet.init.bind(keySet)()];\n\n await Promise.all(promise);\n}\n\n/** Stop fetching keys regularly */\nexport function shutdownKeySets(): void {\n if (keySet) keySet.shutdown.bind(keySet)();\n}\n\n/** Get the JWT public key */\nfunction jwtGetKey(header: JwtHeader, callback: SigningKeyCallback): void {\n // In test environment we return the symmetric signature secret\n if (process.env.NODE_ENV === 'test') {\n callback(null, process.env.JWT_SECRET);\n return;\n }\n // Check that KeySet has been initialized\n if (!keySet) {\n callback(new EngineError({ message: 'KeySet has not been initialized' }));\n return;\n }\n // Check that the token has a key ID\n if (!header.kid) {\n callback(\n new EngineError({\n message:\n 'Token has not key ID in header, impossible to match with known key',\n data: header\n })\n );\n return;\n }\n\n // In test environment we use a symmetrical secret bases signature\n if (process.env.NODE_ENV === 'test') {\n callback(null, process.env.JWT_SECRET);\n return;\n }\n reportDebug({\n namespace,\n message: `Looking for key with ID \"${header.kid}\"`\n });\n // Go through each key set to check if the token's key is in one of them\n let key;\n try {\n key = keySet.getKey(header.kid);\n } catch (error: Error | null | unknown) {\n callback(error instanceof Error ? error : null);\n return;\n }\n\n if (key) {\n reportDebug({ namespace, message: `Found key with ID \"${header.kid}\"` });\n callback(null, key);\n return;\n }\n callback(\n new WebError({\n statusCode: 401,\n errorCode: 'unauthorized',\n message: 'Could not find the tokens key in any key set',\n data: { kid: header.kid }\n })\n );\n}\n\n/** Verify an user Json Web Token */\nexport async function jwtVerify(\n token: string,\n issuer: TokenIssuer = TokenIssuer.AUTH_SERVICE\n): Promise<UserTokenPayload> {\n let algorithms = ['ES256' as Algorithm];\n if (process.env.NODE_ENV === 'test') {\n assertEnvironment({ JWT_SECRET: envAssert.isString() });\n algorithms = ['HS256' as Algorithm];\n }\n assertEnvironment({\n ACCESS_TOKEN_AUDIENCE: envAssert.isString(),\n ACCESS_TOKEN_ISSUER: envAssert.isString(),\n ACCESS_TOKEN_EXPIRATION_TIME: envAssert.isString()\n });\n let options: VerifyOptions | undefined;\n\n switch (issuer) {\n case TokenIssuer.AUTH_SERVICE:\n options = {\n audience: [process.env.ACCESS_TOKEN_AUDIENCE as string],\n issuer: [process.env.ACCESS_TOKEN_ISSUER as string],\n algorithms\n };\n break;\n default:\n throw new EngineError({\n message: `Invalid token issuer specified \"${issuer as string}\"`\n });\n }\n\n return new Promise<UserTokenPayload>((resolve, reject) => {\n verify(token, jwtGetKey, options, (error, result) => {\n if (error) {\n reject(\n new WebError({\n errorCode: 'unauthorized',\n statusCode: 401,\n message: 'Invalid token supplied',\n data: { token },\n error: error instanceof Error ? error : undefined\n })\n );\n return;\n }\n resolve(result as UserTokenPayload);\n });\n });\n}\n\nexport function generateJwtToken(user: unknown) {\n const signOptions = {\n algorithm: 'ES256' as const, // or 'ES256' as Algorithm\n expiresIn: process.env.ACCESS_TOKEN_EXPIRATION_TIME\n ? parseInt(process.env.ACCESS_TOKEN_EXPIRATION_TIME, 10)\n : 3600,\n issuer: process.env.ACCESS_TOKEN_ISSUER,\n audience: process.env.ACCESS_TOKEN_AUDIENCE,\n keyid: Object.keys(keySet?.getKeys() ?? {})[0]\n };\n\n const privateKey = getSecretOrFile('PRIVATE_KEY_PATH');\n\n const token = sign({ user }, privateKey, signOptions);\n\n return token;\n}\n"],"mappings":"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","ignoreList":[]}
@@ -25,11 +25,7 @@ function semverCompare(v1, v2) {
25
25
  v2
26
26
  }
27
27
  });
28
- const [
29
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
30
- [_1, major1, minor1, patch1, preType1, preVersion1],
31
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
32
- [_2, major2, minor2, patch2, preType2, preVersion2]] = [match1, match2].map(group =>
28
+ const [[_1, major1, minor1, patch1, preType1, preVersion1], [_2, major2, minor2, patch2, preType2, preVersion2]] = [match1, match2].map(group =>
33
29
  // We parse to int the parts that can be
34
30
  group.map(item => item && _validator.default.isInt(item) ? parseInt(item) : item));
35
31
 
@@ -1 +1 @@
1
- {"version":3,"file":"semverCompare.js","names":["_validator","_interopRequireDefault","require","_EngineError","SEMVER_REGEX","semverCompare","v1","v2","match1","match2","map","v","match","EngineError","message","data","_1","major1","minor1","patch1","preType1","preVersion1","_2","major2","minor2","patch2","preType2","preVersion2","group","item","validator","isInt","parseInt"],"sources":["../../../src/utils/semverCompare/semverCompare.ts"],"sourcesContent":["import validator from 'validator';\nimport { EngineError } from 'entities/EngineError';\n\n// Regex to validate our SemVer style and capture the different parts\nconst SEMVER_REGEX =\n /^v?(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-(?:(alpha|beta|rc)(?:\\.(0|[1-9]\\d*))))?$/;\n\n/**\n * Comparison function for our SemVer strings, includes support ofr pre-releases\n * @param {string} v1\n * @param {string} v2\n * @return {number} - -1 if v1 < v2, 0 if v1 = v2, +1 if v1 > v2\n */\nexport function semverCompare(v1: string, v2: string): 1 | -1 | 0 {\n const [match1, match2] = [v1, v2].map((v) => v.match(SEMVER_REGEX));\n if (!match1 || !match2)\n throw new EngineError({\n message: 'Provided invalid SemVer string, can not compare',\n data: { v1, v2 }\n });\n const [\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n [_1, major1, minor1, patch1, preType1, preVersion1],\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n [_2, major2, minor2, patch2, preType2, preVersion2]\n ] = [match1, match2].map((group) =>\n // We parse to int the parts that can be\n group.map((item) => (item && validator.isInt(item) ? parseInt(item) : item))\n );\n\n // Compare majors first\n if (major1 < major2) return -1;\n if (major1 > major2) return 1;\n\n // Compare minors second\n if (minor1 < minor2) return -1;\n if (minor1 > minor2) return 1;\n\n // Compare patch third\n if (patch1 < patch2) return -1;\n if (patch1 > patch2) return 1;\n\n // Compare pre-release type\n // Release > pre-release\n if (!preType1 && !preType2) return 0;\n if (preType1 && !preType2) return -1;\n if (!preType1 && preType2) return 1;\n\n // RC > Beta > Alpha\n if (preType1 !== 'rc' && preType2 === 'rc') return -1;\n if (preType1 === 'rc' && preType2 !== 'rc') return 1;\n if (preType1 !== 'beta' && preType2 === 'beta') return -1;\n if (preType1 === 'beta' && preType2 !== 'beta') return 1;\n\n // Finally compare the pre-release versions\n if (preVersion1 < preVersion2) return -1;\n if (preVersion1 > preVersion2) return 1;\n\n return 0;\n}\n"],"mappings":";;;;;;;AAAA,IAAAA,UAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,YAAA,GAAAD,OAAA;AAEA;AACA,MAAME,YAAY,GAChB,yFAAyF;;AAE3F;AACA;AACA;AACA;AACA;AACA;AACO,SAASC,aAAaA,CAACC,EAAU,EAAEC,EAAU,EAAc;EAChE,MAAM,CAACC,MAAM,EAAEC,MAAM,CAAC,GAAG,CAACH,EAAE,EAAEC,EAAE,CAAC,CAACG,GAAG,CAAEC,CAAC,IAAKA,CAAC,CAACC,KAAK,CAACR,YAAY,CAAC,CAAC;EACnE,IAAI,CAACI,MAAM,IAAI,CAACC,MAAM,EACpB,MAAM,IAAII,wBAAW,CAAC;IACpBC,OAAO,EAAE,iDAAiD;IAC1DC,IAAI,EAAE;MAAET,EAAE;MAAEC;IAAG;EACjB,CAAC,CAAC;EACJ,MAAM;EACJ;EACA,CAACS,EAAE,EAAEC,MAAM,EAAEC,MAAM,EAAEC,MAAM,EAAEC,QAAQ,EAAEC,WAAW,CAAC;EACnD;EACA,CAACC,EAAE,EAAEC,MAAM,EAAEC,MAAM,EAAEC,MAAM,EAAEC,QAAQ,EAAEC,WAAW,CAAC,CACpD,GAAG,CAACnB,MAAM,EAAEC,MAAM,CAAC,CAACC,GAAG,CAAEkB,KAAK;EAC7B;EACAA,KAAK,CAAClB,GAAG,CAAEmB,IAAI,IAAMA,IAAI,IAAIC,kBAAS,CAACC,KAAK,CAACF,IAAI,CAAC,GAAGG,QAAQ,CAACH,IAAI,CAAC,GAAGA,IAAK,CAC7E,CAAC;;EAED;EACA,IAAIZ,MAAM,GAAGM,MAAM,EAAE,OAAO,CAAC,CAAC;EAC9B,IAAIN,MAAM,GAAGM,MAAM,EAAE,OAAO,CAAC;;EAE7B;EACA,IAAIL,MAAM,GAAGM,MAAM,EAAE,OAAO,CAAC,CAAC;EAC9B,IAAIN,MAAM,GAAGM,MAAM,EAAE,OAAO,CAAC;;EAE7B;EACA,IAAIL,MAAM,GAAGM,MAAM,EAAE,OAAO,CAAC,CAAC;EAC9B,IAAIN,MAAM,GAAGM,MAAM,EAAE,OAAO,CAAC;;EAE7B;EACA;EACA,IAAI,CAACL,QAAQ,IAAI,CAACM,QAAQ,EAAE,OAAO,CAAC;EACpC,IAAIN,QAAQ,IAAI,CAACM,QAAQ,EAAE,OAAO,CAAC,CAAC;EACpC,IAAI,CAACN,QAAQ,IAAIM,QAAQ,EAAE,OAAO,CAAC;;EAEnC;EACA,IAAIN,QAAQ,KAAK,IAAI,IAAIM,QAAQ,KAAK,IAAI,EAAE,OAAO,CAAC,CAAC;EACrD,IAAIN,QAAQ,KAAK,IAAI,IAAIM,QAAQ,KAAK,IAAI,EAAE,OAAO,CAAC;EACpD,IAAIN,QAAQ,KAAK,MAAM,IAAIM,QAAQ,KAAK,MAAM,EAAE,OAAO,CAAC,CAAC;EACzD,IAAIN,QAAQ,KAAK,MAAM,IAAIM,QAAQ,KAAK,MAAM,EAAE,OAAO,CAAC;;EAExD;EACA,IAAIL,WAAW,GAAGM,WAAW,EAAE,OAAO,CAAC,CAAC;EACxC,IAAIN,WAAW,GAAGM,WAAW,EAAE,OAAO,CAAC;EAEvC,OAAO,CAAC;AACV","ignoreList":[]}
1
+ {"version":3,"file":"semverCompare.js","names":["_validator","_interopRequireDefault","require","_EngineError","SEMVER_REGEX","semverCompare","v1","v2","match1","match2","map","v","match","EngineError","message","data","_1","major1","minor1","patch1","preType1","preVersion1","_2","major2","minor2","patch2","preType2","preVersion2","group","item","validator","isInt","parseInt"],"sources":["../../../src/utils/semverCompare/semverCompare.ts"],"sourcesContent":["import validator from 'validator';\nimport { EngineError } from 'entities/EngineError';\n\n// Regex to validate our SemVer style and capture the different parts\nconst SEMVER_REGEX =\n /^v?(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-(?:(alpha|beta|rc)(?:\\.(0|[1-9]\\d*))))?$/;\n\n/**\n * Comparison function for our SemVer strings, includes support ofr pre-releases\n * @param {string} v1\n * @param {string} v2\n * @return {number} - -1 if v1 < v2, 0 if v1 = v2, +1 if v1 > v2\n */\nexport function semverCompare(v1: string, v2: string): 1 | -1 | 0 {\n const [match1, match2] = [v1, v2].map((v) => v.match(SEMVER_REGEX));\n if (!match1 || !match2)\n throw new EngineError({\n message: 'Provided invalid SemVer string, can not compare',\n data: { v1, v2 }\n });\n const [\n \n [_1, major1, minor1, patch1, preType1, preVersion1],\n \n [_2, major2, minor2, patch2, preType2, preVersion2]\n ] = [match1, match2].map((group) =>\n // We parse to int the parts that can be\n group.map((item) => (item && validator.isInt(item) ? parseInt(item) : item))\n );\n\n // Compare majors first\n if (major1 < major2) return -1;\n if (major1 > major2) return 1;\n\n // Compare minors second\n if (minor1 < minor2) return -1;\n if (minor1 > minor2) return 1;\n\n // Compare patch third\n if (patch1 < patch2) return -1;\n if (patch1 > patch2) return 1;\n\n // Compare pre-release type\n // Release > pre-release\n if (!preType1 && !preType2) return 0;\n if (preType1 && !preType2) return -1;\n if (!preType1 && preType2) return 1;\n\n // RC > Beta > Alpha\n if (preType1 !== 'rc' && preType2 === 'rc') return -1;\n if (preType1 === 'rc' && preType2 !== 'rc') return 1;\n if (preType1 !== 'beta' && preType2 === 'beta') return -1;\n if (preType1 === 'beta' && preType2 !== 'beta') return 1;\n\n // Finally compare the pre-release versions\n if (preVersion1 < preVersion2) return -1;\n if (preVersion1 > preVersion2) return 1;\n\n return 0;\n}\n"],"mappings":";;;;;;;AAAA,IAAAA,UAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,YAAA,GAAAD,OAAA;AAEA;AACA,MAAME,YAAY,GAChB,yFAAyF;;AAE3F;AACA;AACA;AACA;AACA;AACA;AACO,SAASC,aAAaA,CAACC,EAAU,EAAEC,EAAU,EAAc;EAChE,MAAM,CAACC,MAAM,EAAEC,MAAM,CAAC,GAAG,CAACH,EAAE,EAAEC,EAAE,CAAC,CAACG,GAAG,CAAEC,CAAC,IAAKA,CAAC,CAACC,KAAK,CAACR,YAAY,CAAC,CAAC;EACnE,IAAI,CAACI,MAAM,IAAI,CAACC,MAAM,EACpB,MAAM,IAAII,wBAAW,CAAC;IACpBC,OAAO,EAAE,iDAAiD;IAC1DC,IAAI,EAAE;MAAET,EAAE;MAAEC;IAAG;EACjB,CAAC,CAAC;EACJ,MAAM,CAEJ,CAACS,EAAE,EAAEC,MAAM,EAAEC,MAAM,EAAEC,MAAM,EAAEC,QAAQ,EAAEC,WAAW,CAAC,EAEnD,CAACC,EAAE,EAAEC,MAAM,EAAEC,MAAM,EAAEC,MAAM,EAAEC,QAAQ,EAAEC,WAAW,CAAC,CACpD,GAAG,CAACnB,MAAM,EAAEC,MAAM,CAAC,CAACC,GAAG,CAAEkB,KAAK;EAC7B;EACAA,KAAK,CAAClB,GAAG,CAAEmB,IAAI,IAAMA,IAAI,IAAIC,kBAAS,CAACC,KAAK,CAACF,IAAI,CAAC,GAAGG,QAAQ,CAACH,IAAI,CAAC,GAAGA,IAAK,CAC7E,CAAC;;EAED;EACA,IAAIZ,MAAM,GAAGM,MAAM,EAAE,OAAO,CAAC,CAAC;EAC9B,IAAIN,MAAM,GAAGM,MAAM,EAAE,OAAO,CAAC;;EAE7B;EACA,IAAIL,MAAM,GAAGM,MAAM,EAAE,OAAO,CAAC,CAAC;EAC9B,IAAIN,MAAM,GAAGM,MAAM,EAAE,OAAO,CAAC;;EAE7B;EACA,IAAIL,MAAM,GAAGM,MAAM,EAAE,OAAO,CAAC,CAAC;EAC9B,IAAIN,MAAM,GAAGM,MAAM,EAAE,OAAO,CAAC;;EAE7B;EACA;EACA,IAAI,CAACL,QAAQ,IAAI,CAACM,QAAQ,EAAE,OAAO,CAAC;EACpC,IAAIN,QAAQ,IAAI,CAACM,QAAQ,EAAE,OAAO,CAAC,CAAC;EACpC,IAAI,CAACN,QAAQ,IAAIM,QAAQ,EAAE,OAAO,CAAC;;EAEnC;EACA,IAAIN,QAAQ,KAAK,IAAI,IAAIM,QAAQ,KAAK,IAAI,EAAE,OAAO,CAAC,CAAC;EACrD,IAAIN,QAAQ,KAAK,IAAI,IAAIM,QAAQ,KAAK,IAAI,EAAE,OAAO,CAAC;EACpD,IAAIN,QAAQ,KAAK,MAAM,IAAIM,QAAQ,KAAK,MAAM,EAAE,OAAO,CAAC,CAAC;EACzD,IAAIN,QAAQ,KAAK,MAAM,IAAIM,QAAQ,KAAK,MAAM,EAAE,OAAO,CAAC;;EAExD;EACA,IAAIL,WAAW,GAAGM,WAAW,EAAE,OAAO,CAAC,CAAC;EACxC,IAAIN,WAAW,GAAGM,WAAW,EAAE,OAAO,CAAC;EAEvC,OAAO,CAAC;AACV","ignoreList":[]}
package/package.json CHANGED
@@ -1,11 +1,12 @@
1
1
  {
2
2
  "name": "node-server-engine",
3
- "version": "1.4.9",
3
+ "version": "1.5.0",
4
4
  "description": "Framework used to develop backend services. This package ships with a lot of features to standardize the creation of services, letting you focus on the business logic.",
5
5
  "main": "dist/index.js",
6
6
  "scripts": {
7
7
  "build": "rimraf dist && tsc -p tsconfig.build.json && shx mv dist/src/* dist && rimraf dist/src && tsc-alias -p tsconfig.build.json && npx babel src --out-dir dist --source-maps --extensions \".ts\" --ignore \"**/*.test.ts\" --copy-files --no-copy-ignored",
8
8
  "format": "prettier --write .",
9
+ "format:check": "prettier --check .",
9
10
  "lint": "eslint ./src",
10
11
  "lint:fix": "eslint ./src --fix",
11
12
  "prepublish": "npm run build",
@@ -15,18 +16,22 @@
15
16
  "coverage": "nyc report --report-dir=./.test-coverage --reporter=html --reporter=text",
16
17
  "coverage:ci": "nyc report --reporter=text-summary",
17
18
  "test:ci": "npm run test -- --reporter spec",
18
- "test:compose": "docker-compose up --abort-on-container-exit --build"
19
+ "test:compose": "docker-compose up --abort-on-container-exit --build",
20
+ "prepare": "husky"
19
21
  },
20
- "husky": {
21
- "hooks": {
22
- "pre-commit": "lint-staged && npm run test && npm run coverage"
23
- }
24
- },
25
- "lint-staged": {
26
- "*.js": "eslint",
27
- "*.ts": "eslint"
28
- },
29
- "keywords": [],
22
+ "keywords": [
23
+ "node",
24
+ "express",
25
+ "server",
26
+ "backend",
27
+ "framework",
28
+ "rest-api",
29
+ "typescript",
30
+ "microservices",
31
+ "jwt",
32
+ "websocket",
33
+ "sequelize"
34
+ ],
30
35
  "author": "Ram",
31
36
  "license": "ISC",
32
37
  "repository": {
@@ -46,7 +51,7 @@
46
51
  "@google/generative-ai": "^0.21.0",
47
52
  "ajv": "^8.17.1",
48
53
  "axios": "^1.7.9",
49
- "backend-test-tools": "^1.0.7",
54
+ "backend-test-tools": "^1.1.2",
50
55
  "body-parser": "^1.20.3",
51
56
  "busboy": "^1.6.0",
52
57
  "bytes": "^3.1.2",
@@ -71,18 +76,18 @@
71
76
  "mime-types": "^2.1.35",
72
77
  "morgan": "^1.10.0",
73
78
  "ms": "^2.1.3",
74
- "multer": "^1.4.5-lts.1",
79
+ "multer": "^2.0.1",
75
80
  "mysql2": "^3.11.5",
76
81
  "nock": "^13.5.6",
77
- "nodemailer": "^6.10.0",
82
+ "nodemailer": "^7.0.11",
78
83
  "nodemon": "^3.1.9",
79
84
  "pg": "^8.13.1",
80
85
  "prom-client": "^15.1.3",
81
86
  "request-ip": "^3.3.0",
82
87
  "response-time": "^2.3.3",
83
88
  "semver-compare": "^1.0.0",
84
- "sequelize": "^6.37.5",
85
- "sequelize-cli": "^6.6.2",
89
+ "sequelize": "^6.37.7",
90
+ "sequelize-cli": "^6.6.3",
86
91
  "sequelize-typescript": "^2.1.6",
87
92
  "sharp": "^0.33.5",
88
93
  "swagger-ui-express": "^5.0.1",
@@ -103,8 +108,12 @@
103
108
  "@babel/preset-env": "^7.26.0",
104
109
  "@babel/preset-typescript": "^7.26.0",
105
110
  "@babel/register": "^7.25.9",
111
+ "@commitlint/cli": "^19.8.1",
112
+ "@commitlint/config-conventional": "^19.8.1",
106
113
  "@faker-js/faker": "^9.3.0",
107
114
  "@google-cloud/precise-date": "^4.0.0",
115
+ "@semantic-release/changelog": "^6.0.3",
116
+ "@semantic-release/git": "^10.0.1",
108
117
  "@types/busboy": "^1.5.4",
109
118
  "@types/bytes": "^3.1.5",
110
119
  "@types/callsite": "^1.0.34",
@@ -127,7 +136,7 @@
127
136
  "@types/node": "^22.10.2",
128
137
  "@types/nodemailer": "^6.4.17",
129
138
  "@types/response-time": "^2.3.8",
130
- "@types/sequelize": "^4.28.20",
139
+ "@types/sequelize": "^6.12.0",
131
140
  "@types/sinon-chai": "^4.0.0",
132
141
  "@types/supertest": "^6.0.2",
133
142
  "@types/swagger-ui-express": "^4.1.7",
@@ -141,6 +150,7 @@
141
150
  "babel-plugin-module-resolver": "^5.0.2",
142
151
  "chai": "^4.5.0",
143
152
  "chai-as-promised": "^7.1.2",
153
+ "conventional-changelog-conventionalcommits": "^8.0.0",
144
154
  "cross-env": "^7.0.3",
145
155
  "eslint": "^9.17.0",
146
156
  "factory-waifu": "^1.0.1",
@@ -154,11 +164,12 @@
154
164
  "nyc": "^17.1.0",
155
165
  "prettier": "^3.4.2",
156
166
  "rimraf": "^6.0.1",
167
+ "semantic-release": "^25.0.2",
157
168
  "shx": "^0.3.4",
158
169
  "sinon": "^19.0.2",
159
170
  "sinon-chai": "^3.5.0",
160
171
  "supertest": "^7.0.0",
161
- "tmp": "^0.2.3",
172
+ "tmp": "^0.2.4",
162
173
  "ts-node": "^10.9.2",
163
174
  "tsc-alias": "^1.8.10",
164
175
  "tsconfig-paths": "^4.2.0",
package/.env.example DELETED
@@ -1,186 +0,0 @@
1
- ## DEV ENV
2
- NODE_ENV=
3
-
4
- # Port on which the business logic endpoints are served
5
- PORT=
6
-
7
- # Port on which metrics and analytics data is served. It is used to allow different firewall rules for accessing the service
8
- SECONDARY_PORT=
9
-
10
- # Server host name
11
- HOST_NAME=
12
-
13
- # Timeout (in ms) for the websocket connections to close gracefully on server shutdown. After that, the connection is destroyed unilateraly
14
- WEBSOCKET_CLOSE_TIMEOUT=
15
-
16
- # Google Gemini AI key
17
- GOOGLE_AI_KEY=
18
-
19
- #######
20
- # TLS #
21
- #######
22
-
23
- # Private key of the server
24
- TLS_SERVER_KEY=
25
-
26
- # Passphrase to decrypt the private key
27
- TLS_SERVER_KEY_PASSPHRASE=
28
-
29
- # Certificate of the server
30
- TLS_SERVER_CERT=
31
-
32
- # Certificate of the certifying authority
33
- TLS_CA=
34
-
35
- # Private key used to make a TLS request
36
- # Defaults to the server key if not specified
37
- TLS_REQUEST_KEY=
38
-
39
- # Passphrase to decrypt the private key used to make a TLS request
40
- # Defaults to the server passphrase if not specified
41
- TLS_REQUEST_KEY_PASSPHRASE=
42
-
43
- # Certificate used to make a TLS request
44
- # Defaults to the server certificate if not specified
45
- TLS_REQUEST_CERT=
46
-
47
- # Certificate of the certifying authority used to make a TLS request
48
- # Defaults to the server certificate of the certifying authority if not specified
49
- TLS_REQUEST_CA=
50
-
51
- # List of clients hosts allowed to make a request
52
- # Comma separated string
53
- ALLOWED_CLIENT_HOSTS=
54
-
55
- ########################
56
- # Token Authentication #
57
- ########################
58
-
59
- # Audience requirement of the current service
60
- ACCESS_TOKEN_AUDIENCE=
61
-
62
- # URL of the authorization service, serves as an issuer requirement
63
- AUTH_SERVICE_URL=
64
-
65
- PRIVATE_KEY_PATH=
66
-
67
- #########
68
- # Redis #
69
- #########
70
-
71
- # Host for redis
72
- REDIS_HOST=
73
-
74
- # Port for redis connection
75
- REDIS_PORT=
76
-
77
- # Password to connect to redis
78
- REDIS_PASSWORD=
79
-
80
- # Is redis setup as a cluster ('true'/'false')
81
- REDIS_CLUSTER=
82
-
83
- # CORS
84
- CORS_ORIGIN=localhost
85
-
86
- # IP FILTER
87
- VALID_IPS='::ffff:127.0.0.1,127.0.0.1,::1'
88
-
89
- # testing secret
90
- JWT_SECRET='bad example secret'
91
-
92
- # hmac testing secret
93
- PAYLOAD_SIGNATURE_SECRET='bad signature secret'
94
-
95
- ###########
96
- # Pub/Sub #
97
- ###########
98
-
99
- # Google Cloud project
100
- GC_PROJECT=
101
-
102
- # Key file to connecto to Google Cloud
103
- GC_KEYFILE=
104
-
105
- # Default Pub/Sub topic
106
- PUBSUB_EVENT_TOPIC=
107
-
108
- # Pub/Sub topic for analytics
109
- PUBSUB_ANALYTICS_TOPIC=
110
-
111
- # Pub/Sub topic for cache invalidation
112
- PUBSUB_CACHE_TOPIC=
113
-
114
- # Subscriptions for the legacy topic on which model updates are propagated
115
- PUBSUB_UPDATE_SUBSCRIPTION=
116
-
117
- # secret Hash params
118
- HASH_SECRET=
119
- HASH_SALT=
120
-
121
-
122
- ##########
123
- # Elastic Search #
124
- ##########
125
-
126
- # The path link to Elastic Search migration data
127
- ELASTIC_SEARCH_MIGRATION_PATH=
128
-
129
- # The elastic search host url
130
- ELASTIC_SEARCH_HOST=
131
-
132
- # The elastic search user name
133
- ELASTIC_SEARCH_USERNAME=''
134
-
135
- # The elastic search password
136
- ELASTIC_SEARCH_PASSWORD=''
137
-
138
-
139
- ###########
140
- # Database #
141
- ###########
142
-
143
- # Indicates whether trigger the run migrations automatically or not
144
- RUN_MIGRATION=
145
-
146
- # Indicates whether trigger the run un migrations automatically or not
147
- UNDO_MIGRATION=
148
-
149
- # Indicate the path of the directory where the datbase migrations are
150
- DB_MIGRATIONS_DIR=
151
-
152
- # Default message Audience
153
- DEFAULT_MESSAGE_AUDIENCE=
154
-
155
-
156
- ###########
157
- # SMTP Configuration #
158
- ###########
159
-
160
- # The SMTP server host (e.g., smtp.gmail.com, smtp.mailtrap.io)
161
- SMTP_HOST=smtp.example.com
162
-
163
- # The SMTP port (e.g., 587 for TLS, 465 for SSL, 25 for insecure)
164
- SMTP_PORT=587
165
-
166
- # SMTP authentication username (your email address or username)
167
- SMTP_USER=your-email@example.com
168
-
169
- # SMTP authentication password (your email password or app password)
170
- SMTP_PASS=your-email-password
171
-
172
-
173
- FILE_STORAGE_FOLDER=./uploads
174
-
175
-
176
- ################
177
- # User Service #
178
- ################
179
-
180
- # URL where the user service is located
181
- USER_SERVICE_URL=
182
-
183
- # Attributes of the users to fetch
184
- # Comma separated list of attributes to fetch from the user Service
185
- # (ex: name,permissions,..) all -> for retrun everything
186
- USER_FETCHED_ATTRIBUTES=
@@ -1,41 +0,0 @@
1
- name: Publish to npm
2
-
3
- on:
4
- push:
5
- branches:
6
- - main
7
-
8
- jobs:
9
- publish:
10
- runs-on: ubuntu-latest
11
-
12
- permissions:
13
- contents: write
14
- id-token: write
15
-
16
- steps:
17
- - name: Checkout code
18
- uses: actions/checkout@v4
19
-
20
- - name: Setup Node.js
21
- uses: actions/setup-node@v4
22
- with:
23
- node-version: 20
24
- registry-url: 'https://registry.npmjs.org/'
25
-
26
- - name: Install dependencies
27
- run: npm ci
28
-
29
- - name: Lint
30
- run: npm run lint
31
-
32
- # - name: Test
33
- # run: npm run test
34
-
35
- - name: Build package
36
- run: npm run build --if-present
37
-
38
- - name: Publish to npm
39
- run: npm publish
40
- env:
41
- NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
package/.prettierrc DELETED
@@ -1,7 +0,0 @@
1
- {
2
- "semi": true,
3
- "singleQuote": true,
4
- "tabWidth": 2,
5
- "printWidth": 80,
6
- "trailingComma": "none"
7
- }
package/Dockerfile DELETED
@@ -1,31 +0,0 @@
1
- # Instal package dependencies
2
- FROM node:20 AS dependency
3
-
4
- ARG GITHUB_TOKEN
5
- ENV GITHUB_TOKEN=$GITHUB_TOKEN
6
-
7
- WORKDIR /node
8
-
9
- COPY package*.json ./
10
- COPY .npmrc .
11
- RUN npm ci
12
-
13
- # Build source
14
- FROM dependency AS base
15
- COPY . .
16
-
17
- # Build source
18
- FROM base AS build
19
- RUN npm run build
20
-
21
- # Ship compiled sources
22
- FROM dependency
23
-
24
- ARG BUILD_ID
25
- ENV BUILD_ID=$BUILD_ID
26
-
27
- COPY --from=build /node/dist ./dist
28
-
29
- RUN npm prune --production
30
-
31
- CMD ["node", "--enable-source-maps", "-r" , "./dist/index.js"]
package/babel.config.json DELETED
@@ -1,34 +0,0 @@
1
- {
2
- "presets": [
3
- "@babel/preset-typescript",
4
- [
5
- "@babel/preset-env",
6
- {
7
- "targets": { "node": 20 },
8
- "useBuiltIns": "entry",
9
- "corejs": 3
10
- }
11
- ]
12
- ],
13
- "plugins": [
14
- [
15
- "module-resolver",
16
- {
17
- "root": "src",
18
- "alias": {
19
- "test": "test"
20
- },
21
- "extensions": [".js", ".ts"]
22
- }
23
- ],
24
- ["@babel/plugin-proposal-decorators", { "legacy": true }],
25
- "@babel/plugin-transform-class-properties",
26
- "@babel/plugin-transform-classes",
27
- "@babel/plugin-transform-runtime"
28
- ],
29
- "env": {
30
- "test": {
31
- "plugins": ["istanbul"]
32
- }
33
- }
34
- }
package/eslint.config.mjs DELETED
@@ -1,11 +0,0 @@
1
- import globals from 'globals';
2
- import pluginJs from '@eslint/js';
3
- import tseslint from 'typescript-eslint';
4
-
5
- export default [
6
- { files: ['.src/', '**/*.{js,mjs,cjs,ts}'] },
7
- { languageOptions: { globals: { ...globals.browser, ...globals.node } } },
8
- pluginJs.configs.recommended,
9
- { ignores: ['**/*.test.ts', '**/*.d.ts'] },
10
- ...tseslint.configs.recommended
11
- ];
@@ -1,6 +0,0 @@
1
- /** Debezium event types */
2
- export enum DebeziumEvent {
3
- Create = 'c',
4
- Update = 'u',
5
- Delete = 'd'
6
- }
@@ -1,7 +0,0 @@
1
- export enum LogSeverity {
2
- DEBUG = 'DEBUG',
3
- INFO = 'INFO',
4
- WARNING = 'WARNING',
5
- ERROR = 'ERROR',
6
- CRITICAL = 'CRITICAL'
7
- }
@@ -1,5 +0,0 @@
1
- export * from './mime';
2
- export * from './metrics';
3
- export * from './DebeziumEvent';
4
- export * from './LogSeverity';
5
- export * from './tokenIssuer';
@@ -1,6 +0,0 @@
1
- import { Registry } from 'prom-client';
2
-
3
- // Registry for metrics that apply to this specific instance of the service
4
- export const instanceRegistry = new Registry();
5
- // Registry for metrics that apply to the service as a whole
6
- export const serviceRegistry = new Registry();
package/src/const/mime.ts DELETED
@@ -1,37 +0,0 @@
1
- export const IMAGE_BASIC_MIME = ['image/jpeg', 'image/png'];
2
-
3
- export const IMAGE_MIME = [...IMAGE_BASIC_MIME, 'image/gif', 'image/bmp'];
4
-
5
- export const AUDIO_MIME = [
6
- 'audio/aac',
7
- 'audio/mpeg',
8
- 'audio/wave',
9
- 'audio/wav'
10
- ];
11
-
12
- export const VIDEO_MIME = [
13
- 'video/mpeg',
14
- 'video/mp4',
15
- 'video/3gpp',
16
- 'video/3gp2'
17
- ];
18
-
19
- export const PDF_MIME = ['application/pdf'];
20
-
21
- export const WORD_MIME = [
22
- 'application/msword',
23
- 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'
24
- ];
25
-
26
- export const EXCEL_MIME = [
27
- 'application/vnd.ms-excel',
28
- 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
29
- ];
30
-
31
- export const POWERPOINT_MIME = [
32
- 'application/vnd.ms-powerpoint',
33
- 'application/vnd.openxmlformats-officedocument.presentationml.presentation',
34
- 'application/vnd.openxmlformats-officedocument.presentationml.slideshow'
35
- ];
36
-
37
- export const OFFICE_MIME = [...WORD_MIME, ...EXCEL_MIME, ...POWERPOINT_MIME];
@@ -1,7 +0,0 @@
1
- /** Enum to identify access tokens JWT issuers */
2
- export enum TokenIssuer {
3
- /** For tokens issued by the auth service */
4
- AUTH_SERVICE
5
- }
6
-
7
- export const TOKEN_ISSUERS = Object.values(TokenIssuer);
@@ -1,29 +0,0 @@
1
- import { QueryInterface, DataTypes } from 'sequelize';
2
-
3
- export async function up(queryInterface: QueryInterface): Promise<void> {
4
- await queryInterface.createTable(
5
- 'SequelizeMeta',
6
- {
7
- id: {
8
- type: DataTypes.INTEGER,
9
- autoIncrement: true,
10
- primaryKey: true
11
- },
12
- name: {
13
- type: DataTypes.STRING,
14
- allowNull: false
15
- },
16
- version: {
17
- type: DataTypes.STRING,
18
- allowNull: false
19
- }
20
- },
21
- {
22
- charset: 'utf8mb4',
23
- collate: 'utf8mb4_unicode_ci' // Change this to a valid collation
24
- }
25
- );
26
- }
27
- export async function down(queryInterface: QueryInterface): Promise<void> {
28
- await queryInterface.dropTable('SequelizeMeta');
29
- }
@@ -1,16 +0,0 @@
1
- import { Table, Column, Model, DataType } from 'sequelize-typescript';
2
-
3
- @Table
4
- export class SequelizeMeta extends Model {
5
- @Column({
6
- type: DataType.STRING,
7
- allowNull: false
8
- })
9
- name!: string;
10
-
11
- @Column({
12
- type: DataType.STRING,
13
- allowNull: false
14
- })
15
- version!: string;
16
- }
@@ -1,2 +0,0 @@
1
- export * from './SequelizeMeta';
2
-