emilsoftware-utilities 2.0.0-dev.23 → 2.0.0-dev.25

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 (261) hide show
  1. package/README.MD +147 -0
  2. package/dist/ContractGenerator.d.ts +4 -3
  3. package/dist/ContractGenerator.js +15 -5
  4. package/dist/ContractGenerator.js.map +1 -1
  5. package/dist/DailyFileTransport.d.ts +8 -2
  6. package/dist/DailyFileTransport.js +9 -2
  7. package/dist/DailyFileTransport.js.map +1 -1
  8. package/dist/DatabaseUpdater.js +8 -3
  9. package/dist/DatabaseUpdater.js.map +1 -1
  10. package/dist/ExecutionTimeLogger.d.ts +2 -2
  11. package/dist/ExecutionTimeLogger.js +3 -2
  12. package/dist/ExecutionTimeLogger.js.map +1 -1
  13. package/dist/Logger.d.ts +22 -9
  14. package/dist/Logger.js +131 -54
  15. package/dist/Logger.js.map +1 -1
  16. package/dist/Orm.d.ts +26 -6
  17. package/dist/Orm.js +144 -40
  18. package/dist/Orm.js.map +1 -1
  19. package/dist/Utilities.d.ts +12 -7
  20. package/dist/Utilities.js +57 -22
  21. package/dist/Utilities.js.map +1 -1
  22. package/dist/accessi-module/AccessiModule.d.ts +9 -0
  23. package/dist/accessi-module/AccessiModule.js +12 -4
  24. package/dist/accessi-module/AccessiModule.js.map +1 -1
  25. package/dist/accessi-module/Console/console.css +529 -281
  26. package/dist/accessi-module/Console/console.js +2081 -85
  27. package/dist/accessi-module/Console/console.js.map +1 -1
  28. package/dist/accessi-module/Console/generated/accessiApi.d.ts +167 -1
  29. package/dist/accessi-module/Console/generated/accessiApi.js +156 -2
  30. package/dist/accessi-module/Console/generated/accessiApi.js.map +1 -1
  31. package/dist/accessi-module/Console/generated/model/abilitazioneMenu.d.ts +20 -8
  32. package/dist/accessi-module/Console/generated/model/abilitazioneMenu.js.map +1 -1
  33. package/dist/accessi-module/Console/generated/model/createFilterTypeRequest.d.ts +23 -0
  34. package/dist/accessi-module/Console/generated/model/createFilterTypeRequest.js +3 -0
  35. package/dist/accessi-module/Console/generated/model/createFilterTypeRequest.js.map +1 -0
  36. package/dist/accessi-module/Console/generated/model/createFilterTypeRequestFlgEnabled.d.ts +14 -0
  37. package/dist/accessi-module/Console/generated/model/createFilterTypeRequestFlgEnabled.js +15 -0
  38. package/dist/accessi-module/Console/generated/model/createFilterTypeRequestFlgEnabled.js.map +1 -0
  39. package/dist/accessi-module/Console/generated/model/createMenuGroupRequest.d.ts +27 -0
  40. package/dist/accessi-module/Console/generated/model/createMenuGroupRequest.js +9 -0
  41. package/dist/accessi-module/Console/generated/model/createMenuGroupRequest.js.map +1 -0
  42. package/dist/accessi-module/Console/generated/model/createMenuRequest.d.ts +52 -0
  43. package/dist/accessi-module/Console/generated/model/createMenuRequest.js +9 -0
  44. package/dist/accessi-module/Console/generated/model/createMenuRequest.js.map +1 -0
  45. package/dist/accessi-module/Console/generated/model/createMenuTypeRequest.d.ts +18 -0
  46. package/dist/accessi-module/Console/generated/model/createMenuTypeRequest.js +9 -0
  47. package/dist/accessi-module/Console/generated/model/createMenuTypeRequest.js.map +1 -0
  48. package/dist/accessi-module/Console/generated/model/createServiceTokenRequest.d.ts +16 -0
  49. package/dist/accessi-module/Console/generated/model/createServiceTokenRequest.js +9 -0
  50. package/dist/accessi-module/Console/generated/model/createServiceTokenRequest.js.map +1 -0
  51. package/dist/accessi-module/Console/generated/model/createServiceTokenResponse.d.ts +14 -0
  52. package/dist/accessi-module/Console/generated/model/createServiceTokenResponse.js +3 -0
  53. package/dist/accessi-module/Console/generated/model/createServiceTokenResponse.js.map +1 -0
  54. package/dist/accessi-module/Console/generated/model/getMenuTypesResponse.d.ts +14 -0
  55. package/dist/accessi-module/Console/generated/model/getMenuTypesResponse.js +3 -0
  56. package/dist/accessi-module/Console/generated/model/getMenuTypesResponse.js.map +1 -0
  57. package/dist/accessi-module/Console/generated/model/getServiceTokensParams.d.ts +12 -0
  58. package/dist/accessi-module/Console/generated/model/getServiceTokensParams.js +9 -0
  59. package/dist/accessi-module/Console/generated/model/getServiceTokensParams.js.map +1 -0
  60. package/dist/accessi-module/Console/generated/model/getServiceTokensResponse.d.ts +14 -0
  61. package/dist/accessi-module/Console/generated/model/getServiceTokensResponse.js +3 -0
  62. package/dist/accessi-module/Console/generated/model/getServiceTokensResponse.js.map +1 -0
  63. package/dist/accessi-module/Console/generated/model/getUsersParams.d.ts +8 -0
  64. package/dist/accessi-module/Console/generated/model/getUsersParams.js.map +1 -1
  65. package/dist/accessi-module/Console/generated/model/index.d.ts +18 -0
  66. package/dist/accessi-module/Console/generated/model/index.js +18 -0
  67. package/dist/accessi-module/Console/generated/model/index.js.map +1 -1
  68. package/dist/accessi-module/Console/generated/model/issuedServiceTokenDto.d.ts +30 -0
  69. package/dist/accessi-module/Console/generated/model/issuedServiceTokenDto.js +9 -0
  70. package/dist/accessi-module/Console/generated/model/issuedServiceTokenDto.js.map +1 -0
  71. package/dist/accessi-module/Console/generated/model/menuTypeEntity.d.ts +12 -0
  72. package/dist/accessi-module/Console/generated/model/menuTypeEntity.js +9 -0
  73. package/dist/accessi-module/Console/generated/model/menuTypeEntity.js.map +1 -0
  74. package/dist/accessi-module/Console/generated/model/serviceTokenDto.d.ts +28 -0
  75. package/dist/accessi-module/Console/generated/model/serviceTokenDto.js +9 -0
  76. package/dist/accessi-module/Console/generated/model/serviceTokenDto.js.map +1 -0
  77. package/dist/accessi-module/Console/generated/model/updateFilterTypeRequest.d.ts +21 -0
  78. package/dist/accessi-module/Console/generated/model/updateFilterTypeRequest.js +3 -0
  79. package/dist/accessi-module/Console/generated/model/updateFilterTypeRequest.js.map +1 -0
  80. package/dist/accessi-module/Console/generated/model/updateFilterTypeRequestFlgEnabled.d.ts +14 -0
  81. package/dist/accessi-module/Console/generated/model/updateFilterTypeRequestFlgEnabled.js +15 -0
  82. package/dist/accessi-module/Console/generated/model/updateFilterTypeRequestFlgEnabled.js.map +1 -0
  83. package/dist/accessi-module/Console/generated/model/updateMenuGroupRequest.d.ts +22 -0
  84. package/dist/accessi-module/Console/generated/model/updateMenuGroupRequest.js +9 -0
  85. package/dist/accessi-module/Console/generated/model/updateMenuGroupRequest.js.map +1 -0
  86. package/dist/accessi-module/Console/generated/model/updateMenuRequest.d.ts +47 -0
  87. package/dist/accessi-module/Console/generated/model/updateMenuRequest.js +9 -0
  88. package/dist/accessi-module/Console/generated/model/updateMenuRequest.js.map +1 -0
  89. package/dist/accessi-module/Console/generated/model/updateMenuTypeRequest.d.ts +13 -0
  90. package/dist/accessi-module/Console/generated/model/updateMenuTypeRequest.js +9 -0
  91. package/dist/accessi-module/Console/generated/model/updateMenuTypeRequest.js.map +1 -0
  92. package/dist/accessi-module/Console/help.d.ts +13 -0
  93. package/dist/accessi-module/Console/help.js +348 -0
  94. package/dist/accessi-module/Console/help.js.map +1 -0
  95. package/dist/accessi-module/Console/index.html +89 -21
  96. package/dist/accessi-module/Console/wiki.d.ts +52 -0
  97. package/dist/accessi-module/Console/wiki.js +689 -0
  98. package/dist/accessi-module/Console/wiki.js.map +1 -0
  99. package/dist/accessi-module/Controllers/AccessiConsoleController.d.ts +8 -1
  100. package/dist/accessi-module/Controllers/AccessiConsoleController.js +52 -15
  101. package/dist/accessi-module/Controllers/AccessiConsoleController.js.map +1 -1
  102. package/dist/accessi-module/Controllers/ConfiguratorController.d.ts +1 -3
  103. package/dist/accessi-module/Controllers/ConfiguratorController.js +6 -8
  104. package/dist/accessi-module/Controllers/ConfiguratorController.js.map +1 -1
  105. package/dist/accessi-module/Controllers/EmailController.d.ts +1 -1
  106. package/dist/accessi-module/Controllers/EmailController.js +1 -1
  107. package/dist/accessi-module/Controllers/EmailController.js.map +1 -1
  108. package/dist/accessi-module/Controllers/FiltriController.d.ts +5 -4
  109. package/dist/accessi-module/Controllers/FiltriController.js +92 -4
  110. package/dist/accessi-module/Controllers/FiltriController.js.map +1 -1
  111. package/dist/accessi-module/Controllers/PermissionController.d.ts +11 -0
  112. package/dist/accessi-module/Controllers/PermissionController.js +273 -8
  113. package/dist/accessi-module/Controllers/PermissionController.js.map +1 -1
  114. package/dist/accessi-module/Controllers/ServiceTokenController.d.ts +23 -0
  115. package/dist/accessi-module/Controllers/ServiceTokenController.js +176 -0
  116. package/dist/accessi-module/Controllers/ServiceTokenController.js.map +1 -0
  117. package/dist/accessi-module/Controllers/UserController.d.ts +2 -2
  118. package/dist/accessi-module/Controllers/UserController.js +25 -9
  119. package/dist/accessi-module/Controllers/UserController.js.map +1 -1
  120. package/dist/accessi-module/Dtos/Abilitazione.js.map +1 -1
  121. package/dist/accessi-module/Dtos/AbilitazioneMenu.js +16 -8
  122. package/dist/accessi-module/Dtos/AbilitazioneMenu.js.map +1 -1
  123. package/dist/accessi-module/Dtos/AssignPermissionsToUserRequest.js.map +1 -1
  124. package/dist/accessi-module/Dtos/AssignRolesToUserRequest.js.map +1 -1
  125. package/dist/accessi-module/Dtos/AuthenticatedUserPayloadDto.js.map +1 -1
  126. package/dist/accessi-module/Dtos/BaseResponse.js.map +1 -1
  127. package/dist/accessi-module/Dtos/CatalogDtos.d.ts +66 -0
  128. package/dist/accessi-module/Dtos/CatalogDtos.js +336 -0
  129. package/dist/accessi-module/Dtos/CatalogDtos.js.map +1 -0
  130. package/dist/accessi-module/Dtos/ConfirmResetPasswordRequest.js.map +1 -1
  131. package/dist/accessi-module/Dtos/FiltriUtente.js.map +1 -1
  132. package/dist/accessi-module/Dtos/GetGroupsWithMenusResponse.js.map +1 -1
  133. package/dist/accessi-module/Dtos/GetMenusResponse.js +1 -1
  134. package/dist/accessi-module/Dtos/GetMenusResponse.js.map +1 -1
  135. package/dist/accessi-module/Dtos/GetRolesResponse.js.map +1 -1
  136. package/dist/accessi-module/Dtos/GetUserByTokenRequest.js.map +1 -1
  137. package/dist/accessi-module/Dtos/GetUserByTokenResponse.js.map +1 -1
  138. package/dist/accessi-module/Dtos/GetUsersResponse.d.ts +1 -1
  139. package/dist/accessi-module/Dtos/GetUsersResponse.js.map +1 -1
  140. package/dist/accessi-module/Dtos/LoginRequest.js.map +1 -1
  141. package/dist/accessi-module/Dtos/LoginResponse.d.ts +1 -1
  142. package/dist/accessi-module/Dtos/LoginResponse.js +1 -1
  143. package/dist/accessi-module/Dtos/LoginResponse.js.map +1 -1
  144. package/dist/accessi-module/Dtos/MenuItem.js +1 -0
  145. package/dist/accessi-module/Dtos/Permission.js.map +1 -1
  146. package/dist/accessi-module/Dtos/RegisterRequest.js +2 -1
  147. package/dist/accessi-module/Dtos/RegisterRequest.js.map +1 -1
  148. package/dist/accessi-module/Dtos/RegisterResponse.js.map +1 -1
  149. package/dist/accessi-module/Dtos/Role.js.map +1 -1
  150. package/dist/accessi-module/Dtos/RuoliMenu.js.map +1 -1
  151. package/dist/accessi-module/Dtos/SendResetPasswordEmailRequest.js.map +1 -1
  152. package/dist/accessi-module/Dtos/ServiceToken.d.ts +34 -0
  153. package/dist/accessi-module/Dtos/ServiceToken.js +128 -0
  154. package/dist/accessi-module/Dtos/ServiceToken.js.map +1 -0
  155. package/dist/accessi-module/Dtos/SetStatoRegistrazione.js.map +1 -1
  156. package/dist/accessi-module/Dtos/TipoFiltro.js.map +1 -1
  157. package/dist/accessi-module/Dtos/TokenResult.js.map +1 -1
  158. package/dist/accessi-module/Dtos/TwoFactorDtos.js.map +1 -1
  159. package/dist/accessi-module/Dtos/UpdateEnabledStatusRequest.js.map +1 -1
  160. package/dist/accessi-module/Dtos/UserDto.js +4 -2
  161. package/dist/accessi-module/Dtos/UserDto.js.map +1 -1
  162. package/dist/accessi-module/Dtos/UserGrantsDto.js.map +1 -1
  163. package/dist/accessi-module/Dtos/UserGrantsResponse.js.map +1 -1
  164. package/dist/accessi-module/Dtos/index.d.ts +2 -0
  165. package/dist/accessi-module/Dtos/index.js +2 -0
  166. package/dist/accessi-module/Dtos/index.js.map +1 -1
  167. package/dist/accessi-module/Services/AuthService/AuthService.d.ts +2 -2
  168. package/dist/accessi-module/Services/AuthService/AuthService.js +36 -36
  169. package/dist/accessi-module/Services/AuthService/AuthService.js.map +1 -1
  170. package/dist/accessi-module/Services/EmailService/EmailService.d.ts +2 -1
  171. package/dist/accessi-module/Services/EmailService/EmailService.js +9 -6
  172. package/dist/accessi-module/Services/EmailService/EmailService.js.map +1 -1
  173. package/dist/accessi-module/Services/FiltriService/FiltriService.d.ts +10 -3
  174. package/dist/accessi-module/Services/FiltriService/FiltriService.js +64 -6
  175. package/dist/accessi-module/Services/FiltriService/FiltriService.js.map +1 -1
  176. package/dist/accessi-module/Services/PermissionService/PermissionService.d.ts +44 -1
  177. package/dist/accessi-module/Services/PermissionService/PermissionService.js +418 -110
  178. package/dist/accessi-module/Services/PermissionService/PermissionService.js.map +1 -1
  179. package/dist/accessi-module/Services/ServiceTokenService/ServiceTokenService.d.ts +75 -0
  180. package/dist/accessi-module/Services/ServiceTokenService/ServiceTokenService.js +265 -0
  181. package/dist/accessi-module/Services/ServiceTokenService/ServiceTokenService.js.map +1 -0
  182. package/dist/accessi-module/Services/TwoFactorService/TwoFactorService.js +23 -27
  183. package/dist/accessi-module/Services/TwoFactorService/TwoFactorService.js.map +1 -1
  184. package/dist/accessi-module/Services/UserService/UserService.d.ts +10 -3
  185. package/dist/accessi-module/Services/UserService/UserService.js +170 -84
  186. package/dist/accessi-module/Services/UserService/UserService.js.map +1 -1
  187. package/dist/accessi-module/database-updates/AccessiDatabaseUpdater.d.ts +9 -0
  188. package/dist/accessi-module/database-updates/AccessiDatabaseUpdater.js +76 -28
  189. package/dist/accessi-module/database-updates/AccessiDatabaseUpdater.js.map +1 -1
  190. package/dist/accessi-module/database-updates/accessiSchema.d.ts +1 -1
  191. package/dist/accessi-module/database-updates/accessiSchema.js +9 -1
  192. package/dist/accessi-module/database-updates/accessiSchema.js.map +1 -1
  193. package/dist/accessi-module/database-updates/optionalColumns.d.ts +2 -0
  194. package/dist/accessi-module/database-updates/optionalColumns.js +33 -1
  195. package/dist/accessi-module/database-updates/optionalColumns.js.map +1 -1
  196. package/dist/accessi-module/database-updates/runAccessiDbUpdate.js +7 -2
  197. package/dist/accessi-module/database-updates/runAccessiDbUpdate.js.map +1 -1
  198. package/dist/accessi-module/federated-auth/FederatedAuthController.d.ts +1 -0
  199. package/dist/accessi-module/federated-auth/FederatedAuthController.js +26 -0
  200. package/dist/accessi-module/federated-auth/FederatedAuthController.js.map +1 -1
  201. package/dist/accessi-module/federated-auth/FederatedAuthService.d.ts +6 -0
  202. package/dist/accessi-module/federated-auth/FederatedAuthService.js +28 -1
  203. package/dist/accessi-module/federated-auth/FederatedAuthService.js.map +1 -1
  204. package/dist/accessi-module/index.d.ts +4 -1
  205. package/dist/accessi-module/index.js +8 -2
  206. package/dist/accessi-module/index.js.map +1 -1
  207. package/dist/accessi-module/jwt/jwt.strategy.js +8 -5
  208. package/dist/accessi-module/jwt/jwt.strategy.js.map +1 -1
  209. package/dist/accessi-module/middleware/accessiRequirements.d.ts +1 -1
  210. package/dist/accessi-module/middleware/accessiRequirements.js.map +1 -1
  211. package/dist/accessi-module/middleware/authenticateGen.js +11 -7
  212. package/dist/accessi-module/middleware/authenticateGen.js.map +1 -1
  213. package/dist/accessi-module/security/accessControl.js +8 -3
  214. package/dist/accessi-module/security/accessControl.js.map +1 -1
  215. package/dist/accessi-module/security/authenticatedToken.d.ts +1 -1
  216. package/dist/accessi-module/security/authenticatedToken.js +2 -1
  217. package/dist/accessi-module/security/authenticatedToken.js.map +1 -1
  218. package/dist/accessi-module/security/passwordResetToken.d.ts +9 -3
  219. package/dist/accessi-module/security/passwordResetToken.js +9 -5
  220. package/dist/accessi-module/security/passwordResetToken.js.map +1 -1
  221. package/dist/accessi-module/security/publicAuthRateLimit.d.ts +1 -1
  222. package/dist/accessi-module/security/publicAuthRateLimit.js +28 -8
  223. package/dist/accessi-module/security/publicAuthRateLimit.js.map +1 -1
  224. package/dist/accessi-module/security/serviceTokenGuard.d.ts +25 -0
  225. package/dist/accessi-module/security/serviceTokenGuard.js +85 -0
  226. package/dist/accessi-module/security/serviceTokenGuard.js.map +1 -0
  227. package/dist/accessi-module/security/serviceTokenRateLimit.d.ts +8 -0
  228. package/dist/accessi-module/security/serviceTokenRateLimit.js +49 -0
  229. package/dist/accessi-module/security/serviceTokenRateLimit.js.map +1 -0
  230. package/dist/allegati-module/AllegatiModule.d.ts +11 -0
  231. package/dist/allegati-module/AllegatiModule.js +11 -1
  232. package/dist/allegati-module/AllegatiModule.js.map +1 -1
  233. package/dist/allegati-module/Controllers/AllegatiController.d.ts +2 -1
  234. package/dist/allegati-module/Controllers/AllegatiController.js +23 -15
  235. package/dist/allegati-module/Controllers/AllegatiController.js.map +1 -1
  236. package/dist/allegati-module/Dtos/AllegatoDto.js.map +1 -1
  237. package/dist/allegati-module/Dtos/BaseResponse.js.map +1 -1
  238. package/dist/allegati-module/Dtos/UploadSingleFileRequest.js.map +1 -1
  239. package/dist/allegati-module/Dtos/responses/DownloadAllegatoResponseDto.js.map +1 -1
  240. package/dist/allegati-module/Dtos/responses/GetListResponse.js.map +1 -1
  241. package/dist/allegati-module/Dtos/responses/UploadAllegatoResponseDto.js.map +1 -1
  242. package/dist/allegati-module/Services/AllegatiService/AllegatiService.d.ts +10 -3
  243. package/dist/allegati-module/Services/AllegatiService/AllegatiService.js +101 -52
  244. package/dist/allegati-module/Services/AllegatiService/AllegatiService.js.map +1 -1
  245. package/dist/allegati-module/security/allegatiAuthorizationGuard.d.ts +14 -0
  246. package/dist/allegati-module/security/allegatiAuthorizationGuard.js +70 -0
  247. package/dist/allegati-module/security/allegatiAuthorizationGuard.js.map +1 -0
  248. package/dist/autobind.d.ts +10 -3
  249. package/dist/autobind.js +24 -9
  250. package/dist/autobind.js.map +1 -1
  251. package/dist/emilsoftware-utilities-2.0.0-dev.25.tgz +0 -0
  252. package/dist/firebird-compat.d.ts +13 -0
  253. package/dist/firebird-compat.js +3 -2
  254. package/dist/firebird-compat.js.map +1 -1
  255. package/dist/scripts/generateAccessiWiki.d.ts +1 -0
  256. package/dist/scripts/generateAccessiWiki.js +131 -0
  257. package/dist/scripts/generateAccessiWiki.js.map +1 -0
  258. package/dist/swagger/SwaggerConfig.js +6 -3
  259. package/dist/swagger/SwaggerConfig.js.map +1 -1
  260. package/package.json +19 -8
  261. package/dist/emilsoftware-utilities-2.0.0-dev.23.tgz +0 -0
