http-request-manager 18.15.33 → 18.15.34

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 (300) hide show
  1. package/TEST_COVERAGE_SUMMARY.md +458 -0
  2. package/ng-package.json +8 -0
  3. package/package.json +4 -13
  4. package/src/docs/ADVANCED_WEBSOCKET.md +633 -0
  5. package/src/docs/ARCHITECTURE.md +633 -0
  6. package/src/docs/BATCH_REQUEST_README.md +467 -0
  7. package/src/docs/COMPLETE_API_REFERENCE.md +1037 -0
  8. package/src/docs/DATABASE_README.md +1195 -0
  9. package/src/docs/ENCRYPTION_README.md +403 -0
  10. package/src/docs/HTTP_MANAGER_README.md +628 -0
  11. package/src/docs/HTTP_SINGNALS_MANAGER_README.md +654 -0
  12. package/src/docs/HTTP_STATE_MANAGER_README.md +1391 -0
  13. package/src/docs/INTERCEPTOR_README.md +549 -0
  14. package/src/docs/LOCAL_STORAGE_README.md +1056 -0
  15. package/src/docs/LOCAL_STORAGE_SIGNALS_README.md +338 -0
  16. package/src/docs/LOGGER_README.md +310 -0
  17. package/src/docs/MESSAGE_TRACKER_README.md +518 -0
  18. package/src/docs/MESSAGE_TRACKER_SIGNALS_README.md +563 -0
  19. package/src/docs/MODELS_README.md +1264 -0
  20. package/src/docs/SIGNAL_SERVICES_README.md +238 -0
  21. package/src/docs/SQL_DIXIE_README.md +574 -0
  22. package/src/docs/STORE_STATE_MANAGER_README.md +556 -0
  23. package/src/docs/STORE_STATE_SIGNALS_README.md +600 -0
  24. package/src/docs/UPLOAD_REQUEST_README.md +324 -0
  25. package/src/docs/UTILS_README.md +1604 -0
  26. package/src/docs/WEBSOCKET_MESSAGE_SERVICE.md +799 -0
  27. package/src/docs/WEBSOCKET_SIGNALS_README.md +641 -0
  28. package/src/docs/WEBSOCKET_SINGLETON_REFACTORING.md +201 -0
  29. package/src/docs/WS_MANAGER_README.md +613 -0
  30. package/src/lib/http-request-manager.module.ts +147 -0
  31. package/src/lib/http-request-services-demo/database-data-demo/database-data-demo.component.html +116 -0
  32. package/src/lib/http-request-services-demo/database-data-demo/database-data-demo.component.scss +0 -0
  33. package/src/lib/http-request-services-demo/database-data-demo/database-data-demo.component.ts +255 -0
  34. package/src/lib/http-request-services-demo/http-request-services-demo.component.html +123 -0
  35. package/src/lib/http-request-services-demo/http-request-services-demo.component.scss +6 -0
  36. package/src/lib/http-request-services-demo/http-request-services-demo.component.ts +53 -0
  37. package/src/lib/http-request-services-demo/local-storage-demo/local-storage-demo.component.html +195 -0
  38. package/src/lib/http-request-services-demo/local-storage-demo/local-storage-demo.component.scss +17 -0
  39. package/src/lib/http-request-services-demo/local-storage-demo/local-storage-demo.component.ts +208 -0
  40. package/src/lib/http-request-services-demo/local-storage-signals-demo/local-storage-signals-demo.component.html +200 -0
  41. package/src/lib/http-request-services-demo/local-storage-signals-demo/local-storage-signals-demo.component.scss +17 -0
  42. package/src/lib/http-request-services-demo/local-storage-signals-demo/local-storage-signals-demo.component.ts +214 -0
  43. package/src/lib/http-request-services-demo/request-manager-basic-demo/file-downloader/download-file/download-file.component.html +53 -0
  44. package/src/lib/http-request-services-demo/request-manager-basic-demo/file-downloader/download-file/download-file.component.scss +60 -0
  45. package/src/lib/http-request-services-demo/request-manager-basic-demo/file-downloader/download-file/download-file.component.ts +72 -0
  46. package/src/lib/http-request-services-demo/request-manager-basic-demo/file-downloader/file-download.module.ts +28 -0
  47. package/src/lib/http-request-services-demo/request-manager-basic-demo/file-downloader/file-downloader.component.html +10 -0
  48. package/src/lib/http-request-services-demo/request-manager-basic-demo/file-downloader/file-downloader.component.scss +29 -0
  49. package/src/lib/http-request-services-demo/request-manager-basic-demo/file-downloader/file-downloader.component.ts +100 -0
  50. package/src/lib/http-request-services-demo/request-manager-basic-demo/file-downloader/models/download-labels-model.ts +22 -0
  51. package/src/lib/http-request-services-demo/request-manager-basic-demo/file-downloader/spinner/spinner.component.html +8 -0
  52. package/src/lib/http-request-services-demo/request-manager-basic-demo/file-downloader/spinner/spinner.component.scss +19 -0
  53. package/src/lib/http-request-services-demo/request-manager-basic-demo/file-downloader/spinner/spinner.component.ts +26 -0
  54. package/src/lib/http-request-services-demo/request-manager-basic-demo/models/app-session.model.ts +30 -0
  55. package/src/lib/http-request-services-demo/request-manager-basic-demo/models/app.model.ts +19 -0
  56. package/src/lib/http-request-services-demo/request-manager-basic-demo/models/get-sample.model.ts +25 -0
  57. package/src/lib/http-request-services-demo/request-manager-basic-demo/models/sample-ai-prompt.ts +19 -0
  58. package/src/lib/http-request-services-demo/request-manager-basic-demo/models/sample-client-details.ts +24 -0
  59. package/src/lib/http-request-services-demo/request-manager-basic-demo/models/sample-client-info.ts +30 -0
  60. package/src/lib/http-request-services-demo/request-manager-basic-demo/models/sample-client.model.ts +49 -0
  61. package/src/lib/http-request-services-demo/request-manager-basic-demo/models/sample-mapper-client-info.ts +33 -0
  62. package/src/lib/http-request-services-demo/request-manager-basic-demo/request-manager-basic-demo.component.html +279 -0
  63. package/src/lib/http-request-services-demo/request-manager-basic-demo/request-manager-basic-demo.component.scss +24 -0
  64. package/src/lib/http-request-services-demo/request-manager-basic-demo/request-manager-basic-demo.component.ts +461 -0
  65. package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/download-file/download-file.component.html +53 -0
  66. package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/download-file/download-file.component.scss +60 -0
  67. package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/download-file/download-file.component.ts +72 -0
  68. package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/file-download.module.ts +28 -0
  69. package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/file-downloader.component.html +10 -0
  70. package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/file-downloader.component.scss +29 -0
  71. package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/file-downloader.component.ts +100 -0
  72. package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/models/download-labels-model.ts +22 -0
  73. package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/spinner/spinner.component.html +8 -0
  74. package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/spinner/spinner.component.scss +19 -0
  75. package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/spinner/spinner.component.ts +26 -0
  76. package/src/lib/http-request-services-demo/request-manager-demo/models/app-session.model.ts +30 -0
  77. package/src/lib/http-request-services-demo/request-manager-demo/models/app.model.ts +19 -0
  78. package/src/lib/http-request-services-demo/request-manager-demo/models/get-sample.model.ts +25 -0
  79. package/src/lib/http-request-services-demo/request-manager-demo/models/sample-ai-prompt.ts +19 -0
  80. package/src/lib/http-request-services-demo/request-manager-demo/models/sample-client-details.ts +24 -0
  81. package/src/lib/http-request-services-demo/request-manager-demo/models/sample-client-info.ts +30 -0
  82. package/src/lib/http-request-services-demo/request-manager-demo/models/sample-client.model.ts +49 -0
  83. package/src/lib/http-request-services-demo/request-manager-demo/models/sample-mapper-client-info.ts +33 -0
  84. package/src/lib/http-request-services-demo/request-manager-demo/request-manager-demo.component.html +622 -0
  85. package/src/lib/http-request-services-demo/request-manager-demo/request-manager-demo.component.scss +106 -0
  86. package/src/lib/http-request-services-demo/request-manager-demo/request-manager-demo.component.ts +687 -0
  87. package/src/lib/http-request-services-demo/request-manager-state-demo/request-manager-state-demo.component.html +418 -0
  88. package/src/lib/http-request-services-demo/request-manager-state-demo/request-manager-state-demo.component.scss +24 -0
  89. package/src/lib/http-request-services-demo/request-manager-state-demo/request-manager-state-demo.component.ts +576 -0
  90. package/src/lib/http-request-services-demo/request-manager-state-demo/services/state-manager-demo.service.ts +89 -0
  91. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/services/state-data-request.service.ts +119 -0
  92. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-ai-messaging/ws-ai-messaging.component.css +0 -0
  93. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-ai-messaging/ws-ai-messaging.component.html +3 -0
  94. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-ai-messaging/ws-ai-messaging.component.ts +16 -0
  95. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-chats/ws-chats.component.css +0 -0
  96. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-chats/ws-chats.component.html +3 -0
  97. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-chats/ws-chats.component.ts +16 -0
  98. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-data-control/ws-data-control.component.css +31 -0
  99. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-data-control/ws-data-control.component.html +94 -0
  100. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-data-control/ws-data-control.component.scss +41 -0
  101. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-data-control/ws-data-control.component.spec.ts +203 -0
  102. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-data-control/ws-data-control.component.ts +144 -0
  103. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-messaging/ws-messaging.component.css +11 -0
  104. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-messaging/ws-messaging.component.html +102 -0
  105. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-messaging/ws-messaging.component.spec.ts +40 -0
  106. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-messaging/ws-messaging.component.ts +230 -0
  107. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-notifications/ws-notifications.component.css +30 -0
  108. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-notifications/ws-notifications.component.html +172 -0
  109. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-notifications/ws-notifications.component.spec.ts +31 -0
  110. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-notifications/ws-notifications.component.ts +239 -0
  111. package/src/lib/http-request-services-demo/request-manager-ws-demo/models/oidc-client.model.ts +31 -0
  112. package/src/lib/http-request-services-demo/request-manager-ws-demo/models/user-data.model.ts +32 -0
  113. package/src/lib/http-request-services-demo/request-manager-ws-demo/request-manager-ws-demo.component.css +0 -0
  114. package/src/lib/http-request-services-demo/request-manager-ws-demo/request-manager-ws-demo.component.html +84 -0
  115. package/src/lib/http-request-services-demo/request-manager-ws-demo/request-manager-ws-demo.component.ts +40 -0
  116. package/src/lib/http-request-services-demo/request-manager-ws-demo/services/index.ts +3 -0
  117. package/src/lib/http-request-services-demo/request-manager-ws-demo/services/jwt-token.service.ts +62 -0
  118. package/src/lib/http-request-services-demo/request-manager-ws-demo/services/message-service-demo.service.ts +83 -0
  119. package/src/lib/http-request-services-demo/request-manager-ws-demo/services/notification-service-demo.service.ts +147 -0
  120. package/src/lib/http-request-services-demo/request-manager-ws-demo/services/state-service-demo.service.ts +168 -0
  121. package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/download-file/download-file.component.html +53 -0
  122. package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/download-file/download-file.component.scss +60 -0
  123. package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/download-file/download-file.component.ts +72 -0
  124. package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/file-download.module.ts +28 -0
  125. package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/file-downloader.component.html +10 -0
  126. package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/file-downloader.component.scss +29 -0
  127. package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/file-downloader.component.ts +100 -0
  128. package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/models/download-labels-model.ts +22 -0
  129. package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/spinner/spinner.component.html +8 -0
  130. package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/spinner/spinner.component.scss +19 -0
  131. package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/spinner/spinner.component.ts +26 -0
  132. package/src/lib/http-request-services-demo/request-signals-manager-demo/models/app-session.model.ts +30 -0
  133. package/src/lib/http-request-services-demo/request-signals-manager-demo/models/app.model.ts +19 -0
  134. package/src/lib/http-request-services-demo/request-signals-manager-demo/models/get-sample.model.ts +25 -0
  135. package/src/lib/http-request-services-demo/request-signals-manager-demo/models/sample-ai-prompt.ts +19 -0
  136. package/src/lib/http-request-services-demo/request-signals-manager-demo/models/sample-client-details.ts +24 -0
  137. package/src/lib/http-request-services-demo/request-signals-manager-demo/models/sample-client-info.ts +30 -0
  138. package/src/lib/http-request-services-demo/request-signals-manager-demo/models/sample-client.model.ts +49 -0
  139. package/src/lib/http-request-services-demo/request-signals-manager-demo/models/sample-mapper-client-info.ts +33 -0
  140. package/src/lib/http-request-services-demo/request-signals-manager-demo/request-signals-manager-demo.component.html +380 -0
  141. package/src/lib/http-request-services-demo/request-signals-manager-demo/request-signals-manager-demo.component.scss +24 -0
  142. package/src/lib/http-request-services-demo/request-signals-manager-demo/request-signals-manager-demo.component.ts +410 -0
  143. package/src/lib/http-request-services-demo/store-state-manager-demo/models/settings.model.ts +28 -0
  144. package/src/lib/http-request-services-demo/store-state-manager-demo/services/settings-state.service.ts +49 -0
  145. package/src/lib/http-request-services-demo/store-state-manager-demo/store-state-manager-demo.component.css +0 -0
  146. package/src/lib/http-request-services-demo/store-state-manager-demo/store-state-manager-demo.component.html +23 -0
  147. package/src/lib/http-request-services-demo/store-state-manager-demo/store-state-manager-demo.component.ts +36 -0
  148. package/src/lib/http-request-services-demo/store-state-signals-demo/store-state-signals-demo.component.ts +161 -0
  149. package/src/lib/http-request-services-demo/upload-demo/models/index.ts +1 -0
  150. package/src/lib/http-request-services-demo/upload-demo/models/upload-state.model.ts +30 -0
  151. package/src/lib/http-request-services-demo/upload-demo/upload-demo.component.html +89 -0
  152. package/src/lib/http-request-services-demo/upload-demo/upload-demo.component.scss +160 -0
  153. package/src/lib/http-request-services-demo/upload-demo/upload-demo.component.spec.ts +101 -0
  154. package/src/lib/http-request-services-demo/upload-demo/upload-demo.component.ts +136 -0
  155. package/src/lib/index.ts +3 -0
  156. package/src/lib/interceptors/credentials.interceptor.ts +16 -0
  157. package/src/lib/interceptors/index.ts +6 -0
  158. package/src/lib/interceptors/models/error-settings.model.ts +22 -0
  159. package/src/lib/interceptors/models/index.ts +2 -0
  160. package/src/lib/interceptors/proxy-debugger.interceptor.ts +46 -0
  161. package/src/lib/interceptors/request-error.interceptor.ts +65 -0
  162. package/src/lib/interceptors/request-header.interceptor.ts +56 -0
  163. package/src/lib/message-display/README.md +509 -0
  164. package/src/lib/message-display/index.ts +4 -0
  165. package/src/lib/message-display/models/action.model.ts +27 -0
  166. package/src/lib/message-display/models/communication-message.model.ts +77 -0
  167. package/src/lib/message-display/models/display-config.model.ts +35 -0
  168. package/src/lib/message-display/models/display-rule.interface.ts +28 -0
  169. package/src/lib/message-display/models/display-strategy.interface.ts +8 -0
  170. package/src/lib/message-display/models/index.ts +6 -0
  171. package/src/lib/message-display/models/slide.model.ts +24 -0
  172. package/src/lib/message-display/rules/default-display-rules.ts +35 -0
  173. package/src/lib/message-display/services/message-display-router.service.ts +63 -0
  174. package/src/lib/message-display/strategies/snackbar.strategy.ts +46 -0
  175. package/src/lib/models/batch-options.model.ts +33 -0
  176. package/src/lib/models/batch-progress.model.ts +19 -0
  177. package/src/lib/models/batch-request-state.model.ts +40 -0
  178. package/src/lib/models/batch-result.model.ts +30 -0
  179. package/src/lib/models/config-http-options.model.ts +45 -0
  180. package/src/lib/models/config-local-storage-options.model.ts +27 -0
  181. package/src/lib/models/config-options.model.ts +27 -0
  182. package/src/lib/models/config-token.model.ts +9 -0
  183. package/src/lib/models/data-type.enum.ts +5 -0
  184. package/src/lib/models/database-storage.model.ts +24 -0
  185. package/src/lib/models/index.ts +16 -0
  186. package/src/lib/models/retry-options.model.ts +22 -0
  187. package/src/lib/models/upload-validation-error.model.ts +46 -0
  188. package/src/lib/services/SQL-DixieJS service/dexie-query-executor.ts +246 -0
  189. package/src/lib/services/SQL-DixieJS service/dexie-sql.service.ts +31 -0
  190. package/src/lib/services/SQL-DixieJS service/index.ts +4 -0
  191. package/src/lib/services/SQL-DixieJS service/models/execution-plan.model.ts +52 -0
  192. package/src/lib/services/SQL-DixieJS service/models/index.ts +3 -0
  193. package/src/lib/services/SQL-DixieJS service/models/sql-errors.model.ts +13 -0
  194. package/src/lib/services/SQL-DixieJS service/models/sql-options.model.ts +3 -0
  195. package/src/lib/services/SQL-DixieJS service/query-planner.ts +284 -0
  196. package/src/lib/services/SQL-DixieJS service/schema-validator.ts +217 -0
  197. package/src/lib/services/SQL-DixieJS service/sql-parser.ts +35 -0
  198. package/src/lib/services/database-manager-service/database.manager.service.ts +384 -0
  199. package/src/lib/services/database-manager-service/db.storage.service.ts +240 -0
  200. package/src/lib/services/database-manager-service/index.ts +4 -0
  201. package/src/lib/services/database-manager-service/models/index.ts +2 -0
  202. package/src/lib/services/database-manager-service/models/table-schema.ts +33 -0
  203. package/src/lib/services/index.ts +20 -0
  204. package/src/lib/services/local-storage-manager-service/index.ts +4 -0
  205. package/src/lib/services/local-storage-manager-service/local-storage-manager.service.spec.ts +71 -0
  206. package/src/lib/services/local-storage-manager-service/local-storage-manager.service.ts +567 -0
  207. package/src/lib/services/local-storage-manager-service/local-storage-signals-manager.service.spec.ts +67 -0
  208. package/src/lib/services/local-storage-manager-service/local-storage-signals-manager.service.ts +437 -0
  209. package/src/lib/services/local-storage-manager-service/models/global-store-options.model.ts +30 -0
  210. package/src/lib/services/local-storage-manager-service/models/index.ts +6 -0
  211. package/src/lib/services/local-storage-manager-service/models/setting-options.model.ts +35 -0
  212. package/src/lib/services/local-storage-manager-service/models/storage-data.model.ts +24 -0
  213. package/src/lib/services/local-storage-manager-service/models/storage-option.model.ts +32 -0
  214. package/src/lib/services/local-storage-manager-service/models/storage-type.enum.ts +5 -0
  215. package/src/lib/services/request-manager-services/README.md +282 -0
  216. package/src/lib/services/request-manager-services/http-manager-signals.service.ts +674 -0
  217. package/src/lib/services/request-manager-services/http-manager.service.spec.ts +353 -0
  218. package/src/lib/services/request-manager-services/http-manager.service.ts +727 -0
  219. package/src/lib/services/request-manager-services/index.ts +8 -0
  220. package/src/lib/services/request-manager-services/request-signals.service.ts +372 -0
  221. package/src/lib/services/request-manager-services/request.service.ts +435 -0
  222. package/src/lib/services/request-manager-services/rxjs-operators/countdown.ts +17 -0
  223. package/src/lib/services/request-manager-services/rxjs-operators/delay-retry.ts +16 -0
  224. package/src/lib/services/request-manager-services/rxjs-operators/index.ts +4 -0
  225. package/src/lib/services/request-manager-services/rxjs-operators/request-polling.ts +35 -0
  226. package/src/lib/services/request-manager-services/rxjs-operators/request-streaming.ts +468 -0
  227. package/src/lib/services/request-manager-state-service/http-manager-state.store.spec.ts +665 -0
  228. package/src/lib/services/request-manager-state-service/http-manager-state.store.ts +2395 -0
  229. package/src/lib/services/request-manager-state-service/index.ts +3 -0
  230. package/src/lib/services/request-manager-state-service/models/api-request.model.ts +86 -0
  231. package/src/lib/services/request-manager-state-service/models/index.ts +14 -0
  232. package/src/lib/services/request-manager-state-service/models/operation-result.model.ts +18 -0
  233. package/src/lib/services/request-manager-state-service/models/parsing-result.model.ts +21 -0
  234. package/src/lib/services/request-manager-state-service/models/request-options.model.ts +37 -0
  235. package/src/lib/services/request-manager-state-service/models/stream-config.model.ts +20 -0
  236. package/src/lib/services/request-manager-state-service/models/stream-event-metadata.model.ts +23 -0
  237. package/src/lib/services/request-manager-state-service/models/stream-event.model.ts +23 -0
  238. package/src/lib/services/request-manager-state-service/models/stream-output.model.ts +23 -0
  239. package/src/lib/services/request-manager-state-service/models/stream-progress.model.ts +24 -0
  240. package/src/lib/services/request-manager-state-service/models/stream-type.enum.ts +13 -0
  241. package/src/lib/services/request-manager-state-service/models/ws-options.model.ts +42 -0
  242. package/src/lib/services/store-state-manager-service/index.ts +4 -0
  243. package/src/lib/services/store-state-manager-service/models/index.ts +3 -0
  244. package/src/lib/services/store-state-manager-service/models/state-operation-result.model.ts +30 -0
  245. package/src/lib/services/store-state-manager-service/models/state-storage-options.model.ts +24 -0
  246. package/src/lib/services/store-state-manager-service/store-state-manager-signals.service.ts +169 -0
  247. package/src/lib/services/store-state-manager-service/store-state-manager.service.ts +153 -0
  248. package/src/lib/services/utils/app.service.spec.ts +25 -0
  249. package/src/lib/services/utils/app.service.ts +21 -0
  250. package/src/lib/services/utils/encryption/README.md +79 -0
  251. package/src/lib/services/utils/encryption/asymmetrical-encryption.service.ts +282 -0
  252. package/src/lib/services/utils/encryption/encryption-test.service.ts +39 -0
  253. package/src/lib/services/utils/encryption/index.ts +5 -0
  254. package/src/lib/services/utils/encryption/random.ts +81 -0
  255. package/src/lib/services/utils/encryption/symmetrical-encryption.service.ts +106 -0
  256. package/src/lib/services/utils/headers.service.spec.ts +80 -0
  257. package/src/lib/services/utils/headers.service.ts +18 -0
  258. package/src/lib/services/utils/index.ts +9 -0
  259. package/src/lib/services/utils/logger.service.ts +90 -0
  260. package/src/lib/services/utils/models/index.ts +4 -0
  261. package/src/lib/services/utils/models/normalized-request-options.model.ts +24 -0
  262. package/src/lib/services/utils/models/path-tracker-state.model.ts +20 -0
  263. package/src/lib/services/utils/models/query-params-tracker-options.model.ts +24 -0
  264. package/src/lib/services/utils/models/query-tracker-state.model.ts +23 -0
  265. package/src/lib/services/utils/object-merger.service.spec.ts +18 -0
  266. package/src/lib/services/utils/object-merger.service.ts +78 -0
  267. package/src/lib/services/utils/path-query.service.spec.ts +117 -0
  268. package/src/lib/services/utils/path-query.service.ts +69 -0
  269. package/src/lib/services/utils/query-params-tracker.service.ts +442 -0
  270. package/src/lib/services/utils/random-color.utils.ts +83 -0
  271. package/src/lib/services/utils/utils.service.spec.ts +165 -0
  272. package/src/lib/services/utils/utils.service.ts +192 -0
  273. package/src/lib/services/ws-manager-service/index.ts +13 -0
  274. package/src/lib/services/ws-manager-service/message-tracker-signals.service.ts +147 -0
  275. package/src/lib/services/ws-manager-service/message-tracker.service.ts +477 -0
  276. package/src/lib/services/ws-manager-service/models/channel-info.model.ts +29 -0
  277. package/src/lib/services/ws-manager-service/models/channel-message-data.model.ts +24 -0
  278. package/src/lib/services/ws-manager-service/models/channel-message.model.ts +36 -0
  279. package/src/lib/services/ws-manager-service/models/channel-type.enum.ts +6 -0
  280. package/src/lib/services/ws-manager-service/models/communication-type.enum.ts +5 -0
  281. package/src/lib/services/ws-manager-service/models/index.ts +10 -0
  282. package/src/lib/services/ws-manager-service/models/notification-message.model.ts +29 -0
  283. package/src/lib/services/ws-manager-service/models/public-message.model.ts +18 -0
  284. package/src/lib/services/ws-manager-service/models/state-message.model.ts +18 -0
  285. package/src/lib/services/ws-manager-service/models/ws-user.model.ts +38 -0
  286. package/src/lib/services/ws-manager-service/services/index.ts +4 -0
  287. package/src/lib/services/ws-manager-service/services/websocket-message.service.ts +129 -0
  288. package/src/lib/services/ws-manager-service/services/websocket.service.ts +434 -0
  289. package/src/lib/services/ws-manager-service/websocket-service/index.ts +1 -0
  290. package/src/lib/services/ws-manager-service/websocket-service/websocket-manager.service.ts +716 -0
  291. package/src/lib/services/ws-manager-service/websocket-services-complete.spec.ts +596 -0
  292. package/src/lib/services/ws-manager-service/websocket-signals-manager.service.ts +141 -0
  293. package/src/public-api.ts +19 -0
  294. package/tsconfig.lib.json +34 -0
  295. package/tsconfig.lib.prod.json +10 -0
  296. package/tsconfig.spec.json +14 -0
  297. package/fesm2022/http-request-manager.mjs +0 -13688
  298. package/fesm2022/http-request-manager.mjs.map +0 -1
  299. package/http-request-manager-18.15.33.tgz +0 -0
  300. package/types/http-request-manager.d.ts +0 -3968
