http-request-manager 15.0.24 → 15.0.26

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 (232) hide show
  1. package/ng-package.json +8 -0
  2. package/package.json +1 -14
  3. package/src/lib/http-request-manager.module.ts +101 -0
  4. package/src/lib/http-request-services-demo/database-data-demo/database-data-demo.component.html +3 -0
  5. package/src/lib/http-request-services-demo/database-data-demo/database-data-demo.component.scss +0 -0
  6. package/src/lib/http-request-services-demo/database-data-demo/database-data-demo.component.ts +105 -0
  7. package/src/lib/http-request-services-demo/http-request-services-demo.component.html +64 -0
  8. package/src/lib/http-request-services-demo/http-request-services-demo.component.scss +6 -0
  9. package/src/lib/http-request-services-demo/http-request-services-demo.component.ts +34 -0
  10. package/src/lib/http-request-services-demo/local-storage-demo/local-storage-demo.component.html +195 -0
  11. package/src/lib/http-request-services-demo/local-storage-demo/local-storage-demo.component.scss +17 -0
  12. package/src/lib/http-request-services-demo/local-storage-demo/local-storage-demo.component.ts +205 -0
  13. package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/download-file/download-file.component.html +59 -0
  14. package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/download-file/download-file.component.scss +60 -0
  15. package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/download-file/download-file.component.ts +71 -0
  16. package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/file-download.module.ts +28 -0
  17. package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/file-downloader.component.html +10 -0
  18. package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/file-downloader.component.scss +29 -0
  19. package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/file-downloader.component.ts +99 -0
  20. package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/models/download-labels-model.ts +22 -0
  21. package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/spinner/spinner.component.html +8 -0
  22. package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/spinner/spinner.component.scss +19 -0
  23. package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/spinner/spinner.component.ts +25 -0
  24. package/src/lib/http-request-services-demo/request-manager-demo/models/app-session.model.ts +30 -0
  25. package/src/lib/http-request-services-demo/request-manager-demo/models/app.model.ts +19 -0
  26. package/src/lib/http-request-services-demo/request-manager-demo/models/get-sample.model.ts +25 -0
  27. package/src/lib/http-request-services-demo/request-manager-demo/models/sample-ai-prompt.ts +19 -0
  28. package/src/lib/http-request-services-demo/request-manager-demo/models/sample-client-details.ts +24 -0
  29. package/src/lib/http-request-services-demo/request-manager-demo/models/sample-client-info.ts +30 -0
  30. package/src/lib/http-request-services-demo/request-manager-demo/models/sample-client.model.ts +49 -0
  31. package/src/lib/http-request-services-demo/request-manager-demo/models/sample-mapper-client-info.ts +33 -0
  32. package/src/lib/http-request-services-demo/request-manager-demo/request-manager-demo.component.html +336 -0
  33. package/src/lib/http-request-services-demo/request-manager-demo/request-manager-demo.component.scss +24 -0
  34. package/src/lib/http-request-services-demo/request-manager-demo/request-manager-demo.component.ts +403 -0
  35. package/src/lib/http-request-services-demo/request-manager-state-demo/request-manager-state-demo.component.html +328 -0
  36. package/src/lib/http-request-services-demo/request-manager-state-demo/request-manager-state-demo.component.scss +24 -0
  37. package/src/lib/http-request-services-demo/request-manager-state-demo/request-manager-state-demo.component.ts +347 -0
  38. package/src/lib/http-request-services-demo/request-manager-state-demo/services/state-manager-demo.service.ts +88 -0
  39. package/src/lib/index.ts +3 -0
  40. package/src/lib/interceptors/credentials.interceptor.ts +18 -0
  41. package/{lib/interceptors/index.d.ts → src/lib/interceptors/index.ts} +2 -0
  42. package/src/lib/interceptors/models/error-settings.model.ts +22 -0
  43. package/src/lib/interceptors/proxy-debugger.interceptor.ts +46 -0
  44. package/src/lib/interceptors/request-error.interceptor.ts +65 -0
  45. package/src/lib/interceptors/request-header.interceptor.ts +58 -0
  46. package/src/lib/models/config-http-options.model.ts +42 -0
  47. package/src/lib/models/config-local-storage-options.model.ts +27 -0
  48. package/src/lib/models/config-options.model.ts +27 -0
  49. package/{lib/models/config-token.model.d.ts → src/lib/models/config-token.model.ts} +2 -1
  50. package/src/lib/models/data-type.enum.ts +5 -0
  51. package/src/lib/models/database-storage.model.ts +24 -0
  52. package/src/lib/models/index.ts +9 -0
  53. package/src/lib/models/retry-options.model.ts +22 -0
  54. package/src/lib/services/database-manager-services/database.manager.service.ts +193 -0
  55. package/src/lib/services/database-manager-services/db.storage.service.ts +191 -0
  56. package/{lib/services/database-manager-services/index.d.ts → src/lib/services/database-manager-services/index.ts} +1 -0
  57. package/src/lib/services/database-manager-services/models/table-schema.ts +35 -0
  58. package/{lib/services/index.d.ts → src/lib/services/index.ts} +4 -0
  59. package/src/lib/services/local-storage-manager-service/index.ts +2 -0
  60. package/src/lib/services/local-storage-manager-service/local-storage-manager.service.spec.ts +71 -0
  61. package/src/lib/services/local-storage-manager-service/local-storage-manager.service.ts +421 -0
  62. package/src/lib/services/local-storage-manager-service/models/global-store-options.model.ts +30 -0
  63. package/{lib/services/local-storage-manager-service/models/index.d.ts → src/lib/services/local-storage-manager-service/models/index.ts} +2 -1
  64. package/src/lib/services/local-storage-manager-service/models/setting-options.model.ts +30 -0
  65. package/src/lib/services/local-storage-manager-service/models/storage-data.model.ts +24 -0
  66. package/src/lib/services/local-storage-manager-service/models/storage-option.model.ts +29 -0
  67. package/src/lib/services/local-storage-manager-service/models/storage-type.enum.ts +5 -0
  68. package/src/lib/services/request-manager-services/README.md +268 -0
  69. package/src/lib/services/request-manager-services/http-manager.service.spec.ts +230 -0
  70. package/src/lib/services/request-manager-services/http-manager.service.ts +274 -0
  71. package/{lib/services/request-manager-services/index.d.ts → src/lib/services/request-manager-services/index.ts} +2 -0
  72. package/src/lib/services/request-manager-services/request.service.ts +261 -0
  73. package/src/lib/services/request-manager-services/rxjs-operators/countdown.ts +17 -0
  74. package/src/lib/services/request-manager-services/rxjs-operators/delay-retry.ts +16 -0
  75. package/src/lib/services/request-manager-services/rxjs-operators/request-polling.ts +21 -0
  76. package/src/lib/services/request-manager-services/rxjs-operators/request-streaming.ts +32 -0
  77. package/src/lib/services/request-manager-state-service/http-manager-state.store.ts +402 -0
  78. package/{lib/services/request-manager-state-service/index.d.ts → src/lib/services/request-manager-state-service/index.ts} +1 -0
  79. package/src/lib/services/request-manager-state-service/models/api-request.model.ts +50 -0
  80. package/{lib/services/request-manager-state-service/models/index.d.ts → src/lib/services/request-manager-state-service/models/index.ts} +1 -0
  81. package/src/lib/services/request-manager-state-service/models/request-options.model.ts +22 -0
  82. package/src/lib/services/utils/app.service.spec.ts +25 -0
  83. package/src/lib/services/utils/app.service.ts +21 -0
  84. package/src/lib/services/utils/encryption/README.md +79 -0
  85. package/src/lib/services/utils/encryption/asymmetrical-encryption.service.ts +282 -0
  86. package/src/lib/services/utils/encryption/encryption-test.service.ts +39 -0
  87. package/{lib/services/utils/encryption/index.d.ts → src/lib/services/utils/encryption/index.ts} +2 -0
  88. package/src/lib/services/utils/encryption/random.ts +69 -0
  89. package/src/lib/services/utils/encryption/symmetrical-encryption.service.ts +93 -0
  90. package/src/lib/services/utils/headers.service.spec.ts +80 -0
  91. package/src/lib/services/utils/headers.service.ts +18 -0
  92. package/{lib/services/utils/index.d.ts → src/lib/services/utils/index.ts} +2 -0
  93. package/src/lib/services/utils/object-merger.service.spec.ts +16 -0
  94. package/src/lib/services/utils/object-merger.service.ts +60 -0
  95. package/src/lib/services/utils/path-query.service.spec.ts +117 -0
  96. package/src/lib/services/utils/path-query.service.ts +69 -0
  97. package/src/lib/services/utils/utils.service.spec.ts +164 -0
  98. package/src/lib/services/utils/utils.service.ts +192 -0
  99. package/{public-api.d.ts → src/public-api.ts} +7 -0
  100. package/tsconfig.lib.json +32 -0
  101. package/tsconfig.lib.prod.json +10 -0
  102. package/tsconfig.spec.json +14 -0
  103. package/esm2022/http-request-manager.mjs +0 -5
  104. package/esm2022/lib/http-request-manager.module.mjs +0 -146
  105. package/esm2022/lib/http-request-services-demo/database-data-demo/database-data-demo.component.mjs +0 -71
  106. package/esm2022/lib/http-request-services-demo/http-request-services-demo.component.mjs +0 -41
  107. package/esm2022/lib/http-request-services-demo/local-storage-demo/local-storage-demo.component.mjs +0 -173
  108. package/esm2022/lib/http-request-services-demo/request-manager-demo/file-downloader/download-file/download-file.component.mjs +0 -80
  109. package/esm2022/lib/http-request-services-demo/request-manager-demo/file-downloader/file-download.module.mjs +0 -42
  110. package/esm2022/lib/http-request-services-demo/request-manager-demo/file-downloader/file-downloader.component.mjs +0 -88
  111. package/esm2022/lib/http-request-services-demo/request-manager-demo/file-downloader/models/download-labels-model.mjs +0 -11
  112. package/esm2022/lib/http-request-services-demo/request-manager-demo/file-downloader/spinner/spinner.component.mjs +0 -29
  113. package/esm2022/lib/http-request-services-demo/request-manager-demo/models/sample-ai-prompt.mjs +0 -9
  114. package/esm2022/lib/http-request-services-demo/request-manager-demo/models/sample-client-info.mjs +0 -12
  115. package/esm2022/lib/http-request-services-demo/request-manager-demo/models/sample-mapper-client-info.mjs +0 -14
  116. package/esm2022/lib/http-request-services-demo/request-manager-demo/request-manager-demo.component.mjs +0 -315
  117. package/esm2022/lib/http-request-services-demo/request-manager-state-demo/request-manager-state-demo.component.mjs +0 -270
  118. package/esm2022/lib/http-request-services-demo/request-manager-state-demo/services/state-manager-demo.service.mjs +0 -67
  119. package/esm2022/lib/index.mjs +0 -4
  120. package/esm2022/lib/interceptors/credentials.interceptor.mjs +0 -14
  121. package/esm2022/lib/interceptors/index.mjs +0 -5
  122. package/esm2022/lib/interceptors/models/error-settings.model.mjs +0 -10
  123. package/esm2022/lib/interceptors/proxy-debugger.interceptor.mjs +0 -47
  124. package/esm2022/lib/interceptors/request-error.interceptor.mjs +0 -49
  125. package/esm2022/lib/interceptors/request-header.interceptor.mjs +0 -41
  126. package/esm2022/lib/models/config-http-options.model.mjs +0 -18
  127. package/esm2022/lib/models/config-local-storage-options.model.mjs +0 -12
  128. package/esm2022/lib/models/config-options.model.mjs +0 -12
  129. package/esm2022/lib/models/config-token.model.mjs +0 -8
  130. package/esm2022/lib/models/data-type.enum.mjs +0 -7
  131. package/esm2022/lib/models/database-storage.model.mjs +0 -10
  132. package/esm2022/lib/models/index.mjs +0 -7
  133. package/esm2022/lib/models/retry-options.model.mjs +0 -10
  134. package/esm2022/lib/services/database-manager-services/database.manager.service.mjs +0 -119
  135. package/esm2022/lib/services/database-manager-services/db.storage.service.mjs +0 -143
  136. package/esm2022/lib/services/database-manager-services/index.mjs +0 -4
  137. package/esm2022/lib/services/database-manager-services/models/table-schema.mjs +0 -20
  138. package/esm2022/lib/services/index.mjs +0 -6
  139. package/esm2022/lib/services/local-storage-manager-service/index.mjs +0 -3
  140. package/esm2022/lib/services/local-storage-manager-service/local-storage-manager.service.mjs +0 -302
  141. package/esm2022/lib/services/local-storage-manager-service/models/global-store-options.model.mjs +0 -13
  142. package/esm2022/lib/services/local-storage-manager-service/models/index.mjs +0 -6
  143. package/esm2022/lib/services/local-storage-manager-service/models/setting-options.model.mjs +0 -13
  144. package/esm2022/lib/services/local-storage-manager-service/models/storage-data.model.mjs +0 -10
  145. package/esm2022/lib/services/local-storage-manager-service/models/storage-option.model.mjs +0 -12
  146. package/esm2022/lib/services/local-storage-manager-service/models/storage-type.enum.mjs +0 -7
  147. package/esm2022/lib/services/request-manager-services/http-manager.service.mjs +0 -207
  148. package/esm2022/lib/services/request-manager-services/index.mjs +0 -5
  149. package/esm2022/lib/services/request-manager-services/request.service.mjs +0 -189
  150. package/esm2022/lib/services/request-manager-services/rxjs-operators/countdown.mjs +0 -9
  151. package/esm2022/lib/services/request-manager-services/rxjs-operators/delay-retry.mjs +0 -10
  152. package/esm2022/lib/services/request-manager-services/rxjs-operators/index.mjs +0 -5
  153. package/esm2022/lib/services/request-manager-services/rxjs-operators/request-polling.mjs +0 -14
  154. package/esm2022/lib/services/request-manager-services/rxjs-operators/request-streaming.mjs +0 -19
  155. package/esm2022/lib/services/request-manager-state-service/http-manager-state.store.mjs +0 -267
  156. package/esm2022/lib/services/request-manager-state-service/index.mjs +0 -3
  157. package/esm2022/lib/services/request-manager-state-service/models/api-request.model.mjs +0 -20
  158. package/esm2022/lib/services/request-manager-state-service/models/index.mjs +0 -3
  159. package/esm2022/lib/services/request-manager-state-service/models/request-options.model.mjs +0 -10
  160. package/esm2022/lib/services/utils/app.service.mjs +0 -26
  161. package/esm2022/lib/services/utils/encryption/asymmetrical-encryption.service.mjs +0 -186
  162. package/esm2022/lib/services/utils/encryption/encryption-test.service.mjs +0 -35
  163. package/esm2022/lib/services/utils/encryption/index.mjs +0 -4
  164. package/esm2022/lib/services/utils/encryption/random.mjs +0 -52
  165. package/esm2022/lib/services/utils/encryption/symmetrical-encryption.service.mjs +0 -77
  166. package/esm2022/lib/services/utils/headers.service.mjs +0 -21
  167. package/esm2022/lib/services/utils/index.mjs +0 -6
  168. package/esm2022/lib/services/utils/object-merger.service.mjs +0 -50
  169. package/esm2022/lib/services/utils/path-query.service.mjs +0 -54
  170. package/esm2022/lib/services/utils/utils.service.mjs +0 -155
  171. package/esm2022/public-api.mjs +0 -11
  172. package/fesm2022/http-request-manager.mjs +0 -3444
  173. package/fesm2022/http-request-manager.mjs.map +0 -1
  174. package/http-request-manager-15.0.24.tgz +0 -0
  175. package/index.d.ts +0 -5
  176. package/lib/http-request-manager.module.d.ts +0 -33
  177. package/lib/http-request-services-demo/database-data-demo/database-data-demo.component.d.ts +0 -19
  178. package/lib/http-request-services-demo/http-request-services-demo.component.d.ts +0 -24
  179. package/lib/http-request-services-demo/local-storage-demo/local-storage-demo.component.d.ts +0 -56
  180. package/lib/http-request-services-demo/request-manager-demo/file-downloader/download-file/download-file.component.d.ts +0 -26
  181. package/lib/http-request-services-demo/request-manager-demo/file-downloader/file-download.module.d.ts +0 -13
  182. package/lib/http-request-services-demo/request-manager-demo/file-downloader/file-downloader.component.d.ts +0 -27
  183. package/lib/http-request-services-demo/request-manager-demo/file-downloader/models/download-labels-model.d.ts +0 -12
  184. package/lib/http-request-services-demo/request-manager-demo/file-downloader/spinner/spinner.component.d.ts +0 -16
  185. package/lib/http-request-services-demo/request-manager-demo/models/sample-ai-prompt.d.ts +0 -8
  186. package/lib/http-request-services-demo/request-manager-demo/models/sample-client-info.d.ts +0 -14
  187. package/lib/http-request-services-demo/request-manager-demo/models/sample-mapper-client-info.d.ts +0 -14
  188. package/lib/http-request-services-demo/request-manager-demo/request-manager-demo.component.d.ts +0 -107
  189. package/lib/http-request-services-demo/request-manager-state-demo/request-manager-state-demo.component.d.ts +0 -122
  190. package/lib/http-request-services-demo/request-manager-state-demo/services/state-manager-demo.service.d.ts +0 -15
  191. package/lib/index.d.ts +0 -3
  192. package/lib/interceptors/credentials.interceptor.d.ts +0 -8
  193. package/lib/interceptors/models/error-settings.model.d.ts +0 -10
  194. package/lib/interceptors/proxy-debugger.interceptor.d.ts +0 -12
  195. package/lib/interceptors/request-error.interceptor.d.ts +0 -10
  196. package/lib/interceptors/request-header.interceptor.d.ts +0 -15
  197. package/lib/models/config-http-options.model.d.ts +0 -21
  198. package/lib/models/config-local-storage-options.model.d.ts +0 -13
  199. package/lib/models/config-options.model.d.ts +0 -12
  200. package/lib/models/data-type.enum.d.ts +0 -5
  201. package/lib/models/database-storage.model.d.ts +0 -10
  202. package/lib/models/index.d.ts +0 -6
  203. package/lib/models/retry-options.model.d.ts +0 -10
  204. package/lib/services/database-manager-services/database.manager.service.d.ts +0 -31
  205. package/lib/services/database-manager-services/db.storage.service.d.ts +0 -26
  206. package/lib/services/database-manager-services/models/table-schema.d.ts +0 -11
  207. package/lib/services/local-storage-manager-service/index.d.ts +0 -2
  208. package/lib/services/local-storage-manager-service/local-storage-manager.service.d.ts +0 -86
  209. package/lib/services/local-storage-manager-service/models/global-store-options.model.d.ts +0 -15
  210. package/lib/services/local-storage-manager-service/models/setting-options.model.d.ts +0 -15
  211. package/lib/services/local-storage-manager-service/models/storage-data.model.d.ts +0 -10
  212. package/lib/services/local-storage-manager-service/models/storage-option.model.d.ts +0 -13
  213. package/lib/services/local-storage-manager-service/models/storage-type.enum.d.ts +0 -5
  214. package/lib/services/request-manager-services/http-manager.service.d.ts +0 -41
  215. package/lib/services/request-manager-services/request.service.d.ts +0 -27
  216. package/lib/services/request-manager-services/rxjs-operators/countdown.d.ts +0 -2
  217. package/lib/services/request-manager-services/rxjs-operators/delay-retry.d.ts +0 -2
  218. package/lib/services/request-manager-services/rxjs-operators/request-polling.d.ts +0 -7
  219. package/lib/services/request-manager-services/rxjs-operators/request-streaming.d.ts +0 -2
  220. package/lib/services/request-manager-state-service/http-manager-state.store.d.ts +0 -51
  221. package/lib/services/request-manager-state-service/models/api-request.model.d.ts +0 -27
  222. package/lib/services/request-manager-state-service/models/request-options.model.d.ts +0 -10
  223. package/lib/services/utils/app.service.d.ts +0 -8
  224. package/lib/services/utils/encryption/asymmetrical-encryption.service.d.ts +0 -17
  225. package/lib/services/utils/encryption/encryption-test.service.d.ts +0 -10
  226. package/lib/services/utils/encryption/random.d.ts +0 -7
  227. package/lib/services/utils/encryption/symmetrical-encryption.service.d.ts +0 -14
  228. package/lib/services/utils/headers.service.d.ts +0 -10
  229. package/lib/services/utils/object-merger.service.d.ts +0 -12
  230. package/lib/services/utils/path-query.service.d.ts +0 -11
  231. package/lib/services/utils/utils.service.d.ts +0 -24
  232. /package/{lib/services/request-manager-services/rxjs-operators/index.d.ts → src/lib/services/request-manager-services/rxjs-operators/index.ts} +0 -0