package/dist/Orm.js CHANGED
@@ -51,10 +51,73 @@ class Orm {
51
51
  static quote(value) {
52
52
  return "\"" + value + "\"";
53
53
  }
54
+ /** Dimensione pool: default 5 (pool attivo); `poolSize: 0` disabilita e torna all'attach per query. */
55
+ static getPoolSize(options) {
56
+ const raw = options.poolSize;
57
+ if (raw === 0) {
58
+ return 0;
59
+ }
60
+ const size = raw === undefined ? 5 : Number(raw);
61
+ return Number.isFinite(size) && size > 0 ? Math.trunc(size) : 0;
62
+ }
63
+ static shouldLogQueryParameters(options) {
64
+ return options.logQueryParameters === true;
65
+ }
66
+ static formatQueryForLog(query, parameters, includeValues) {
67
+ const parameterList = Array.isArray(parameters) ? parameters : Object.values(parameters !== null && parameters !== void 0 ? parameters : {});
68
+ if (includeValues) {
69
+ return Utilities_1.RestUtilities.printQueryWithParams(query, parameterList);
70
+ }
71
+ return `${query.replace(/\s+/g, " ").trim()} [params=${parameterList.length}]`;
72
+ }
73
+ static buildPoolKey(options, size) {
74
+ var _a, _b, _c, _d, _e, _f;
75
+ const normalized = (0, firebird_compat_1.normalizeFirebirdOptions)(options);
76
+ return [
77
+ size,
78
+ (_a = normalized.host) !== null && _a !== void 0 ? _a : "",
79
+ (_b = normalized.port) !== null && _b !== void 0 ? _b : "",
80
+ (_c = normalized.database) !== null && _c !== void 0 ? _c : "",
81
+ (_d = normalized.user) !== null && _d !== void 0 ? _d : "",
82
+ (_e = normalized.pluginName) !== null && _e !== void 0 ? _e : "",
83
+ String((_f = normalized.wireCrypt) !== null && _f !== void 0 ? _f : ""),
84
+ ].join("|");
85
+ }
86
+ /**
87
+ * Chiude tutti i pool creati (opt-in `poolSize`). Utile a fine processo o nei test,
88
+ * perché i pool mantengono connessioni e timer attivi.
89
+ */
90
+ static closePools() {
91
+ return __awaiter(this, void 0, void 0, function* () {
92
+ const pools = Array.from(this.pools.values());
93
+ this.pools.clear();
94
+ yield Promise.all(pools.map((pool) => new Promise((resolve) => {
95
+ try {
96
+ pool.destroy(() => resolve());
97
+ }
98
+ catch (_a) {
99
+ resolve();
100
+ }
101
+ })));
102
+ });
103
+ }
104
+ static getPool(options, size) {
105
+ const normalized = (0, firebird_compat_1.normalizeFirebirdOptions)(options);
106
+ const key = this.buildPoolKey(normalized, size);
107
+ let pool = this.pools.get(key);
108
+ if (!pool) {
109
+ this.logger.info(`Firebird pool created (max=${size}) using ${(0, firebird_compat_1.describeFirebirdCompatibilityOptions)(normalized)}`);
110
+ pool = Firebird.pool(size, normalized);
111
+ pool.on("error", (error) => {
112
+ this.logger.error(`Firebird pool error: ${error.message}`);
113
+ });
114
+ this.pools.set(key, pool);
115
+ }
116
+ return pool;
117
+ }
54
118
  static getTimeoutMs(options) {
55
119
  var _a;
56
- const normalizedOptions = (0, firebird_compat_1.normalizeFirebirdOptions)(options);
57
- const candidate = (_a = normalizedOptions.connectTimeout) !== null && _a !== void 0 ? _a : 15000;
120
+ const candidate = (_a = options.connectTimeout) !== null && _a !== void 0 ? _a : 15000;
58
121
  return Number.isFinite(candidate) && candidate > 0 ? Math.trunc(candidate) : 15000;
59
122
  }
60
123
  static createTimeoutError(stage, timeoutMs, options, query) {
@@ -79,8 +142,7 @@ class Orm {
79
142
  });
80
143
  }
