http-request-manager 18.7.21 → 18.7.24

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