@@ -0,0 +1,69 @@
1
+ import { Injectable } from '@angular/core';
2
+
3
+ @Injectable({
4
+ providedIn: 'root'
5
+ })
6
+ export class PathQueryService {
7
+
8
+ buildAPIPath(server: string|string[], params?: any[]|any) {
9
+
10
+ server = (Array.isArray(server)) ? server.join('/') : server
11
+
12
+ const pathObjects = (params) ? params.filter((path:any) => (!this.isObject(path))) : []
13
+ const queryObjects = (params) ? params.filter((path:any) => (this.isObject(path))) : []
14
+
15
+ const query = this.removeEmptyParams(queryObjects.reduce((r: any, c: any) => {
16
+ Object.entries(c).forEach(([key, value]) => {
17
+ r[key] = Array.isArray(value) ? value.join(',') : value
18
+ })
19
+ return r
20
+ }, {}))
21
+
22
+ let path = this.buildRestPath(server, pathObjects)
23
+
24
+ return(Object.keys(query).length > 0) ? path + '?' + this.buildQueryPath(query) : path
25
+
26
+ }
27
+
28
+ private buildRestPath(server: string, params: any[]): string {
29
+ server = (server) ? server : ''
30
+ server = (server.charAt(0) === '/') ? server.substring(1) : server
31
+ return this.cleanUrlPath(server +'/'+ params.join('/'))
32
+ }
33
+
34
+ private buildQueryPath(params: any): string {
35
+
36
+ const searchParams = new URLSearchParams()
37
+
38
+ for (const key in params) {
39
+
40
+ if (Array.isArray(params[key])) {
41
+ params[key].forEach((value: any) => searchParams.append(key, value));
42
+ } else {
43
+ searchParams.append(key, params[key]);
44
+ }
45
+
46
+ }
47
+
48
+ return searchParams.toString()
49
+
50
+ }
51
+
52
+ private cleanUrlPath(str: string) {
53
+ return str.replace(/([^:]\/)\/+/g, "$1").replace(/\/$/,'')
54
+ }
55
+
56
+ private isObject(val: any): boolean {
57
+ return (val === null) ? false : ( (typeof val === 'function') || (typeof val === 'object') )
58
+ }
59
+
60
+ private removeEmptyParams = (obj: any): Record<string, any> =>
61
+ Object.fromEntries(
62
+ Object.entries(obj)
63
+ .map(([key, value]) =>
64
+ [key, value && typeof value === 'object' ? this.removeEmptyParams(value) : value]
65
+ )
66
+ .filter(([_, value]) => value !== undefined && value !== "")
67
+ )
68
+
69
+ }
@@ -0,0 +1,442 @@
1
+ // import { inject, Injectable } from '@angular/core';
2
+ // import { BehaviorSubject } from 'rxjs';
3
+ // import { take } from 'rxjs/operators';
4
+
5
+ // import { LocalStorageManagerService } from '../local-storage-manager-service/local-storage-manager.service';
6
+ // import { SettingOptions } from '../local-storage-manager-service/models/setting-options.model';
7
+ // import { StorageType } from '../local-storage-manager-service/models/storage-type.enum';
8
+ // import {
9
+ // NormalizedQueryParams,
10
+ // NormalizedRequestOptionsInterface,
11
+ // QueryValue
12
+ // } from './models/normalized-request-options.model';
13
+ // import { PathTrackerStateInterface } from './models/path-tracker-state.model';
14
+ // import { QueryParamsTrackerOptionsInterface } from './models/query-params-tracker-options.model';
15
+ // import { QueryTrackerStateInterface, QueryTrackerStateModel } from './models/query-tracker-state.model';
16
+
17
+ // export type QueryParamsTrackerOptions = QueryParamsTrackerOptionsInterface;
18
+
19
+ // const TRACKER_STORE_NAME = 'query_params_tracker';
20
+ // const TRACKER_SESSION_INIT_KEY = 'query_params_tracker_initialized';
21
+ // const DEFAULT_TRACKER_OPTIONS = SettingOptions.adapt({
22
+ // storage: StorageType.GLOBAL,
23
+ // encrypted: false,
24
+ // });
25
+
26
+ // @Injectable({
27
+ // providedIn: 'root'
28
+ // })
29
+ // export class QueryParamsTrackerService {
30
+
31
+ // private state: QueryTrackerStateInterface = { paths: {} };
32
+ // private stateRestored = false;
33
+ // private readonly localStorageManager = inject(LocalStorageManagerService);
34
+ // readonly ready$ = new BehaviorSubject<boolean>(false);
35
+
36
+ // getPathsSnapshot(): QueryTrackerStateInterface['paths'] {
37
+ // this.ensureStateRestored();
38
+ // return QueryTrackerStateModel.adapt(this.state).paths;
39
+ // }
40
+
41
+ // clearTracking(resetSessionInit = false): void {
42
+ // this.state = { paths: {} };
43
+ // this.localStorageManager.deleteStore({ name: TRACKER_STORE_NAME });
44
+
45
+ // if (resetSessionInit && this.hasSessionStorage()) {
46
+ // sessionStorage.removeItem(TRACKER_SESSION_INIT_KEY);
47
+ // }
48
+ // }
49
+
50
+ // clearTrackingForPath(pathKey: string): void {
51
+ // this.ensureStateRestored();
52
+ // if (this.state.paths[pathKey]) {
53
+ // delete this.state.paths[pathKey];
54
+ // this.persistState();
55
+ // }
56
+ // }
57
+
58
+ // checkRequestOptions(requestOptions: any[] = [], options: QueryParamsTrackerOptions = {}): boolean {
59
+ // this.ensureStateRestored();
60
+
61
+ // if (!this.ready$.value) {
62
+ // return true;
63
+ // }
64
+
65
+ // const normalized = this.normalizeRequestOptions(requestOptions);
66
+
67
+ // if (!normalized.pathKey) return false;
68
+
69
+ // this.cleanupExpiredEntries();
70
+
71
+ // if (!normalized.hasQuery) {
72
+ // const pathState = this.ensurePathState(normalized.pathKey);
73
+ // const pathSeenBefore = Object.keys(pathState.consumedValuesByKey).length > 0;
74
+ // if (!pathSeenBefore) {
75
+ // this.persistState();
76
+ // }
77
+ // return !pathSeenBefore;
78
+ // }
79
+
80
+ // if (options.mode === 'exact') {
81
+ // return this.checkExact(normalized, options);
82
+ // }
83
+
84
+ // return this.checkVariation(normalized, options);
85
+ // }
86
+
87
+ // matchesPath(requestOptions: any[] = [], expectedPathOptions: any[] = []): boolean {
88
+ // this.ensureStateRestored();
89
+ // const requestPath = this.normalizeRequestOptions(requestOptions).pathKey;
90
+ // const expectedPath = this.normalizeRequestOptions(expectedPathOptions).pathKey;
91
+ // return Boolean(requestPath) && requestPath === expectedPath;
92
+ // }
93
+
94
+ // private checkExact(normalized: NormalizedRequestOptionsInterface, options: QueryParamsTrackerOptions): boolean {
95
+ // const pathState = this.ensurePathState(normalized.pathKey);
96
+ // const filteredQuery = this.filterQueryByWatchParams(normalized.query, options.watchParams);
97
+
98
+ // if (Object.keys(filteredQuery).length === 0) {
99
+ // return false;
100
+ // }
101
+
102
+ // const hash = this.stringifyQuery(filteredQuery);
103
+ // const consumed = pathState.consumedValuesByKey['__exact__'] || [];
104
+
105
+ // if (!consumed.includes(hash)) {
106
+ // pathState.consumedValuesByKey['__exact__'] = [...consumed, hash];
107
+ // this.persistState();
108
+ // return true;
109
+ // }
110
+
111
+ // return false;
112
+ // }
113
+
114
+ // private checkVariation(normalized: NormalizedRequestOptionsInterface, options: QueryParamsTrackerOptions): boolean {
115
+ // const pathState = this.ensurePathState(normalized.pathKey);
116
+
117
+ // if (Array.isArray(options.watchParams) && options.watchParams.length === 0) {
118
+ // const pathSeenBefore = Object.keys(pathState.consumedValuesByKey).length > 0;
119
+ // if (!pathSeenBefore) {
120
+ // pathState.watchExpiresAt = this.buildExpiryEpoch(
121
+ // typeof options.watchExpiresAt !== 'undefined' ? options.watchExpiresAt : options.watchParamsExpire
122
+ // );
123
+ // this.persistState();
124
+ // }
125
+ // return !pathSeenBefore;
126
+ // }
127
+
128
+ // const filteredQuery = this.filterQueryByWatchParams(normalized.query, options.watchParams);
129
+ // const keys = Object.keys(filteredQuery);
130
+
131
+ // if (keys.length === 0) {
132
+ // return false;
133
+ // }
134
+
135
+ // this.resetPathStateIfExpired(pathState);
136
+
137
+ // let accepted = false;
138
+
139
+ // keys.forEach((key) => {
140
+ // const currentValue = filteredQuery[key];
141
+ // const consumed = pathState.consumedValuesByKey[key] || [];
142
+
143
+ // if (!consumed.includes(currentValue)) {
144
+ // pathState.consumedValuesByKey[key] = [...consumed, currentValue];
145
+ // accepted = true;
146
+ // }
147
+ // });
148
+
149
+ // if (accepted) {
150
+ // pathState.watchExpiresAt = this.buildExpiryEpoch(
151
+ // typeof options.watchExpiresAt !== 'undefined' ? options.watchExpiresAt : options.watchParamsExpire
152
+ // );
153
+ // this.persistState();
154
+ // }
155
+
156
+ // return accepted;
157
+ // }
158
+
159
+ // private filterQueryByWatchParams(
160
+ // query: NormalizedQueryParams,
161
+ // watchParams?: string[]
162
+ // ): NormalizedQueryParams {
163
+ // if (!Array.isArray(watchParams)) {
164
+ // return query;
165
+ // }
166
+
167
+ // if (watchParams.length === 0) {
168
+ // return {};
169
+ // }
170
+
171
+ // const normalizedWatchParams = watchParams.map((p) => this.normalizeParamKey(p));
172
+ // return Object.keys(query).reduce((acc, key) => {
173
+ // if (normalizedWatchParams.includes(key)) {
174
+ // acc[key] = query[key];
175
+ // }
176
+ // return acc;
177
+ // }, {} as NormalizedQueryParams);
178
+ // }
179
+
180
+ // private normalizeRequestOptions(requestOptions: any[]): NormalizedRequestOptionsInterface {
181
+ // const params = Array.isArray(requestOptions) ? requestOptions : [];
182
+ // const pathSegments: string[] = [];
183
+ // const queryObjects: Record<string, any>[] = [];
184
+
185
+ // params.forEach((item) => {
186
+ // if (this.isPlainObject(item)) {
187
+ // queryObjects.push(item);
188
+ // } else if (typeof item !== 'undefined' && item !== null) {
189
+ // const parsed = this.parsePathSegment(String(item));
190
+ // if (parsed.pathSegment) {
191
+ // pathSegments.push(parsed.pathSegment);
192
+ // }
193
+ // if (Object.keys(parsed.queryObject).length > 0) {
194
+ // queryObjects.push(parsed.queryObject);
195
+ // }
196
+ // }
197
+ // });
198
+
199
+ // const query = queryObjects.reduce((acc, current) => {
200
+ // Object.keys(current).forEach((key) => {
201
+ // const normalizedKey = this.normalizeParamKey(key);
202
+ // const value = current[key];
203
+
204
+ // if (!normalizedKey || typeof value === 'undefined' || value === null || value === '') {
205
+ // return;
206
+ // }
207
+
208
+ // acc[normalizedKey] = this.normalizeParamValue(value);
209
+ // });
210
+
211
+ // return acc;
212
+ // }, {} as NormalizedQueryParams);
213
+
214
+ // return {
215
+ // pathKey: this.normalizePath(pathSegments),
216
+ // query,
217
+ // hasQuery: Object.keys(query).length > 0,
218
+ // };
219
+ // }
220
+
221
+ // private parsePathSegment(rawSegment: string): { pathSegment: string; queryObject: Record<string, any> } {
222
+ // const [pathPart, ...queryParts] = String(rawSegment).split('?');
223
+ // const queryString = queryParts.join('?');
224
+ // const queryObject: Record<string, any> = {};
225
+
226
+ // if (queryString) {
227
+ // queryString.split('&').forEach((pair) => {
228
+ // if (!pair) return;
229
+
230
+ // const [rawKey, ...rawValueParts] = pair.split('=');
231
+ // const key = this.safeDecode(rawKey).trim();
232
+ // const value = this.safeDecode(rawValueParts.join('=')).trim();
233
+
234
+ // if (!key) return;
235
+
236
+ // queryObject[key] = value;
237
+ // });
238
+ // }
239
+
240
+ // return {
241
+ // pathSegment: pathPart,
242
+ // queryObject,
243
+ // };
244
+ // }
245
+
246
+ // private safeDecode(value: string | undefined): string {
247
+ // if (typeof value === 'undefined') {
248
+ // return '';
249
+ // }
250
+
251
+ // try {
252
+ // return decodeURIComponent(value);
253
+ // } catch {
254
+ // return String(value);
255
+ // }
256
+ // }
257
+
258
+ // private normalizePath(pathSegments: string[]): string {
259
+ // return pathSegments
260
+ // .map((segment) => String(segment).trim())
261
+ // .filter((segment) => segment.length > 0)
262
+ // .join('/')
263
+ // .replace(/([^:]\/+)\/+/g, '$1')
264
+ // .replace(/^\//, '')
265
+ // .replace(/\/$/, '');
266
+ // }
267
+
268
+ // private normalizeParamKey(key: string): string {
269
+ // return String(key).trim().toLowerCase();
270
+ // }
271
+
272
+ // private normalizeParamValue(value: any): QueryValue {
273
+ // if (Array.isArray(value)) {
274
+ // return value.map((item) => this.normalizeParamValue(item)).join(',');
275
+ // }
276
+
277
+ // if (this.isPlainObject(value)) {
278
+ // return this.stringifyQuery(
279
+ // Object.keys(value).reduce((acc, key) => {
280
+ // acc[this.normalizeParamKey(key)] = this.normalizeParamValue(value[key]);
281
+ // return acc;
282
+ // }, {} as NormalizedQueryParams)
283
+ // );
284
+ // }
285
+
286
+ // return String(value).trim().toLowerCase();
287
+ // }
288
+
289
+ // private buildExpiryEpoch(expireIn?: string | number): number | undefined {
290
+ // if (typeof expireIn === 'undefined' || expireIn === null || expireIn === '') {
291
+ // return undefined;
292
+ // }
293
+
294
+ // if (typeof expireIn === 'number' && Number.isFinite(expireIn) && expireIn > 0) {
295
+ // return Math.floor(Date.now() / 1000) + Math.floor(expireIn);
296
+ // }
297
+
298
+ // const raw = String(expireIn).trim().toLowerCase().replace(/\s+/g, '');
299
+ // const parsed = raw.match(/^(\d+)(y|w|d|hr|h|mn|min|m|s)$/);
300
+
301
+ // if (!parsed) {
302
+ // return undefined;
303
+ // }
304
+
305
+ // const value = Number(parsed[1]);
306
+ // const unit = parsed[2];
307
+
308
+ // const toSeconds: Record<string, number> = {
309
+ // y: 31556926,
310
+ // w: 604800,
311
+ // d: 86400,
312
+ // hr: 3600,
313
+ // h: 3600,
314
+ // mn: 60,
315
+ // min: 60,
316
+ // m: 60,
317
+ // s: 1,
318
+ // };
319
+
320
+ // const seconds = toSeconds[unit];
321
+
322
+ // if (!seconds) {
323
+ // return undefined;
324
+ // }
325
+
326
+ // return Math.floor(Date.now() / 1000) + value * seconds;
327
+ // }
328
+
329
+ // private resetPathStateIfExpired(pathState: PathTrackerStateInterface): void {
330
+ // const now = Math.floor(Date.now() / 1000);
331
+
332
+ // if (pathState.watchExpiresAt && pathState.watchExpiresAt <= now) {
333
+ // pathState.consumedValuesByKey = {};
334
+ // pathState.watchExpiresAt = undefined;
335
+ // }
336
+ // }
337
+
338
+ // private cleanupExpiredEntries(): void {
339
+ // const now = Math.floor(Date.now() / 1000);
340
+
341
+ // Object.keys(this.state.paths).forEach((pathKey) => {
342
+ // const pathState = this.state.paths[pathKey];
343
+
344
+ // if (pathState.watchExpiresAt && pathState.watchExpiresAt <= now) {
345
+ // pathState.consumedValuesByKey = {};
346
+ // pathState.watchExpiresAt = undefined;
347
+ // }
348
+
349
+ // const hasTrackedValues = Object.keys(pathState.consumedValuesByKey).some(
350
+ // (key) => (pathState.consumedValuesByKey[key] || []).length > 0
351
+ // );
352
+ // if (!hasTrackedValues) {
353
+ // delete this.state.paths[pathKey];
354
+ // }
355
+ // });
356
+ // }
357
+
358
+ // private ensurePathState(pathKey: string): PathTrackerStateInterface {
359
+ // if (!this.state.paths[pathKey]) {
360
+ // this.state.paths[pathKey] = {
361
+ // consumedValuesByKey: {},
362
+ // };
363
+ // }
364
+
365
+ // return this.state.paths[pathKey];
366
+ // }
367
+
368
+ // private ensureStateRestored(): void {
369
+ // if (this.stateRestored) {
370
+ // return;
371
+ // }
372
+
373
+ // this.stateRestored = true;
374
+ // this.restoreState();
375
+ // }
376
+
377
+ // private restoreState(): void {
378
+ // this.localStorageManager.store$(TRACKER_STORE_NAME)
379
+ // .pipe(take(1))
380
+ // .subscribe({
381
+ // next: (storedState: any) => {
382
+ // if (this.isTrackerState(storedState)) {
383
+ // this.state = QueryTrackerStateModel.adapt(storedState);
384
+ // this.cleanupExpiredEntries();
385
+ // } else {
386
+ // this.state = { paths: {} };
387
+ // }
388
+
389
+ // this.ready$.next(true);
390
+ // },
391
+ // error: () => {
392
+ // this.state = { paths: {} };
393
+ // this.ready$.next(true);
394
+ // }
395
+ // });
396
+ // }
397
+
398
+ // private persistState(): void {
399
+ // this.localStorageManager.storeExists$(TRACKER_STORE_NAME)
400
+ // .pipe(take(1))
401
+ // .subscribe((exists: boolean) => {
402
+ // if (exists) {
403
+ // this.localStorageManager.updateStore({ name: TRACKER_STORE_NAME, data: this.state });
404
+ // return;
405
+ // }
406
+
407
+ // this.localStorageManager.createStore({
408
+ // name: TRACKER_STORE_NAME,
409
+ // data: this.state,
410
+ // options: DEFAULT_TRACKER_OPTIONS,
411
+ // });
412
+ // });
413
+ // }
414
+
415
+ // private stringifyQuery(query: NormalizedQueryParams): string {
416
+ // return JSON.stringify(
417
+ // Object.keys(query)
418
+ // .sort()
419
+ // .reduce((acc, key) => {
420
+ // acc[key] = query[key];
421
+ // return acc;
422
+ // }, {} as NormalizedQueryParams)
423
+ // );
424
+ // }
425
+
426
+ // private isTrackerState(value: any): value is QueryTrackerStateInterface {
427
+ // return this.isPlainObject(value) && this.isPlainObject(value.paths);
428
+ // }
429
+
430
+ // private isPlainObject(value: any): boolean {
431
+ // return Object.prototype.toString.call(value) === '[object Object]';
432
+ // }
433
+
434
+ // private hasSessionStorage(): boolean {
435
+ // try {
436
+ // return typeof sessionStorage !== 'undefined';
437
+ // } catch {
438
+ // return false;
439
+ // }
440
+ // }
441
+
442
+ // }
@@ -0,0 +1,83 @@
1
+ /**
2
+ * Generate a random hex color code
3
+ * @returns A random hex color string (e.g., "#FF5733")
4
+ */
5
+ export const RandomHexColor = (): string => {
6
+ // Generate a random number between 0 and 16777215 (0xFFFFFF)
7
+ const randomColor = Math.floor(Math.random() * 16777215);
8
+ // Convert to hexadecimal and pad with zeros to ensure 6 digits
9
+ const hexColor = randomColor.toString(16).padStart(6, '0');
10
+ // Return with # prefix
11
+ return `#${hexColor}`;
12
+ };
13
+
14
+ /**
15
+ * Generate a random hex color with constraints to ensure good visibility
16
+ * @param options Optional constraints for color generation
17
+ * @returns A random hex color string with good contrast
18
+ */
19
+ export const RandomVisibleColor = (options?: {
20
+ minBrightness?: number; // Minimum brightness (0-255), default: 50
21
+ maxBrightness?: number; // Maximum brightness (0-255), default: 200
22
+ }): string => {
23
+ const minBrightness = options?.minBrightness ?? 50;
24
+ const maxBrightness = options?.maxBrightness ?? 200;
25
+
26
+ // Generate RGB values within the specified brightness range
27
+ const r = Math.floor(Math.random() * (maxBrightness - minBrightness) + minBrightness);
28
+ const g = Math.floor(Math.random() * (maxBrightness - minBrightness) + minBrightness);
29
+ const b = Math.floor(Math.random() * (maxBrightness - minBrightness) + minBrightness);
30
+
31
+ // Convert to hex and pad with zeros
32
+ const toHex = (n: number) => n.toString(16).padStart(2, '0');
33
+ return `#${toHex(r)}${toHex(g)}${toHex(b)}`;
34
+ };
35
+
36
+ /**
37
+ * Generate a random color from a predefined palette
38
+ * @returns A hex color from a set of visually distinct colors
39
+ */
40
+ export const RandomPaletteColor = (): string => {
41
+ const colorPalette = [
42
+ '#FF6B6B', // Coral
43
+ '#4ECDC4', // Turquoise
44
+ '#45B7D1', // Sky Blue
45
+ '#FFBE0B', // Amber
46
+ '#FB5607', // Orange
47
+ '#8338EC', // Violet
48
+ '#3A86FF', // Azure
49
+ '#38B000', // Green
50
+ '#9D4EDD', // Purple
51
+ '#FF006E', // Pink
52
+ '#0077B6', // Blue
53
+ '#2A9D8F' // Teal
54
+ ];
55
+
56
+ const randomIndex = Math.floor(Math.random() * colorPalette.length);
57
+ return colorPalette[randomIndex];
58
+ };
59
+
60
+ /**
61
+ * Generate a random HSL color
62
+ * @param options Optional constraints for HSL generation
63
+ * @returns A random HSL color string (e.g., "hsl(120, 100%, 50%)")
64
+ */
65
+ export const RandomHSLColor = (options?: {
66
+ saturation?: [number, number]; // Saturation range (0-100), default: [50, 100]
67
+ lightness?: [number, number]; // Lightness range (0-100), default: [40, 80]
68
+ }): string => {
69
+ // Full range for hue (0-360)
70
+ const hue = Math.floor(Math.random() * 361);
71
+
72
+ // Default or custom saturation range
73
+ const satMin = options?.saturation?.[0] ?? 50;
74
+ const satMax = options?.saturation?.[1] ?? 100;
75
+ const saturation = Math.floor(Math.random() * (satMax - satMin + 1) + satMin);
76
+
77
+ // Default or custom lightness range
78
+ const lightMin = options?.lightness?.[0] ?? 40;
79
+ const lightMax = options?.lightness?.[1] ?? 80;
80
+ const lightness = Math.floor(Math.random() * (lightMax - lightMin + 1) + lightMin);
81
+
82
+ return `hsl(${hue}, ${saturation}%, ${lightness}%)`;
83
+ };