81
144
  static shouldTrimStringResults(options) {
82
- const normalizedOptions = (0, firebird_compat_1.normalizeFirebirdOptions)(options);
83
- return normalizedOptions.trimStringResults !== false;
145
+ return options.trimStringResults !== false;
84
146
  }
85
147
  static normalizeResultValue(value, trimStringResults) {
86
148
  if (!trimStringResults || value === undefined || value === null) {
@@ -96,8 +158,9 @@ class Orm {
96
158
  return value;
97
159
  }
98
160
  if (typeof value === "object") {
99
- return Object.keys(value).reduce((normalized, key) => {
100
- normalized[key] = this.normalizeResultValue(value[key], trimStringResults);
161
+ const source = value;
162
+ return Object.keys(source).reduce((normalized, key) => {
163
+ normalized[key] = this.normalizeResultValue(source[key], trimStringResults);
101
164
  return normalized;
102
165
  }, {});
103
166
  }
@@ -107,6 +170,7 @@ class Orm {
107
170
  return new Promise((resolve, reject) => {
108
171
  const normalizedOptions = (0, firebird_compat_1.normalizeFirebirdOptions)(options);
109
172
  const timeoutMs = this.getTimeoutMs(normalizedOptions);
173
+ const poolSize = this.getPoolSize(options);
110
174
  let settled = false;
111
175
  const timeoutId = setTimeout(() => {
112
176
  if (settled) {
@@ -115,8 +179,7 @@ class Orm {
115
179
  settled = true;
116
180
  reject((0, firebird_compat_1.enhanceFirebirdError)(this.createTimeoutError("attach", timeoutMs, normalizedOptions), normalizedOptions, { stage: "attach" }));
117
181
  }, timeoutMs);
118
- this.logger.info(`Firebird attach using ${(0, firebird_compat_1.describeFirebirdCompatibilityOptions)(normalizedOptions)}`);
119
- Firebird.attach(normalizedOptions, (err, db) => __awaiter(this, void 0, void 0, function* () {
182
+ const handle = (err, db) => __awaiter(this, void 0, void 0, function* () {
120
183
  if (settled) {
121
184
  yield this.detachQuietly(db);
122
185
  return;
@@ -127,7 +190,23 @@ class Orm {
127
190
  return reject((0, firebird_compat_1.enhanceFirebirdError)(err, normalizedOptions, { stage: "attach" }));
128
191
  }
129
192
  return resolve(db);
130
- }));
193
+ });
194
+ try {
195
+ if (poolSize > 0) {
196
+ this.getPool(options, poolSize).get(handle);
197
+ return;
198
+ }
199
+ this.logger.info(`Firebird attach using ${(0, firebird_compat_1.describeFirebirdCompatibilityOptions)(normalizedOptions)}`);
200
+ Firebird.attach(normalizedOptions, handle);
201
+ }
202
+ catch (error) {
203
+ // Attach/get sincrono fallito: evita di lasciare il timer di timeout pendente.
204
+ if (!settled) {
205
+ settled = true;
206
+ clearTimeout(timeoutId);
207
+ reject((0, firebird_compat_1.enhanceFirebirdError)(error, normalizedOptions, { stage: "attach" }));
208
+ }
209
+ }
131
210
  });
132
211
  }
133
212
  static testConnection(options) {
@@ -151,7 +230,7 @@ class Orm {
151
230
  return __awaiter(this, arguments, void 0, function* (options, query, parameters = [], logQuery = true) {
152
231
  try {
153
232
  const normalizedOptions = (0, firebird_compat_1.normalizeFirebirdOptions)(options);
154
- const db = yield this.attachWithTimeout(normalizedOptions);
233
+ const db = yield this.attachWithTimeout(options);
155
234
  return yield new Promise((resolve, reject) => {
156
235
  const timeoutMs = this.getTimeoutMs(normalizedOptions);
157
236
  let settled = false;
@@ -164,7 +243,7 @@ class Orm {
164
243
  reject((0, firebird_compat_1.enhanceFirebirdError)(this.createTimeoutError("query", timeoutMs, normalizedOptions, query), normalizedOptions, { stage: "query", sql: query }));
165
244
  }), timeoutMs);
166
245
  if (logQuery) {
167
- this.logger.info(Utilities_1.RestUtilities.printQueryWithParams(query, parameters));
246
+ this.logger.info(this.formatQueryForLog(query, parameters, this.shouldLogQueryParameters(options)));
168
247
  }
169
248
  db.query(query, parameters, (error, result) => __awaiter(this, void 0, void 0, function* () {
170
249
  if (settled) {
@@ -192,7 +271,7 @@ class Orm {
192
271
  return __awaiter(this, arguments, void 0, function* (options, query, parameters = [], logQuery = true) {
193
272
  try {
194
273
  const normalizedOptions = (0, firebird_compat_1.normalizeFirebirdOptions)(options);
195
- const db = yield this.attachWithTimeout(normalizedOptions);
274
+ const db = yield this.attachWithTimeout(options);
196
275
  return yield new Promise((resolve, reject) => {
197
276
  const timeoutMs = this.getTimeoutMs(normalizedOptions);
198
277
  let settled = false;
@@ -205,7 +284,7 @@ class Orm {
205
284
  reject((0, firebird_compat_1.enhanceFirebirdError)(this.createTimeoutError("execute", timeoutMs, normalizedOptions, query), normalizedOptions, { stage: "execute", sql: query }));
206
285
  }), timeoutMs);
207
286
  if (logQuery) {
208
- this.logger.info(Utilities_1.RestUtilities.printQueryWithParams(query, parameters));
287
+ this.logger.info(this.formatQueryForLog(query, parameters, this.shouldLogQueryParameters(options)));
209
288
  }
210
289
  db.execute(query, parameters, (error, result) => __awaiter(this, void 0, void 0, function* () {
211
290
  if (settled) {
@@ -231,7 +310,7 @@ class Orm {
231
310
  }
232
311
  static trimParam(param) {
233
312
  if (typeof param === "string" || param instanceof String) {
234
- return param.trim();
313
+ return String(param).trim();
235
314
  }
236
315
  return param;
237
316
  }
@@ -240,6 +319,49 @@ class Orm {
240
319
  return this.attachWithTimeout(options);
241
320
  });
242
321
  }
322
+ /**
323
+ * Runs `operation` inside a single Firebird transaction: commit on success,
324
+ * rollback on failure, detach in every case. Use it to make multi-statement
325
+ * writes atomic instead of relying on auto-commit per statement.
326
+ */
327
+ static withTransaction(options, operation) {
328
+ return __awaiter(this, void 0, void 0, function* () {
329
+ const db = yield this.connect(options);
330
+ let transaction;
331
+ try {
332
+ transaction = yield this.startTransaction(db);
333
+ const result = yield operation(transaction);
334
+ yield this.commitTransaction(transaction);
335
+ return result;
336
+ }
337
+ catch (error) {
338
+ if (transaction) {
339
+ try {
340
+ yield this.rollbackTransaction(transaction);
341
+ }
342
+ catch (_a) {
343
+ // Se la rollback fallisce (connessione persa) l'errore originale resta quello rilevante.
344
+ }
345
+ }
346
+ throw error;
347
+ }
348
+ finally {
349
+ yield this.detachQuietly(db);
350
+ }
351
+ });
352
+ }
353
+ /** Esegue una query su una transazione esistente e ne restituisce il risultato. */
354
+ static transactionQuery(transaction, query, parameters = []) {
355
+ return new Promise((resolve, reject) => {
356
+ transaction.query(query, parameters, (error, result) => {
357
+ if (error) {
358
+ reject(error);
359
+ return;
360
+ }
361
+ resolve(result);
362
+ });
363
+ });
364
+ }
243
365
  static startTransaction(db) {
244
366
  return __awaiter(this, void 0, void 0, function* () {
245
367
  return new Promise((resolve, reject) => {
@@ -278,32 +400,12 @@ class Orm {
278
400
  }
279
401
  static executeMultiple(options, queriesWithParams) {
280
402
  return __awaiter(this, void 0, void 0, function* () {
281
- let db;
282
- let transaction;
283
- try {
284
- db = yield Orm.connect(options);
285
- transaction = yield Orm.startTransaction(db);
403
+ yield Orm.withTransaction(options, (transaction) => __awaiter(this, void 0, void 0, function* () {
286
404
  for (const qwp of queriesWithParams) {
287
- yield new Promise((resolve, reject) => {
288
- transaction.query(qwp.query, qwp.params, (err, result) => {
289
- if (err) {
290
- return reject(err);
291
- }
292
- return resolve(result);
293
- });
294
- });
405
+ yield Orm.transactionQuery(transaction, qwp.query, qwp.params);
295
406
  }
296
- yield Orm.commitTransaction(transaction);
297
- yield Orm.detachQuietly(db);
298
- return "OK";
299
- }
300
- catch (error) {
301
- if (transaction) {
302
- yield Orm.rollbackTransaction(transaction);
303
- }
304
- yield Orm.detachQuietly(db);
305
- throw error;
306
- }
407
+ }));
408
+ return "OK";
307
409
  });
308
410
  }
309
411
  static executeQueries(transaction, queries, params) {
@@ -311,7 +413,8 @@ class Orm {
311
413
  try {
312
414
  return yield queries.reduce((promiseChain, currentQuery, index) => {
313
415
  return promiseChain.then(() => new Promise((resolve, reject) => {
314
- transaction.query(currentQuery, params[index], (err, result) => {
416
+ var _a;
417
+ transaction.query(currentQuery, (_a = params[index]) !== null && _a !== void 0 ? _a : [], (err, result) => {
315
418
  if (err) {
316
419
  return reject(err);
317
420
  }
@@ -321,7 +424,7 @@ class Orm {
321
424
  }, Promise.resolve());
322
425
  }
323
426
  catch (error) {
324
- return yield new Promise((resolve, reject) => {
427
+ return yield new Promise((_resolve, reject) => {
325
428
  transaction.rollback((rollbackErr) => {
326
429
  if (rollbackErr) {
327
430
  return reject(rollbackErr);
@@ -335,4 +438,5 @@ class Orm {
335
438
  }
336
439
  exports.Orm = Orm;
337
440
  Orm.logger = new Logger_1.Logger(Orm.name);
441
+ Orm.pools = new Map();
338
442
  //# sourceMappingURL=Orm.js.map
package/dist/Orm.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"Orm.js","sourceRoot":"","sources":["../src/Orm.ts"],"names":[],"mappings":"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","sourcesContent":["import * as Firebird from \"node-firebird\";\nimport { Database, Options, Transaction } from \"node-firebird\";\nimport { Logger } from \"./Logger\";\nimport { RestUtilities } from \"./Utilities\";\nimport {\n describeFirebirdCompatibilityOptions,\n enhanceFirebirdError,\n FirebirdOptions,\n normalizeFirebirdOptions,\n} from \"./firebird-compat\";\n\nexport class Orm {\n private static logger: Logger = new Logger(Orm.name);\n\n public static quote(value: string): string {\n return \"\\\"\" + value + \"\\\"\";\n }\n\n private static getTimeoutMs(options: Options): number {\n const normalizedOptions = normalizeFirebirdOptions(options);\n const candidate = normalizedOptions.connectTimeout ?? 15000;\n return Number.isFinite(candidate) && candidate > 0 ? Math.trunc(candidate) : 15000;\n }\n\n private static createTimeoutError(stage: string, timeoutMs: number, options: Options, query?: string): Error {\n const target = `${options.host ?? \"?\"}:${options.port ?? \"?\"} -> ${options.database ?? \"?\"}`;\n const suffix = query ? ` | sql=${query.replace(/\\s+/g, \" \").trim()}` : \"\";\n return new Error(`Timeout during Firebird ${stage} after ${timeoutMs} ms on ${target}${suffix}`);\n }\n\n private static async detachQuietly(db: Database | undefined): Promise<void> {\n if (!db) {\n return;\n }\n\n await new Promise<void>((resolve) => {\n try {\n db.detach(() => resolve());\n } catch {\n resolve();\n }\n });\n }\n\n private static shouldTrimStringResults(options: Options): boolean {\n const normalizedOptions = normalizeFirebirdOptions(options);\n return normalizedOptions.trimStringResults !== false;\n }\n\n private static normalizeResultValue(value: any, trimStringResults: boolean): any {\n if (!trimStringResults || value === undefined || value === null) {\n return value;\n }\n\n if (typeof value === \"string\" || value instanceof String) {\n return String(value).trimEnd();\n }\n\n if (Array.isArray(value)) {\n return value.map((item) => this.normalizeResultValue(item, trimStringResults));\n }\n\n if (value instanceof Date || Buffer.isBuffer(value)) {\n return value;\n }\n\n if (typeof value === \"object\") {\n return Object.keys(value).reduce((normalized: Record<string, any>, key: string) => {\n normalized[key] = this.normalizeResultValue(value[key], trimStringResults);\n return normalized;\n }, {});\n }\n\n return value;\n }\n\n private static attachWithTimeout(options: Options): Promise<Database> {\n return new Promise((resolve, reject): void => {\n const normalizedOptions = normalizeFirebirdOptions(options);\n const timeoutMs = this.getTimeoutMs(normalizedOptions);\n let settled = false;\n const timeoutId = setTimeout(() => {\n if (settled) {\n return;\n }\n\n settled = true;\n reject(\n enhanceFirebirdError(\n this.createTimeoutError(\"attach\", timeoutMs, normalizedOptions),\n normalizedOptions,\n { stage: \"attach\" },\n ),\n );\n }, timeoutMs);\n\n this.logger.info(`Firebird attach using ${describeFirebirdCompatibilityOptions(normalizedOptions)}`);\n\n Firebird.attach(normalizedOptions, async (err: any, db: Database): Promise<void> => {\n if (settled) {\n await this.detachQuietly(db);\n return;\n }\n\n settled = true;\n clearTimeout(timeoutId);\n\n if (err) {\n return reject(enhanceFirebirdError(err, normalizedOptions, { stage: \"attach\" }));\n }\n\n return resolve(db);\n });\n });\n }\n\n public static async testConnection(options: Options): Promise<boolean> {\n return new Promise((resolve): void => {\n this.attachWithTimeout(options)\n .then(async (db: Database): Promise<void> => {\n this.logger.info(\"DATABASE connesso.\");\n await this.detachQuietly(db);\n resolve(true);\n })\n .catch((err: Error): void => {\n this.logger.error(\"La connessione con il DATABASE non e andata a buon fine.\");\n this.logger.error(err);\n resolve(false);\n });\n });\n }\n\n public static async query(options: Options, query: string, parameters: any[] = [], logQuery = true): Promise<any> {\n try {\n const normalizedOptions = normalizeFirebirdOptions(options);\n const db = await this.attachWithTimeout(normalizedOptions);\n\n return await new Promise((resolve, reject): void => {\n const timeoutMs = this.getTimeoutMs(normalizedOptions);\n let settled = false;\n const timeoutId = setTimeout(async () => {\n if (settled) {\n return;\n }\n\n settled = true;\n await this.detachQuietly(db);\n reject(\n enhanceFirebirdError(\n this.createTimeoutError(\"query\", timeoutMs, normalizedOptions, query),\n normalizedOptions,\n { stage: \"query\", sql: query },\n ),\n );\n }, timeoutMs);\n\n if (logQuery) {\n this.logger.info(RestUtilities.printQueryWithParams(query, parameters));\n }\n\n db.query(query, parameters, async (error: any, result: any) => {\n if (settled) {\n await this.detachQuietly(db);\n return;\n }\n\n settled = true;\n clearTimeout(timeoutId);\n await this.detachQuietly(db);\n\n if (error) {\n return reject(enhanceFirebirdError(error, normalizedOptions, { stage: \"query\", sql: query }));\n }\n\n return resolve(this.normalizeResultValue(result, this.shouldTrimStringResults(normalizedOptions)));\n });\n });\n } catch (error) {\n const normalizedError = enhanceFirebirdError(error, options, { stage: \"query\", sql: query });\n this.logger.error(normalizedError);\n throw normalizedError;\n }\n }\n\n public static async execute(options: Options, query: string, parameters: any = [], logQuery = true): Promise<any> {\n try {\n const normalizedOptions = normalizeFirebirdOptions(options);\n const db = await this.attachWithTimeout(normalizedOptions);\n\n return await new Promise((resolve, reject): void => {\n const timeoutMs = this.getTimeoutMs(normalizedOptions);\n let settled = false;\n const timeoutId = setTimeout(async () => {\n if (settled) {\n return;\n }\n\n settled = true;\n await this.detachQuietly(db);\n reject(\n enhanceFirebirdError(\n this.createTimeoutError(\"execute\", timeoutMs, normalizedOptions, query),\n normalizedOptions,\n { stage: \"execute\", sql: query },\n ),\n );\n }, timeoutMs);\n\n if (logQuery) {\n this.logger.info(RestUtilities.printQueryWithParams(query, parameters));\n }\n\n db.execute(query, parameters, async (error: any, result: any) => {\n if (settled) {\n await this.detachQuietly(db);\n return;\n }\n\n settled = true;\n clearTimeout(timeoutId);\n await this.detachQuietly(db);\n\n if (error) {\n return reject(enhanceFirebirdError(error, normalizedOptions, { stage: \"execute\", sql: query }));\n }\n\n return resolve(this.normalizeResultValue(result, this.shouldTrimStringResults(normalizedOptions)));\n });\n });\n } catch (error) {\n const normalizedError = enhanceFirebirdError(error, options, { stage: \"execute\", sql: query });\n this.logger.error(normalizedError);\n throw normalizedError;\n }\n }\n\n public static trimParam(param: any): string {\n if (typeof param === \"string\" || param instanceof String) {\n return param.trim();\n }\n return param;\n }\n\n public static async connect(options: Options): Promise<Database> {\n return this.attachWithTimeout(options);\n }\n\n public static async startTransaction(db: Database): Promise<Transaction> {\n return new Promise((resolve, reject): void => {\n db.transaction(Firebird.ISOLATION_READ_COMMITTED, function (err: any, transaction: Transaction): void {\n if (err) {\n return reject(err);\n }\n\n return resolve(transaction);\n });\n });\n }\n\n public static async commitTransaction(transaction: Transaction): Promise<string> {\n return new Promise((resolve, reject): void => {\n transaction.commit((err: any): void => {\n if (err) {\n return reject(err);\n }\n\n return resolve(\"Transaction committed successfully.\");\n });\n });\n }\n\n public static async rollbackTransaction(transaction: Transaction): Promise<string> {\n return new Promise((resolve, reject): void => {\n transaction.rollback((err: any): void => {\n if (err) {\n return reject(err);\n }\n\n return resolve(\"Transaction rolled back successfully.\");\n });\n });\n }\n\n public static async executeMultiple(options: Options, queriesWithParams: { query: string, params: any[] }[]): Promise<string> {\n let db: Database | undefined;\n let transaction: Transaction | undefined;\n\n try {\n db = await Orm.connect(options);\n transaction = await Orm.startTransaction(db);\n\n for (const qwp of queriesWithParams) {\n await new Promise((resolve, reject) => {\n transaction!.query(qwp.query, qwp.params, (err: any, result: any): void => {\n if (err) {\n return reject(err);\n }\n\n return resolve(result);\n });\n });\n }\n\n await Orm.commitTransaction(transaction);\n await Orm.detachQuietly(db);\n return \"OK\";\n } catch (error) {\n if (transaction) {\n await Orm.rollbackTransaction(transaction);\n }\n\n await Orm.detachQuietly(db);\n throw error;\n }\n }\n\n public static async executeQueries(transaction: Transaction, queries: string[], params: any[]): Promise<any> {\n try {\n return await queries.reduce((promiseChain: Promise<any>, currentQuery: string, index: number) => {\n return promiseChain.then(() => new Promise((resolve, reject) => {\n transaction.query(currentQuery, params[index], (err: any, result: any): void => {\n if (err) {\n return reject(err);\n }\n\n return resolve(result);\n });\n }));\n }, Promise.resolve());\n } catch (error) {\n return await new Promise((resolve, reject) => {\n transaction.rollback((rollbackErr: any): void => {\n if (rollbackErr) {\n return reject(rollbackErr);\n }\n\n return reject(error);\n });\n });\n }\n }\n}\n"]}
1
+ {"version":3,"file":"Orm.js","sourceRoot":"","sources":["../src/Orm.ts"],"names":[],"mappings":"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","sourcesContent":["import * as Firebird from \"node-firebird\";\nimport { ConnectionPool, Database, Options, QueryParams, Transaction } from \"node-firebird\";\nimport { Logger } from \"./Logger\";\nimport { RestUtilities } from \"./Utilities\";\nimport {\n describeFirebirdCompatibilityOptions,\n enhanceFirebirdError,\n FirebirdOptions,\n normalizeFirebirdOptions,\n} from \"./firebird-compat\";\n\nexport class Orm {\n private static logger: Logger = new Logger(Orm.name);\n private static pools: Map<string, ConnectionPool> = new Map();\n\n public static quote(value: string): string {\n return \"\\\"\" + value + \"\\\"\";\n }\n\n /** Dimensione pool: default 5 (pool attivo); `poolSize: 0` disabilita e torna all'attach per query. */\n private static getPoolSize(options: Options): number {\n const raw = (options as FirebirdOptions).poolSize;\n if (raw === 0) {\n return 0;\n }\n const size = raw === undefined ? 5 : Number(raw);\n return Number.isFinite(size) && size > 0 ? Math.trunc(size) : 0;\n }\n\n private static shouldLogQueryParameters(options: Options): boolean {\n return (options as FirebirdOptions).logQueryParameters === true;\n }\n\n private static formatQueryForLog(query: string, parameters: QueryParams, includeValues: boolean): string {\n const parameterList = Array.isArray(parameters) ? parameters : Object.values(parameters ?? {});\n if (includeValues) {\n return RestUtilities.printQueryWithParams(query, parameterList);\n }\n return `${query.replace(/\\s+/g, \" \").trim()} [params=${parameterList.length}]`;\n }\n\n private static buildPoolKey(options: Options, size: number): string {\n const normalized = normalizeFirebirdOptions(options);\n return [\n size,\n normalized.host ?? \"\",\n normalized.port ?? \"\",\n normalized.database ?? \"\",\n normalized.user ?? \"\",\n normalized.pluginName ?? \"\",\n String(normalized.wireCrypt ?? \"\"),\n ].join(\"|\");\n }\n\n /**\n * Chiude tutti i pool creati (opt-in `poolSize`). Utile a fine processo o nei test,\n * perché i pool mantengono connessioni e timer attivi.\n */\n public static async closePools(): Promise<void> {\n const pools = Array.from(this.pools.values());\n this.pools.clear();\n await Promise.all(pools.map((pool) => new Promise<void>((resolve) => {\n try {\n pool.destroy(() => resolve());\n } catch {\n resolve();\n }\n })));\n }\n\n private static getPool(options: Options, size: number): ConnectionPool {\n const normalized = normalizeFirebirdOptions(options);\n const key = this.buildPoolKey(normalized, size);\n let pool = this.pools.get(key);\n if (!pool) {\n this.logger.info(`Firebird pool created (max=${size}) using ${describeFirebirdCompatibilityOptions(normalized)}`);\n pool = Firebird.pool(size, normalized);\n pool.on(\"error\", (error: Error) => {\n this.logger.error(`Firebird pool error: ${error.message}`);\n });\n this.pools.set(key, pool);\n }\n return pool;\n }\n\n private static getTimeoutMs(options: Options): number {\n const candidate = (options as FirebirdOptions).connectTimeout ?? 15000;\n return Number.isFinite(candidate) && candidate > 0 ? Math.trunc(candidate) : 15000;\n }\n\n private static createTimeoutError(stage: string, timeoutMs: number, options: Options, query?: string): Error {\n const target = `${options.host ?? \"?\"}:${options.port ?? \"?\"} -> ${options.database ?? \"?\"}`;\n const suffix = query ? ` | sql=${query.replace(/\\s+/g, \" \").trim()}` : \"\";\n return new Error(`Timeout during Firebird ${stage} after ${timeoutMs} ms on ${target}${suffix}`);\n }\n\n private static async detachQuietly(db: Database | undefined): Promise<void> {\n if (!db) {\n return;\n }\n\n await new Promise<void>((resolve) => {\n try {\n db.detach(() => resolve());\n } catch {\n resolve();\n }\n });\n }\n\n private static shouldTrimStringResults(options: FirebirdOptions): boolean {\n return options.trimStringResults !== false;\n }\n\n private static normalizeResultValue(value: unknown, trimStringResults: boolean): unknown {\n if (!trimStringResults || value === undefined || value === null) {\n return value;\n }\n\n if (typeof value === \"string\" || value instanceof String) {\n return String(value).trimEnd();\n }\n\n if (Array.isArray(value)) {\n return value.map((item) => this.normalizeResultValue(item, trimStringResults));\n }\n\n if (value instanceof Date || Buffer.isBuffer(value)) {\n return value;\n }\n\n if (typeof value === \"object\") {\n const source = value as Record<string, unknown>;\n return Object.keys(source).reduce((normalized: Record<string, unknown>, key: string) => {\n normalized[key] = this.normalizeResultValue(source[key], trimStringResults);\n return normalized;\n }, {});\n }\n\n return value;\n }\n\n private static attachWithTimeout(options: Options): Promise<Database> {\n return new Promise((resolve, reject): void => {\n const normalizedOptions = normalizeFirebirdOptions(options);\n const timeoutMs = this.getTimeoutMs(normalizedOptions);\n const poolSize = this.getPoolSize(options);\n let settled = false;\n const timeoutId = setTimeout(() => {\n if (settled) {\n return;\n }\n\n settled = true;\n reject(\n enhanceFirebirdError(\n this.createTimeoutError(\"attach\", timeoutMs, normalizedOptions),\n normalizedOptions,\n { stage: \"attach\" },\n ),\n );\n }, timeoutMs);\n\n const handle = async (err: unknown, db: Database): Promise<void> => {\n if (settled) {\n await this.detachQuietly(db);\n return;\n }\n\n settled = true;\n clearTimeout(timeoutId);\n\n if (err) {\n return reject(enhanceFirebirdError(err, normalizedOptions, { stage: \"attach\" }));\n }\n\n return resolve(db);\n };\n\n try {\n if (poolSize > 0) {\n this.getPool(options, poolSize).get(handle);\n return;\n }\n\n this.logger.info(`Firebird attach using ${describeFirebirdCompatibilityOptions(normalizedOptions)}`);\n\n Firebird.attach(normalizedOptions, handle);\n } catch (error) {\n // Attach/get sincrono fallito: evita di lasciare il timer di timeout pendente.\n if (!settled) {\n settled = true;\n clearTimeout(timeoutId);\n reject(enhanceFirebirdError(error, normalizedOptions, { stage: \"attach\" }));\n }\n }\n });\n }\n\n public static async testConnection(options: Options): Promise<boolean> {\n return new Promise((resolve): void => {\n this.attachWithTimeout(options)\n .then(async (db: Database): Promise<void> => {\n this.logger.info(\"DATABASE connesso.\");\n await this.detachQuietly(db);\n resolve(true);\n })\n .catch((err: Error): void => {\n this.logger.error(\"La connessione con il DATABASE non e andata a buon fine.\");\n this.logger.error(err);\n resolve(false);\n });\n });\n }\n\n public static async query<T = Record<string, unknown>>(\n options: Options,\n query: string,\n parameters: QueryParams = [],\n logQuery = true,\n ): Promise<T[]> {\n try {\n const normalizedOptions = normalizeFirebirdOptions(options);\n const db = await this.attachWithTimeout(options);\n\n return await new Promise<T[]>((resolve, reject): void => {\n const timeoutMs = this.getTimeoutMs(normalizedOptions);\n let settled = false;\n const timeoutId = setTimeout(async () => {\n if (settled) {\n return;\n }\n\n settled = true;\n await this.detachQuietly(db);\n reject(\n enhanceFirebirdError(\n this.createTimeoutError(\"query\", timeoutMs, normalizedOptions, query),\n normalizedOptions,\n { stage: \"query\", sql: query },\n ),\n );\n }, timeoutMs);\n\n if (logQuery) {\n this.logger.info(this.formatQueryForLog(query, parameters, this.shouldLogQueryParameters(options)));\n }\n\n db.query<unknown>(query, parameters, async (error: unknown, result: unknown[]) => {\n if (settled) {\n await this.detachQuietly(db);\n return;\n }\n\n settled = true;\n clearTimeout(timeoutId);\n await this.detachQuietly(db);\n\n if (error) {\n return reject(enhanceFirebirdError(error, normalizedOptions, { stage: \"query\", sql: query }));\n }\n\n return resolve(this.normalizeResultValue(result, this.shouldTrimStringResults(normalizedOptions)) as T[]);\n });\n });\n } catch (error) {\n const normalizedError = enhanceFirebirdError(error, options, { stage: \"query\", sql: query });\n this.logger.error(normalizedError);\n throw normalizedError;\n }\n }\n\n public static async execute<T = Record<string, unknown>>(\n options: Options,\n query: string,\n parameters: QueryParams = [],\n logQuery = true,\n ): Promise<T[]> {\n try {\n const normalizedOptions = normalizeFirebirdOptions(options);\n const db = await this.attachWithTimeout(options);\n\n return await new Promise<T[]>((resolve, reject): void => {\n const timeoutMs = this.getTimeoutMs(normalizedOptions);\n let settled = false;\n const timeoutId = setTimeout(async () => {\n if (settled) {\n return;\n }\n\n settled = true;\n await this.detachQuietly(db);\n reject(\n enhanceFirebirdError(\n this.createTimeoutError(\"execute\", timeoutMs, normalizedOptions, query),\n normalizedOptions,\n { stage: \"execute\", sql: query },\n ),\n );\n }, timeoutMs);\n\n if (logQuery) {\n this.logger.info(this.formatQueryForLog(query, parameters, this.shouldLogQueryParameters(options)));\n }\n\n db.execute<unknown>(query, parameters, async (error: unknown, result: unknown[]) => {\n if (settled) {\n await this.detachQuietly(db);\n return;\n }\n\n settled = true;\n clearTimeout(timeoutId);\n await this.detachQuietly(db);\n\n if (error) {\n return reject(enhanceFirebirdError(error, normalizedOptions, { stage: \"execute\", sql: query }));\n }\n\n return resolve(this.normalizeResultValue(result, this.shouldTrimStringResults(normalizedOptions)) as T[]);\n });\n });\n } catch (error) {\n const normalizedError = enhanceFirebirdError(error, options, { stage: \"execute\", sql: query });\n this.logger.error(normalizedError);\n throw normalizedError;\n }\n }\n\n public static trimParam<T>(param: T): string | T {\n if (typeof param === \"string\" || param instanceof String) {\n return String(param).trim();\n }\n return param;\n }\n\n public static async connect(options: Options): Promise<Database> {\n return this.attachWithTimeout(options);\n }\n\n /**\n * Runs `operation` inside a single Firebird transaction: commit on success,\n * rollback on failure, detach in every case. Use it to make multi-statement\n * writes atomic instead of relying on auto-commit per statement.\n */\n public static async withTransaction<T>(\n options: Options,\n operation: (transaction: Transaction) => Promise<T>,\n ): Promise<T> {\n const db = await this.connect(options);\n let transaction: Transaction | undefined;\n\n try {\n transaction = await this.startTransaction(db);\n const result = await operation(transaction);\n await this.commitTransaction(transaction);\n return result;\n } catch (error) {\n if (transaction) {\n try {\n await this.rollbackTransaction(transaction);\n } catch {\n // Se la rollback fallisce (connessione persa) l'errore originale resta quello rilevante.\n }\n }\n throw error;\n } finally {\n await this.detachQuietly(db);\n }\n }\n\n /** Esegue una query su una transazione esistente e ne restituisce il risultato. */\n public static transactionQuery<T = unknown>(\n transaction: Transaction,\n query: string,\n parameters: QueryParams = [],\n ): Promise<T> {\n return new Promise<T>((resolve, reject): void => {\n transaction.query(query, parameters, (error: unknown, result: unknown[]): void => {\n if (error) {\n reject(error);\n return;\n }\n\n resolve(result as T);\n });\n });\n }\n\n public static async startTransaction(db: Database): Promise<Transaction> {\n return new Promise((resolve, reject): void => {\n db.transaction(Firebird.ISOLATION_READ_COMMITTED, function (err: unknown, transaction: Transaction): void {\n if (err) {\n return reject(err);\n }\n\n return resolve(transaction);\n });\n });\n }\n\n public static async commitTransaction(transaction: Transaction): Promise<string> {\n return new Promise((resolve, reject): void => {\n transaction.commit((err: unknown): void => {\n if (err) {\n return reject(err);\n }\n\n return resolve(\"Transaction committed successfully.\");\n });\n });\n }\n\n public static async rollbackTransaction(transaction: Transaction): Promise<string> {\n return new Promise((resolve, reject): void => {\n transaction.rollback((err: unknown): void => {\n if (err) {\n return reject(err);\n }\n\n return resolve(\"Transaction rolled back successfully.\");\n });\n });\n }\n\n public static async executeMultiple(options: Options, queriesWithParams: { query: string, params: QueryParams }[]): Promise<string> {\n await Orm.withTransaction(options, async (transaction) => {\n for (const qwp of queriesWithParams) {\n await Orm.transactionQuery(transaction, qwp.query, qwp.params);\n }\n });\n\n return \"OK\";\n }\n\n public static async executeQueries(transaction: Transaction, queries: string[], params: QueryParams[]): Promise<unknown> {\n try {\n return await queries.reduce((promiseChain: Promise<unknown>, currentQuery: string, index: number) => {\n return promiseChain.then(() => new Promise((resolve, reject) => {\n transaction.query(currentQuery, params[index] ?? [], (err: unknown, result: unknown[]): void => {\n if (err) {\n return reject(err);\n }\n\n return resolve(result);\n });\n }));\n }, Promise.resolve());\n } catch (error) {\n return await new Promise((_resolve, reject) => {\n transaction.rollback((rollbackErr: unknown): void => {\n if (rollbackErr) {\n return reject(rollbackErr);\n }\n\n return reject(error);\n });\n });\n }\n }\n}\n"]}
@@ -62,7 +62,7 @@ export declare class RestUtilities {
62
62
  * @param status - HTTP status code (default: 500).
63
63
  * @returns The Response object.
64
64
  */
65
- static sendErrorMessage(res: Response, error: any, tag?: string, status?: number): Response;
65
+ static sendErrorMessage(res: Response, error: unknown, _tag?: string, status?: number): Response;
66
66
  /** Riconosce errori di metadata Firebird che richiedono una migrazione. */
67
67
  static isDatabaseSchemaError(error: unknown): boolean;
68
68
  static sendUnauthorized(res: Response): Response;
@@ -75,7 +75,7 @@ export declare class RestUtilities {
75
75
  * @param status - HTTP success status. Defaults to 200; pass 201 only after creating a resource.
76
76
  * @returns The Response object.
77
77
  */
78
- static sendBaseResponse(res: Response, payload: any, status?: number): Response;
78
+ static sendBaseResponse(res: Response, payload: unknown, status?: number): Response;
79
79
  /**
80
80
  * Sends an execution message as a response.
81
81
  * @param res - Express Response object.
@@ -84,17 +84,20 @@ export declare class RestUtilities {
84
84
  * @param status - HTTP success status. Defaults to 200.
85
85
  * @returns The Response object.
86
86
  */
87
- static sendExecMessage(res: Response, executionObject: any, title: string, status?: number): Response;
87
+ static sendExecMessage(res: Response, executionObject: unknown, title: string, status?: number): Response;
88
88
  /**
89
- * Prints a SQL query with parameters replaced.
89
+ * Prints a SQL query with parameters replaced. Replacement is literal: values
90
+ * containing `?` or `$&` no longer corrupt the output as in the legacy
91
+ * `String.replace` implementation.
90
92
  * @param query - The SQL query.
91
93
  * @param params - The parameters to replace.
92
94
  * @returns The formatted query.
93
95
  */
94
- static printQueryWithParams(query: string, params: any[]): string;
95
- static convertKeysToCamelCase(obj: any): any;
96
+ static printQueryWithParams(query?: string, params?: unknown[]): string;
97
+ static convertKeysToCamelCase<T = Record<string, unknown>>(obj: unknown): T;
96
98
  }
97
99
  export declare class CryptUtilities {
100
+ private static readonly logger;
98
101
  /**
99
102
  * Cifra un testo in chiaro usando l'algoritmo AES-128 in modalità ECB.
100
103
  *
@@ -129,6 +132,8 @@ export declare class PasswordUtilities {
129
132
  static hashLegacyEncryptedPassword(legacyEncryptedPassword: string): string;
130
133
  static isPasswordHash(value: string): boolean;
131
134
  static isLegacyPasswordHash(value: string): boolean;
135
+ /** Confronto a tempo costante tra due stringhe (per dati legacy non hashati). */
136
+ static timingSafeStringEquals(value: string, candidate: string): boolean;
132
137
  static verifyPassword(plainPassword: string, storedPassword: string): boolean;
133
138
  static verifyLegacyEncryptedPassword(legacyEncryptedPassword: string, storedPassword: string): boolean;
134
139
  }
@@ -159,4 +164,4 @@ export declare class DatabaseUtilities {
159
164
  */
160
165
  static createOption(host: string, port: number, database: string, username?: string, password?: string): FirebirdOptions;
161
166
  }
162
- export declare function Deprecated(message: string): (target: any, key?: string, descriptor?: PropertyDescriptor) => void;
167
+ export declare function Deprecated(message: string): (target: object, key?: string, descriptor?: PropertyDescriptor) => void;
package/dist/Utilities.js CHANGED
@@ -5,6 +5,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.DatabaseUtilities = exports.PasswordUtilities = exports.CryptUtilities = exports.RestUtilities = exports.DateUtilities = exports.StatusCode = void 0;
7
7
  exports.Deprecated = Deprecated;
8
+ const Logger_1 = require("./Logger");
8
9
  const crypto_1 = __importDefault(require("crypto"));
9
10
  var StatusCode;
10
11
  (function (StatusCode) {
@@ -116,10 +117,12 @@ class RestUtilities {
116
117
  * @param status - HTTP status code (default: 500).
117
118
  * @returns The Response object.
118
119
  */
119
- static sendErrorMessage(res, error, tag = "[BASE ERROR]", status = 500) {
120
+ static sendErrorMessage(res, error, _tag = "[BASE ERROR]", status = 500) {
121
+ var _a, _b;
120
122
  const rawMessage = error instanceof Error ? error.message : String(error !== null && error !== void 0 ? error : "");
121
- const exceptionResponse = error && typeof error.getResponse === "function"
122
- ? error.getResponse()
123
+ const errorWithResponse = error;
124
+ const exceptionResponse = typeof (errorWithResponse === null || errorWithResponse === void 0 ? void 0 : errorWithResponse.getResponse) === "function"
125
+ ? errorWithResponse.getResponse()
123
126
  : undefined;
124
127
  const exceptionPayload = exceptionResponse && typeof exceptionResponse === "object"
125
128
  ? exceptionResponse
@@ -130,7 +133,16 @@ class RestUtilities {
130
133
  ? exceptionPayload.details.filter((detail) => typeof detail === "string")
131
134
  : undefined;
132
135
  const schemaError = this.isDatabaseSchemaError(error);
133
- const effectiveStatus = schemaError ? 503 : status;
136
+ // Per le HttpException lo status corretto e quello dell'eccezione (es. 400 di validazione),
137
+ // anche quando il chiamante non lo passa esplicitamente. Lo status esplicito vale per gli altri errori.
138
+ const exceptionStatus = typeof (errorWithResponse === null || errorWithResponse === void 0 ? void 0 : errorWithResponse.getResponse) === "function"
139
+ ? Number((_b = (_a = error).getStatus) === null || _b === void 0 ? void 0 : _b.call(_a))
140
+ : undefined;
141
+ const effectiveStatus = schemaError
142
+ ? 503
143
+ : Number.isInteger(exceptionStatus) && exceptionStatus >= 400
144
+ ? exceptionStatus
145
+ : status;
134
146
  const code = schemaError
135
147
  ? "ACCESSI_DATABASE_SCHEMA_OUTDATED"
136
148
  : explicitCode !== null && explicitCode !== void 0 ? explicitCode : (effectiveStatus >= 500
@@ -240,29 +252,32 @@ class RestUtilities {
240
252
  }
241
253
  }
242
254
  /**
243
- * Prints a SQL query with parameters replaced.
255
+ * Prints a SQL query with parameters replaced. Replacement is literal: values
256
+ * containing `?` or `$&` no longer corrupt the output as in the legacy
257
+ * `String.replace` implementation.
244
258
  * @param query - The SQL query.
245
259
  * @param params - The parameters to replace.
246
260
  * @returns The formatted query.
247
261
  */
248
- static printQueryWithParams(query = "", params) {
249
- try {
250
- params.forEach(param => {
251
- query = query.replace("?", param);
252
- });
253
- return query;
254
- }
255
- catch (error) {
256
- throw error;
257
- }
262
+ static printQueryWithParams(query = "", params = []) {
263
+ let index = 0;
264
+ return query.replace(/\?/g, () => {
265
+ if (index >= params.length) {
266
+ return "?";
267
+ }
268
+ const param = params[index++];
269
+ return param === undefined || param === null ? "NULL" : String(param);
270
+ });
258
271
  }
259
272
  static convertKeysToCamelCase(obj) {
260
- if (obj !== null && obj.constructor === Object) {
261
- return Object.keys(obj).reduce((acc, key) => {
262
- const camelCaseKey = key.toLowerCase().replace(/_([a-z])/g, g => g[1].toUpperCase());
263
- acc[camelCaseKey] = obj[key];
273
+ if (obj !== null && typeof obj === "object" && obj.constructor === Object) {
274
+ const source = obj;
275
+ const converted = Object.keys(source).reduce((acc, key) => {
276
+ const camelCaseKey = key.toLowerCase().replace(/_([a-z])/g, g => { var _a; return ((_a = g[1]) !== null && _a !== void 0 ? _a : '').toUpperCase(); });
277
+ acc[camelCaseKey] = source[key];
264
278
  return acc;
265
279
  }, {});
280
+ return converted;
266
281
  }
267
282
  return obj;
268
283
  }
@@ -292,7 +307,8 @@ class CryptUtilities {
292
307
  }
293
308
  catch (error) {
294
309
  // Gestisce eventuali errori di cifratura
295
- throw new Error(`Errore durante la cifratura: ${error.message}`);
310
+ const message = error instanceof Error ? error.message : String(error);
311
+ throw new Error(`Errore durante la cifratura: ${message}`);
296
312
  }
297
313
  }
298
314
  /**
@@ -316,12 +332,13 @@ class CryptUtilities {
316
332
  return decoded;
317
333
  }
318
334
  catch (error) {
319
- console.error("Errore durante la decifratura:", error);
335
+ CryptUtilities.logger.error("Errore durante la decifratura:", error);
320
336
  return null;
321
337
  }
322
338
  }
323
339
  }
324
340
  exports.CryptUtilities = CryptUtilities;
341
+ CryptUtilities.logger = new Logger_1.Logger(CryptUtilities.name);
325
342
  class PasswordUtilities {
326
343
  static hashSecret(secretValue, prefix) {
327
344
  if (typeof secretValue !== "string" || secretValue.length === 0) {
@@ -397,6 +414,20 @@ class PasswordUtilities {
397
414
  static isLegacyPasswordHash(value) {
398
415
  return this.hasPrefix(value, this.LEGACY_HASH_PREFIX);
399
416
  }
417
+ /** Confronto a tempo costante tra due stringhe (per dati legacy non hashati). */
418
+ static timingSafeStringEquals(value, candidate) {
419
+ if (typeof value !== "string" || typeof candidate !== "string") {
420
+ return false;
421
+ }
422
+ const valueBuffer = Buffer.from(value, "utf8");
423
+ const candidateBuffer = Buffer.from(candidate, "utf8");
424
+ if (valueBuffer.length !== candidateBuffer.length) {
425
+ // Confronta comunque per non rivelare la lunghezza tramite timing.
426
+ crypto_1.default.timingSafeEqual(valueBuffer, valueBuffer);
427
+ return false;
428
+ }
429
+ return crypto_1.default.timingSafeEqual(valueBuffer, candidateBuffer);
430
+ }
400
431
  static verifyPassword(plainPassword, storedPassword) {
401
432
  return this.verifySecret(plainPassword, storedPassword, this.HASH_PREFIX);
402
433
  }
@@ -455,9 +486,13 @@ class DatabaseUtilities {
455
486
  }
456
487
  }
457
488
  exports.DatabaseUtilities = DatabaseUtilities;
489
+ const deprecationLogger = new Logger_1.Logger('Deprecated');
458
490
  function Deprecated(message) {
459
491
  return function (target, key, descriptor) {
460
- console.warn(`[DEPRECATED] ${message}`);
492
+ void target;
493
+ void key;
494
+ void descriptor;
495
+ deprecationLogger.warning(`[DEPRECATED] ${message}`);
461
496
  };
462
497
  }
463
498
  //# sourceMappingURL=Utilities.js.map