@@ -0,0 +1,421 @@
1
+ import { Inject, Injectable, OnDestroy, Optional, inject } from '@angular/core';
2
+ import { ComponentStore } from '@ngrx/component-store';
3
+ import { withLatestFrom, map, tap } from 'rxjs/operators';
4
+
5
+ import { UtilsService } from '../utils/utils.service';
6
+ import { SymmetricalEncryptionService } from '../utils/encryption/symmetrical-encryption.service';
7
+
8
+ import { StorageOption, StorageType } from './models';
9
+ import { SettingOptions } from './models/setting-options.model';
10
+ import { StorageData } from './models/storage-data.model';
11
+ import { EncryptionTestService } from '../utils/encryption/encryption-test.service';
12
+ import { interval } from 'rxjs';
13
+ import { AppService } from '../utils/app.service';
14
+ import { CONFIG_SETTINGS_TOKEN } from '../../models/config-token.model';
15
+ import { ConfigOptions } from '../request-manager-services';
16
+ import { ObjectMergerService } from '../utils/object-merger.service';
17
+
18
+ export interface State {
19
+ localStores: StorageData[]
20
+ sessionStores: StorageData[]
21
+ settings: StorageOption[]
22
+ }
23
+
24
+ const storage: State = {
25
+ localStores: [],
26
+ sessionStores: [],
27
+ settings: [],
28
+ };
29
+
30
+ @Injectable({ providedIn: 'root' })
31
+ export class LocalStorageManagerService extends ComponentStore<State> implements OnDestroy {
32
+
33
+ storageName = 'storage'
34
+ storageSettingsName = 'global-storage'
35
+ defaultOptions = SettingOptions.adapt()
36
+
37
+ stateRetrieved = false
38
+ encrypted = false
39
+
40
+ app = inject(AppService)
41
+ utils = inject(UtilsService)
42
+ objectMergerService = inject(ObjectMergerService)
43
+ encryption = inject(SymmetricalEncryptionService)
44
+ encryptionTest = inject(EncryptionTestService)
45
+
46
+ // SELECTORS
47
+
48
+ private readonly data$ = this.select((state) => state)
49
+
50
+ readonly stores$ = this.select((state) => state.settings)
51
+
52
+ readonly storeExists$ = (store: string) => this.select(
53
+ this.data$,
54
+ (data) => data.settings.find(item => item.name === store) ? true : false
55
+ )
56
+
57
+ readonly store$ = (store: string) => this.select(
58
+ this.data$,
59
+ (data) => {
60
+
61
+ const foundStore = data.settings.find(item => item.name === store)
62
+
63
+ if(foundStore) {
64
+
65
+ const options = SettingOptions.adapt(foundStore.options)
66
+
67
+ const found = foundStore.options?.storage === StorageType.GLOBAL
68
+ ? data.localStores.find(item => item.id === foundStore.id) as StorageData
69
+ : data.sessionStores.find(item => item.id === foundStore.id) as StorageData
70
+
71
+ if(!found) {
72
+ this.deleteStore({ name: store })
73
+ return
74
+ }
75
+
76
+ if(!this.app?.appID) {
77
+ console.warn('No App ID found - AppId not Provided')
78
+ return
79
+ }
80
+
81
+ const storageData = (options.encrypted) ? this.encryption.decrypt(found.data, this.app.appID) : found.data
82
+ return (this.isString(storageData)) ? JSON.parse(storageData): storageData
83
+
84
+ } else {
85
+ return null
86
+ }
87
+
88
+ }
89
+ )
90
+
91
+ readonly settings$ = this.select(state => (state) ? state.settings : storage.settings)
92
+
93
+ readonly setting$ = (store: string) => this.select(
94
+ this.data$,
95
+ (state) => {
96
+ const foundSetting = state.settings.find(item => item.name === store)
97
+ return (foundSetting) ? foundSetting : null
98
+ }
99
+ )
100
+
101
+ persistence$ = this.data$
102
+ .subscribe(data => {
103
+ if(this.stateRetrieved) this.persistState(data)
104
+ })
105
+
106
+ startTimer() {
107
+ const timer$ = interval(1000 * 3).pipe(
108
+ withLatestFrom(this.data$),
109
+ map(([_, state]) => state),
110
+ tap((state) => {
111
+
112
+ const expired: StorageOption[] = this.expired(state) ? this.expired(state) : []
113
+
114
+ if (expired.length > 0) {
115
+
116
+ const ids = expired.map((item) => item.id)
117
+
118
+ const updatedState: State = {
119
+ ...state,
120
+ localStores: state.localStores.filter((item) => !ids.includes(item.id)),
121
+ sessionStores: state.sessionStores.filter((item) => !ids.includes(item.id)),
122
+ settings: state.settings.filter((item) => !ids.includes(item.id)),
123
+ };
124
+
125
+ this.persistState(updatedState)
126
+ this.updateState(updatedState)
127
+
128
+ }
129
+ })
130
+ );
131
+
132
+ timer$.subscribe()
133
+ }
134
+
135
+ private updateState = this.updater((state, updatedState: State) => ({
136
+ ...updatedState,
137
+ }))
138
+
139
+
140
+ constructor(@Optional() @Inject(CONFIG_SETTINGS_TOKEN) private configOptions?: ConfigOptions) {
141
+
142
+ super(storage)
143
+
144
+ this.storageName = configOptions?.LocalStorageOptions?.storageName || this.storageName
145
+ this.storageSettingsName = configOptions?.LocalStorageOptions?.storageSettingsName || this.storageSettingsName
146
+ this.defaultOptions = configOptions?.LocalStorageOptions?.options || this.defaultOptions
147
+
148
+ this.retrieveState()
149
+ this.startTimer()
150
+ }
151
+
152
+ readonly setStore = this.updater((state: State, store: { id: string, name: string, data: any, options: SettingOptions }): any => {
153
+
154
+ const settings = StorageOption.adapt(store)
155
+ settings.options = this.objectMergerService.mergeStorageOptions(settings.options)
156
+
157
+ const type = store.options.storage
158
+ const hasStore = this.hasGlobalStorage(type, store.id)
159
+
160
+ store.name = this.validStoreName(store.name)
161
+
162
+ if(!hasStore) {
163
+ console.warn(`No such Store: ${store.name}`)
164
+ return state
165
+ } else {
166
+
167
+ const str = this.encryptionTest.isEncrypted(store.data) ? store.data : JSON.stringify(store.data)
168
+ const dataStr = (this.isObjectOrArray(str)) ? (store.options.encrypted) ? this.encryption.encrypt(str, this.app.appID) : store.data : store.data
169
+
170
+ const localData = (dataStr && settings.options?.storage === StorageType.GLOBAL) ? [{ data: dataStr, id: settings.id }] : []
171
+ const sessionData = (dataStr && settings.options?.storage === StorageType.SESSION) ? [{ data: dataStr, id: settings.id }] : []
172
+
173
+ return {
174
+ ...state,
175
+ localStores: [...state.localStores, ...localData],
176
+ sessionStores: [...state.sessionStores, ...sessionData],
177
+ settings: [...state.settings, ...[settings]],
178
+ }
179
+
180
+ }
181
+
182
+ })
183
+
184
+ readonly createStore = this.updater((state: State, store: { id?: string, name: string, data: any, options: SettingOptions }): any => {
185
+
186
+ const settings = StorageOption.adapt(store)
187
+ settings.options = this.objectMergerService.mergeStorageOptions(settings.options)
188
+ const foundStore = state?.settings.some(item => item.name === store.name)
189
+
190
+ const expires = (settings.options?.expiresIn) ? this.utils.expires(settings.options?.expiresIn) : 0
191
+ if(settings.options) settings.options.expires = expires
192
+
193
+ store.name = this.validStoreName(store.name)
194
+
195
+ if(foundStore) {
196
+ return state
197
+ } else {
198
+ if(!this.isObjectOrArray(store.data)) {
199
+ console.warn('Data must ba an Object or Array')
200
+ return
201
+ }
202
+
203
+ store.data = (this.isString(store.data)) ? JSON.parse(store.data) : store.data
204
+ const dataStr = (store.options.encrypted) ? this.encryption.encrypt(store.data, this.app.appID) : store.data
205
+
206
+ const localData = (settings.options?.storage === StorageType.GLOBAL) ? [{ data: dataStr, id: settings.id }] : []
207
+ const sessionData = (settings.options?.storage === StorageType.SESSION) ? [{ data: dataStr, id: settings.id }] : []
208
+
209
+ return {
210
+ ...state,
211
+ localStores: [...state.localStores, ...localData],
212
+ sessionStores: [...state.sessionStores, ...sessionData],
213
+ settings: [...state.settings, ...[settings]],
214
+ }
215
+
216
+ }
217
+
218
+ })
219
+
220
+ readonly updateStore = this.updater((state: State, store: { name: string, data: any }): any => {
221
+
222
+ store.name = this.validStoreName(store.name)
223
+
224
+ const settings = state.settings.find(item => item.name === store.name)
225
+
226
+ if(settings) {
227
+
228
+ const type = settings.options?.storage
229
+ const hasStore = this.hasGlobalStorage(type, settings.id || '')
230
+
231
+ if(!hasStore) {
232
+ console.warn(`No such Store: ${store.name}`)
233
+ } else {
234
+
235
+ const dataStr = (settings.options?.encrypted) ? this.encryption.encrypt(store.data, this.app.appID) : store.data
236
+
237
+ const localData = (dataStr && settings.options?.storage === StorageType.GLOBAL) ? [{ data: dataStr, id: settings.id }] : []
238
+ const sessionData = (dataStr && settings.options?.storage === StorageType.SESSION) ? [{ data: dataStr, id: settings.id }] : []
239
+
240
+ state.localStores = state.localStores.filter(item => item.id !== settings.id)
241
+ state.sessionStores = state.sessionStores.filter(item => item.id !== settings.id)
242
+
243
+ return {
244
+ ...state,
245
+ localStores: [...state.localStores, ...localData],
246
+ sessionStores: [...state.sessionStores, ...sessionData],
247
+ }
248
+
249
+ }
250
+ }
251
+
252
+ return state
253
+
254
+ })
255
+
256
+ readonly deleteStore = this.updater((state: State, store: { name: string }): any => {
257
+
258
+ store.name = this.validStoreName(store.name)
259
+
260
+ const id = state.settings.find(item => item.name === store.name)?.id
261
+
262
+ if(id) {
263
+
264
+ const settings = state.settings.filter(item => item.id !== id)
265
+ const localData = state.localStores.filter(item => item.id !== id)
266
+ const sessionData = state.sessionStores.filter(item => item.id !== id)
267
+
268
+ return {
269
+ ...state,
270
+ localStores: [...localData],
271
+ sessionStores: [...sessionData],
272
+ settings: [...settings],
273
+ }
274
+
275
+ } else {
276
+ console.warn(`No such Store: ${store.name}`)
277
+ return state
278
+ }
279
+
280
+ })
281
+
282
+ resetStore() {
283
+
284
+ const newState = {
285
+ localStores: [],
286
+ sessionStores: [],
287
+ settings: [],
288
+ }
289
+
290
+ this.updateState(newState)
291
+ this.persistState(newState)
292
+
293
+ }
294
+
295
+ private persistState(state: State|null) {
296
+
297
+ if(!state) return
298
+
299
+ const strLocal = JSON.stringify(state.localStores)
300
+ localStorage.setItem(this.storageName, strLocal)
301
+
302
+ const strSession = JSON.stringify(state.sessionStores)
303
+ sessionStorage.setItem(this.storageName, strSession)
304
+
305
+ const settingsStr = this.encryption.encrypt(state.settings, this.app.appID)
306
+ localStorage.setItem(this.storageSettingsName, settingsStr || '')
307
+
308
+ }
309
+
310
+ private expired(state: State|null) {
311
+
312
+ if(!state) return []
313
+ return state.settings?.filter(item => (item.options?.expires || 0) > 0 && this.utils.hasExpired(item.options?.expires || 0))
314
+
315
+ }
316
+
317
+ retrieveState() {
318
+
319
+ const str = localStorage.getItem(this.storageSettingsName)
320
+
321
+ const localStr = localStorage.getItem(this.storageName)
322
+ const sessionStr = sessionStorage.getItem(this.storageName)
323
+
324
+ const localData: StorageData[] = (localStr) ? JSON.parse(localStr) : null
325
+ const sessionData: StorageData[] = (sessionStr) ? JSON.parse(sessionStr) : null
326
+
327
+ const decryptedStr = str ? this.encryption.decrypt(str, this.app.appID) : null
328
+ const settings: StorageOption[] = (decryptedStr && decryptedStr !== null) ? JSON.parse(decryptedStr) : []
329
+
330
+ settings.forEach(store => {
331
+
332
+ const expired = (store.options?.expires || 0) > 0 && this.utils.hasExpired(store.options?.expires || 0)
333
+
334
+ if(!expired) {
335
+
336
+ const hasStorage = this.hasGlobalStorage(store.options?.storage, store.id || '')
337
+
338
+ if(!hasStorage) {
339
+ this.createStore({ id: store.id, name: store.name, data: [], options: SettingOptions.adapt(store.options)})
340
+ } else {
341
+ const storeData = (store.options?.storage === StorageType.GLOBAL) ? localData.find(item => item.id === store.id) : sessionData.find(item => item.id === store.id)
342
+ this.setStore({ id: store.id || '', name: store.name, data: storeData?.data, options: SettingOptions.adapt(store.options) })
343
+ }
344
+
345
+ }
346
+
347
+ })
348
+
349
+ this.stateRetrieved = true
350
+
351
+ }
352
+
353
+ private isObjectOrArray = (obj: any) => {
354
+
355
+ let parsed;
356
+
357
+ try {
358
+ parsed = (typeof obj === 'object') ? obj : JSON.parse(obj)
359
+ } catch (e) {
360
+ return false;
361
+ }
362
+
363
+ if (Array.isArray(parsed)) {
364
+ const allStringsOrObjectsOrNumbers = parsed.every(item =>
365
+ typeof item === 'string' ||
366
+ typeof item === 'object' && item !== null ||
367
+ typeof item === 'number'
368
+ );
369
+ return allStringsOrObjectsOrNumbers;
370
+ }
371
+
372
+ return typeof parsed === 'object' && parsed !== null;
373
+
374
+ }
375
+
376
+ private isString (obj: any) {
377
+ return (Object.prototype.toString.call(obj) === '[object String]')
378
+ }
379
+
380
+ private fixAndParseJSON(jsonString: string): any {
381
+ const fixedString = jsonString
382
+ .replace(/'/g, '"')
383
+ .replace(/([{,]\s*)(\w+)\s*:/g, '$1"$2":')
384
+ .replace(/,\s*(\}|\])/g, '$1');
385
+
386
+ try {
387
+ return JSON.parse(fixedString);
388
+ } catch (error: any) {
389
+ throw new Error('Failed to parse JSON: ' + error.message);
390
+ }
391
+ }
392
+
393
+ private validStoreName(str: string) {
394
+ return str
395
+ .toLowerCase() // Convert to lowercase
396
+ .replace(/\s+/g, '_') // Replace spaces with underscores
397
+ .replace(/[^ -~]/g, ''); // Remove non-ASCII characters
398
+ }
399
+
400
+ private hasGlobalStorage(type: StorageType = StorageType.GLOBAL, id: string) {
401
+
402
+ const strData: StorageOption[] = []
403
+
404
+ if(type === StorageType.GLOBAL) {
405
+ const str = localStorage.getItem(this.storageName)
406
+ strData.push(...(str ? JSON.parse(str) : []))
407
+ } else {
408
+ const str = sessionStorage.getItem(this.storageName)
409
+ strData.push(...(str ? JSON.parse(str) : []))
410
+ }
411
+
412
+ const found = strData.find(store => store.id === id)
413
+ return (found) ? true : false
414
+
415
+ }
416
+
417
+ override ngOnDestroy() {
418
+ this.persistence$.unsubscribe()
419
+ }
420
+
421
+ }
@@ -0,0 +1,30 @@
1
+ import { StorageOption } from "./storage-option.model"
2
+
3
+ export interface GlobalStoreOptionsInterface {
4
+ encryption?: boolean
5
+ expiresIn?: string
6
+ expires?: number
7
+ stores: StorageOption[]|null
8
+ }
9
+
10
+ export class GlobalStoreOptions implements GlobalStoreOptionsInterface {
11
+
12
+ constructor(
13
+ public encryption = false,
14
+ public expiresIn?: string,
15
+ public expires?: number,
16
+ public stores: StorageOption[]|null = [],
17
+ ) {}
18
+
19
+ static adapt(item?: any): GlobalStoreOptions {
20
+
21
+ return new GlobalStoreOptions(
22
+ (item?.encryption) ? item.encryption : false,
23
+ (item?.expiresIn) ? item.expiresIn : '',
24
+ (item?.expires) ? item.expires : 0,
25
+ (item?.stores) ? item.stores.map((item: any) => StorageOption.adapt(item)) : []
26
+ )
27
+
28
+ }
29
+
30
+ }
@@ -1,5 +1,6 @@
1
- export * from "./global-store-options.model";
1
+ export * from "./global-store-options.model"
2
2
  export * from "./setting-options.model";
3
3
  export * from "./storage-data.model";
4
4
  export * from "./storage-option.model";
5
+
5
6
  export * from "./storage-type.enum";
@@ -0,0 +1,30 @@
1
+ import { StorageType } from "./storage-type.enum"
2
+
3
+ export interface SettingOptionsInterface {
4
+ storage?: StorageType
5
+ expires?: number
6
+ expiresIn?: string
7
+ encrypted?: boolean
8
+ }
9
+
10
+ export class SettingOptions implements SettingOptionsInterface {
11
+
12
+ constructor(
13
+ public storage?: StorageType,
14
+ public expires?: number,
15
+ public expiresIn?: string,
16
+ public encrypted?: boolean,
17
+ ) {}
18
+
19
+ static adapt(item?: any): SettingOptions {
20
+
21
+ return new SettingOptions(
22
+ (item?.storage) ? item.storage : StorageType.GLOBAL,
23
+ (item?.expires) ? item.expires : 0,
24
+ (item?.expiresIn) ? item.expiresIn : '',
25
+ (item?.encrypted) ? item?.encrypted : false,
26
+ )
27
+
28
+ }
29
+
30
+ }
@@ -0,0 +1,24 @@
1
+ export interface StorageDataInterface {
2
+ id?: string
3
+ data?: any
4
+ }
5
+
6
+ export class StorageData implements StorageDataInterface {
7
+
8
+ constructor(
9
+ public id?: string,
10
+ public data?: any,
11
+ ) {}
12
+
13
+ static adapt(item?: any): StorageData {
14
+
15
+ return new StorageData(
16
+ (item?.id) ? item.id : crypto.randomUUID(),
17
+ (item?.data) ? item.data : null
18
+ )
19
+
20
+ }
21
+
22
+ }
23
+
24
+
@@ -0,0 +1,29 @@
1
+ import { SettingOptions } from "./setting-options.model"
2
+
3
+ export interface StorageOptionInterface {
4
+ id?: string
5
+ name: string
6
+ options?: SettingOptions
7
+ }
8
+
9
+ export class StorageOption implements StorageOptionInterface {
10
+
11
+ constructor(
12
+ public id?: string,
13
+ public name = 'untitled',
14
+ public options?: SettingOptions,
15
+ ) {}
16
+
17
+ static adapt(item?: any): StorageOption {
18
+
19
+ return new StorageOption(
20
+ (item?.id) ? item.id : crypto.randomUUID(),
21
+ item?.name,
22
+ (item?.options) ? SettingOptions.adapt(item.options) : SettingOptions.adapt(),
23
+ )
24
+
25
+ }
26
+
27
+ }
28
+
29
+
@@ -0,0 +1,5 @@
1
+ export enum StorageType {
2
+ GLOBAL,
3
+ SESSION,
4
+ DB
5
+ }