http-request-manager 18.7.19 → 18.7.21

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/ARCHITECTURE.md +483 -0
  2. package/DATABASE_README.md +1176 -0
  3. package/HTTP_MANAGER_README.md +579 -0
  4. package/HTTP_SINGNALS_MANAGER_README.md +654 -0
  5. package/HTTP_STATE_MANAGER_README.md +948 -0
  6. package/INTERCEPTOR_README.md +549 -0
  7. package/LOCAL_STORAGE_README.md +1056 -0
  8. package/STORE_STATE_MANAGER_README.md +1322 -0
  9. package/UTILS_README.md +1186 -0
  10. package/WS_MANAGER_README.md +613 -0
  11. package/ng-package.json +8 -0
  12. package/package.json +1 -12
  13. package/src/lib/http-request-manager.module.ts +132 -0
  14. package/src/lib/http-request-services-demo/database-data-demo/database-data-demo.component.html +65 -0
  15. package/src/lib/http-request-services-demo/database-data-demo/database-data-demo.component.scss +0 -0
  16. package/src/lib/http-request-services-demo/database-data-demo/database-data-demo.component.ts +224 -0
  17. package/src/lib/http-request-services-demo/http-request-services-demo.component.html +114 -0
  18. package/src/lib/http-request-services-demo/http-request-services-demo.component.scss +6 -0
  19. package/src/lib/http-request-services-demo/http-request-services-demo.component.ts +52 -0
  20. package/src/lib/http-request-services-demo/local-storage-demo/local-storage-demo.component.html +195 -0
  21. package/src/lib/http-request-services-demo/local-storage-demo/local-storage-demo.component.scss +17 -0
  22. package/src/lib/http-request-services-demo/local-storage-demo/local-storage-demo.component.ts +206 -0
  23. package/src/lib/http-request-services-demo/local-storage-signals-demo/local-storage-signals-demo.component.html +200 -0
  24. package/src/lib/http-request-services-demo/local-storage-signals-demo/local-storage-signals-demo.component.scss +17 -0
  25. package/src/lib/http-request-services-demo/local-storage-signals-demo/local-storage-signals-demo.component.ts +212 -0
  26. package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/download-file/download-file.component.html +53 -0
  27. package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/download-file/download-file.component.scss +60 -0
  28. package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/download-file/download-file.component.ts +72 -0
  29. package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/file-download.module.ts +28 -0
  30. package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/file-downloader.component.html +10 -0
  31. package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/file-downloader.component.scss +29 -0
  32. package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/file-downloader.component.ts +100 -0
  33. package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/models/download-labels-model.ts +22 -0
  34. package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/spinner/spinner.component.html +8 -0
  35. package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/spinner/spinner.component.scss +19 -0
  36. package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/spinner/spinner.component.ts +26 -0
  37. package/src/lib/http-request-services-demo/request-manager-demo/models/app-session.model.ts +30 -0
  38. package/src/lib/http-request-services-demo/request-manager-demo/models/app.model.ts +19 -0
  39. package/src/lib/http-request-services-demo/request-manager-demo/models/get-sample.model.ts +25 -0
  40. package/src/lib/http-request-services-demo/request-manager-demo/models/sample-ai-prompt.ts +19 -0
  41. package/src/lib/http-request-services-demo/request-manager-demo/models/sample-client-details.ts +24 -0
  42. package/src/lib/http-request-services-demo/request-manager-demo/models/sample-client-info.ts +30 -0
  43. package/src/lib/http-request-services-demo/request-manager-demo/models/sample-client.model.ts +49 -0
  44. package/src/lib/http-request-services-demo/request-manager-demo/models/sample-mapper-client-info.ts +33 -0
  45. package/src/lib/http-request-services-demo/request-manager-demo/request-manager-demo.component.html +392 -0
  46. package/src/lib/http-request-services-demo/request-manager-demo/request-manager-demo.component.scss +24 -0
  47. package/src/lib/http-request-services-demo/request-manager-demo/request-manager-demo.component.ts +461 -0
  48. package/src/lib/http-request-services-demo/request-manager-state-demo/request-manager-state-demo.component.html +393 -0
  49. package/src/lib/http-request-services-demo/request-manager-state-demo/request-manager-state-demo.component.scss +24 -0
  50. package/src/lib/http-request-services-demo/request-manager-state-demo/request-manager-state-demo.component.ts +421 -0
  51. package/src/lib/http-request-services-demo/request-manager-state-demo/services/state-manager-demo.service.ts +87 -0
  52. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/services/state-data-request.service.ts +120 -0
  53. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-ai-messaging/ws-ai-messaging.component.css +0 -0
  54. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-ai-messaging/ws-ai-messaging.component.html +3 -0
  55. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-ai-messaging/ws-ai-messaging.component.ts +16 -0
  56. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-chats/ws-chats.component.css +0 -0
  57. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-chats/ws-chats.component.html +3 -0
  58. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-chats/ws-chats.component.ts +16 -0
  59. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-data-control/ws-data-control.component.css +31 -0
  60. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-data-control/ws-data-control.component.html +72 -0
  61. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-data-control/ws-data-control.component.scss +41 -0
  62. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-data-control/ws-data-control.component.spec.ts +205 -0
  63. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-data-control/ws-data-control.component.ts +77 -0
  64. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-messaging/ws-messaging.component.css +11 -0
  65. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-messaging/ws-messaging.component.html +96 -0
  66. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-messaging/ws-messaging.component.spec.ts +31 -0
  67. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-messaging/ws-messaging.component.ts +229 -0
  68. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-notifications/ws-notifications.component.css +30 -0
  69. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-notifications/ws-notifications.component.html +172 -0
  70. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-notifications/ws-notifications.component.spec.ts +31 -0
  71. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-notifications/ws-notifications.component.ts +239 -0
  72. package/src/lib/http-request-services-demo/request-manager-ws-demo/models/oidc-client.model.ts +31 -0
  73. package/src/lib/http-request-services-demo/request-manager-ws-demo/models/user-data.model.ts +32 -0
  74. package/src/lib/http-request-services-demo/request-manager-ws-demo/request-manager-ws-demo.component.css +0 -0
  75. package/src/lib/http-request-services-demo/request-manager-ws-demo/request-manager-ws-demo.component.html +84 -0
  76. package/src/lib/http-request-services-demo/request-manager-ws-demo/request-manager-ws-demo.component.ts +41 -0
  77. package/src/lib/http-request-services-demo/request-manager-ws-demo/services/index.ts +3 -0
  78. package/src/lib/http-request-services-demo/request-manager-ws-demo/services/message-service-demo.service.ts +83 -0
  79. package/src/lib/http-request-services-demo/request-manager-ws-demo/services/notification-service-demo.service.ts +147 -0
  80. package/src/lib/http-request-services-demo/request-manager-ws-demo/services/state-service-demo.service.ts +158 -0
  81. package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/download-file/download-file.component.html +53 -0
  82. package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/download-file/download-file.component.scss +60 -0
  83. package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/download-file/download-file.component.ts +72 -0
  84. package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/file-download.module.ts +28 -0
  85. package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/file-downloader.component.html +10 -0
  86. package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/file-downloader.component.scss +29 -0
  87. package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/file-downloader.component.ts +100 -0
  88. package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/models/download-labels-model.ts +22 -0
  89. package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/spinner/spinner.component.html +8 -0
  90. package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/spinner/spinner.component.scss +19 -0
  91. package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/spinner/spinner.component.ts +26 -0
  92. package/src/lib/http-request-services-demo/request-signals-manager-demo/models/app-session.model.ts +30 -0
  93. package/src/lib/http-request-services-demo/request-signals-manager-demo/models/app.model.ts +19 -0
  94. package/src/lib/http-request-services-demo/request-signals-manager-demo/models/get-sample.model.ts +25 -0
  95. package/src/lib/http-request-services-demo/request-signals-manager-demo/models/sample-ai-prompt.ts +19 -0
  96. package/src/lib/http-request-services-demo/request-signals-manager-demo/models/sample-client-details.ts +24 -0
  97. package/src/lib/http-request-services-demo/request-signals-manager-demo/models/sample-client-info.ts +30 -0
  98. package/src/lib/http-request-services-demo/request-signals-manager-demo/models/sample-client.model.ts +49 -0
  99. package/src/lib/http-request-services-demo/request-signals-manager-demo/models/sample-mapper-client-info.ts +33 -0
  100. package/src/lib/http-request-services-demo/request-signals-manager-demo/request-signals-manager-demo.component.html +380 -0
  101. package/src/lib/http-request-services-demo/request-signals-manager-demo/request-signals-manager-demo.component.scss +24 -0
  102. package/src/lib/http-request-services-demo/request-signals-manager-demo/request-signals-manager-demo.component.ts +410 -0
  103. package/src/lib/http-request-services-demo/store-state-manager-demo/models/settings.model.ts +28 -0
  104. package/src/lib/http-request-services-demo/store-state-manager-demo/services/settings-state.service.ts +48 -0
  105. package/src/lib/http-request-services-demo/store-state-manager-demo/store-state-manager-demo.component.css +0 -0
  106. package/src/lib/http-request-services-demo/store-state-manager-demo/store-state-manager-demo.component.html +23 -0
  107. package/src/lib/http-request-services-demo/store-state-manager-demo/store-state-manager-demo.component.ts +36 -0
  108. package/src/lib/index.ts +3 -0
  109. package/src/lib/interceptors/credentials.interceptor.ts +16 -0
  110. package/src/lib/interceptors/index.ts +6 -0
  111. package/src/lib/interceptors/models/error-settings.model.ts +22 -0
  112. package/src/lib/interceptors/models/index.ts +2 -0
  113. package/src/lib/interceptors/proxy-debugger.interceptor.ts +46 -0
  114. package/src/lib/interceptors/request-error.interceptor.ts +65 -0
  115. package/src/lib/interceptors/request-header.interceptor.ts +53 -0
  116. package/src/lib/models/config-http-options.model.ts +42 -0
  117. package/src/lib/models/config-local-storage-options.model.ts +27 -0
  118. package/src/lib/models/config-options.model.ts +27 -0
  119. package/src/lib/models/config-token.model.ts +9 -0
  120. package/src/lib/models/data-type.enum.ts +5 -0
  121. package/src/lib/models/database-storage.model.ts +24 -0
  122. package/src/lib/models/index.ts +12 -0
  123. package/src/lib/models/retry-options.model.ts +22 -0
  124. package/src/lib/services/database-manager-service/database.manager.service.ts +262 -0
  125. package/src/lib/services/database-manager-service/db.storage.service.ts +207 -0
  126. package/src/lib/services/database-manager-service/index.ts +4 -0
  127. package/src/lib/services/database-manager-service/models/index.ts +2 -0
  128. package/src/lib/services/database-manager-service/models/table-schema.ts +33 -0
  129. package/src/lib/services/index.ts +12 -0
  130. package/src/lib/services/local-storage-manager-service/index.ts +4 -0
  131. package/src/lib/services/local-storage-manager-service/local-storage-manager.service.spec.ts +71 -0
  132. package/src/lib/services/local-storage-manager-service/local-storage-manager.service.ts +426 -0
  133. package/src/lib/services/local-storage-manager-service/local-storage-signals-manager.service.spec.ts +67 -0
  134. package/src/lib/services/local-storage-manager-service/local-storage-signals-manager.service.ts +345 -0
  135. package/src/lib/services/local-storage-manager-service/models/global-store-options.model.ts +30 -0
  136. package/src/lib/services/local-storage-manager-service/models/index.ts +6 -0
  137. package/src/lib/services/local-storage-manager-service/models/setting-options.model.ts +35 -0
  138. package/src/lib/services/local-storage-manager-service/models/storage-data.model.ts +24 -0
  139. package/src/lib/services/local-storage-manager-service/models/storage-option.model.ts +32 -0
  140. package/src/lib/services/local-storage-manager-service/models/storage-type.enum.ts +5 -0
  141. package/src/lib/services/request-manager-services/README.md +268 -0
  142. package/src/lib/services/request-manager-services/http-manager-signals.service.ts +246 -0
  143. package/src/lib/services/request-manager-services/http-manager.service.spec.ts +232 -0
  144. package/src/lib/services/request-manager-services/http-manager.service.ts +274 -0
  145. package/src/lib/services/request-manager-services/index.ts +8 -0
  146. package/src/lib/services/request-manager-services/request-signals.service.ts +214 -0
  147. package/src/lib/services/request-manager-services/request.service.ts +309 -0
  148. package/src/lib/services/request-manager-services/rxjs-operators/countdown.ts +17 -0
  149. package/src/lib/services/request-manager-services/rxjs-operators/delay-retry.ts +16 -0
  150. package/src/lib/services/request-manager-services/rxjs-operators/index.ts +4 -0
  151. package/src/lib/services/request-manager-services/rxjs-operators/request-polling.ts +35 -0
  152. package/src/lib/services/request-manager-services/rxjs-operators/request-streaming.ts +436 -0
  153. package/src/lib/services/request-manager-state-service/http-manager-state.store.ts +1321 -0
  154. package/src/lib/services/request-manager-state-service/index.ts +3 -0
  155. package/src/lib/services/request-manager-state-service/models/api-request.model.ts +61 -0
  156. package/src/lib/services/request-manager-state-service/models/index.ts +6 -0
  157. package/src/lib/services/request-manager-state-service/models/request-options.model.ts +22 -0
  158. package/src/lib/services/request-manager-state-service/models/stream-type.enum.ts +13 -0
  159. package/src/lib/services/request-manager-state-service/models/ws-options.model.ts +39 -0
  160. package/src/lib/services/store-state-manager-service/index.ts +3 -0
  161. package/src/lib/services/store-state-manager-service/models/index.ts +2 -0
  162. package/src/lib/services/store-state-manager-service/models/state-storage-options.model.ts +24 -0
  163. package/src/lib/services/store-state-manager-service/store-state-manager.service.ts +88 -0
  164. package/src/lib/services/utils/app.service.spec.ts +25 -0
  165. package/src/lib/services/utils/app.service.ts +21 -0
  166. package/src/lib/services/utils/encryption/README.md +79 -0
  167. package/src/lib/services/utils/encryption/asymmetrical-encryption.service.ts +282 -0
  168. package/src/lib/services/utils/encryption/encryption-test.service.ts +39 -0
  169. package/src/lib/services/utils/encryption/index.ts +5 -0
  170. package/src/lib/services/utils/encryption/random.ts +81 -0
  171. package/src/lib/services/utils/encryption/symmetrical-encryption.service.ts +93 -0
  172. package/src/lib/services/utils/headers.service.spec.ts +80 -0
  173. package/src/lib/services/utils/headers.service.ts +18 -0
  174. package/src/lib/services/utils/index.ts +7 -0
  175. package/src/lib/services/utils/object-merger.service.spec.ts +18 -0
  176. package/src/lib/services/utils/object-merger.service.ts +78 -0
  177. package/src/lib/services/utils/path-query.service.spec.ts +117 -0
  178. package/src/lib/services/utils/path-query.service.ts +69 -0
  179. package/src/lib/services/utils/random-color.utils.ts +83 -0
  180. package/src/lib/services/utils/utils.service.spec.ts +165 -0
  181. package/src/lib/services/utils/utils.service.ts +192 -0
  182. package/src/lib/services/ws-manager-service/index.ts +4 -0
  183. package/src/lib/services/ws-manager-service/models/channel-info.model.ts +24 -0
  184. package/src/lib/services/ws-manager-service/models/channel-message-data.model.ts +24 -0
  185. package/src/lib/services/ws-manager-service/models/channel-message.model.ts +24 -0
  186. package/src/lib/services/ws-manager-service/models/communication-type.enum.ts +5 -0
  187. package/src/lib/services/ws-manager-service/models/index.ts +5 -0
  188. package/src/lib/services/ws-manager-service/models/ws-user.model.ts +38 -0
  189. package/src/lib/services/ws-manager-service/services/index.ts +3 -0
  190. package/src/lib/services/ws-manager-service/services/websocket.service.ts +392 -0
  191. package/src/public-api.ts +14 -0
  192. package/tsconfig.lib.json +32 -0
  193. package/tsconfig.lib.prod.json +10 -0
  194. package/tsconfig.spec.json +14 -0
  195. package/fesm2022/http-request-manager.mjs +0 -7634
  196. package/fesm2022/http-request-manager.mjs.map +0 -1
  197. package/http-request-manager-18.7.19.tgz +0 -0
  198. package/types/http-request-manager.d.ts +0 -2278
@@ -0,0 +1,421 @@
1
+ import { Component, Input, OnInit, ViewChild, inject } from '@angular/core';
2
+
3
+ import { StateManagerDemoService } from './services/state-manager-demo.service';
4
+ import { FormBuilder, Validators, FormArray } from '@angular/forms';
5
+
6
+ import { Observable, BehaviorSubject, EMPTY, map, tap, catchError, throwError } from 'rxjs';
7
+
8
+ import { ClientInfo } from '../request-manager-demo/models/sample-client-info';
9
+ import { ClientInfoMapper } from '../request-manager-demo/models/sample-mapper-client-info';
10
+ import { AIPrompt } from '../request-manager-demo/models/sample-ai-prompt';
11
+
12
+ import { DataType } from '../../models';
13
+ import { DatabaseStorage } from '../../models/database-storage.model';
14
+ import { HTTPManagerService, ApiRequest, StreamType } from '../../services';
15
+
16
+
17
+ @Component({
18
+ selector: 'app-request-manager-state-demo',
19
+ templateUrl: './request-manager-state-demo.component.html',
20
+ styleUrls: ['./request-manager-state-demo.component.scss'],
21
+ providers: [StateManagerDemoService, HTTPManagerService],
22
+ standalone: false
23
+ })
24
+ export class RequestManagerStateDemoComponent implements OnInit {
25
+
26
+ @Input() server = 'http://localhost:8080'
27
+ @Input() adapter?: Function
28
+ @Input() mapper?: Function
29
+
30
+ stateManagerDemoService = inject(StateManagerDemoService)
31
+
32
+ displayedColumns: string[] = []
33
+
34
+ // Dynamic columns based on data structure
35
+ getColumnsFromData(data: any[]): string[] {
36
+ if (!data || data.length === 0) {
37
+ return []
38
+ }
39
+
40
+ const firstRecord = data[0]
41
+ if (!firstRecord || typeof firstRecord !== 'object') {
42
+ return []
43
+ }
44
+
45
+ // Extract all keys from the first record, excluding null/undefined
46
+ return Object.keys(firstRecord).filter(key =>
47
+ firstRecord[key] !== null && firstRecord[key] !== undefined
48
+ )
49
+ }
50
+
51
+ // Update displayed columns when data changes
52
+ updateDisplayedColumns(data: any[]): void {
53
+ this.displayedColumns = this.getColumnsFromData(data)
54
+ console.log('[STATE DEMO] Updated columns:', this.displayedColumns)
55
+ }
56
+
57
+ // Helper to check if value is an object
58
+ isObject(value: any): boolean {
59
+ return value !== null && typeof value === 'object' && !Array.isArray(value)
60
+ }
61
+
62
+ // Helper to safely get data length
63
+ getDataLength(data: any): number {
64
+ if (Array.isArray(data)) {
65
+ return data.length
66
+ }
67
+ return 0
68
+ }
69
+
70
+ selectedRecord$?: Observable<ClientInfo|null>
71
+
72
+ fb = inject(FormBuilder)
73
+
74
+ streamTypes = [
75
+ { id: 'JSON', value: 'json' },
76
+ { id: 'NDJSON', value: 'ndjson' },
77
+ { id: 'AI Streaming', value: 'ai_streaming' },
78
+ { id: 'Event Stream', value: 'event_stream' },
79
+ { id: 'Auto', value: 'auto' },
80
+ ]
81
+
82
+ streamType = 'Auto'
83
+
84
+ httpManagerService = inject(HTTPManagerService)
85
+
86
+ isPending$ = this.stateManagerDemoService.isPending$
87
+ error$ = this.stateManagerDemoService.error$
88
+
89
+ countdown$ = this.httpManagerService.countdown$
90
+
91
+ GET_error$ = new BehaviorSubject<string>('')
92
+ POST_error$ = new BehaviorSubject<string>('')
93
+ PUT_error$ = new BehaviorSubject<string>('')
94
+ DELETE_error$ = new BehaviorSubject<string>('')
95
+
96
+ STREAM_error$ = new BehaviorSubject<string>('')
97
+ STREAM_AI_error$ = new BehaviorSubject<string>('')
98
+
99
+ GET$ = new BehaviorSubject<any>(null)
100
+ POST$ = new BehaviorSubject(null)
101
+ PUT$ = new BehaviorSubject(null)
102
+ DELETE$ = new BehaviorSubject(null)
103
+
104
+ STREAM = new BehaviorSubject(null)
105
+ STREAM$ = this.STREAM.asObservable()
106
+
107
+ STREAM_AI = new BehaviorSubject<{response: string}[]>([])
108
+ STREAM_AI$ = this.STREAM_AI.asObservable()
109
+ .pipe(
110
+ map((items: any) => (items) ? items.map((item: any) => item.response) : []),
111
+ map((items: any) => items.join('\n').trim()),
112
+ )
113
+
114
+ @ViewChild("failedState", { static: true }) failedState: any
115
+ @ViewChild("pollingState", { static: true }) pollingState: any
116
+
117
+ questionControl = this.fb.control("", [Validators.required])
118
+
119
+ requestType = ''
120
+
121
+ prompts: string[] = []
122
+
123
+ AIType = 0
124
+
125
+ get dataObservable$() {
126
+
127
+ switch (this.requestType) {
128
+ case 'GET':
129
+ return this.GET$
130
+
131
+ case 'PUT':
132
+ return this.PUT$
133
+
134
+ case 'POST':
135
+ return this.POST$
136
+
137
+ case 'DELETE':
138
+ return this.DELETE$
139
+
140
+ case 'STREAM':
141
+ return this.STREAM
142
+
143
+ case 'STREAM_AI':
144
+ return this.STREAM_AI
145
+
146
+ default:
147
+ return this.GET$
148
+ break;
149
+ }
150
+
151
+ }
152
+
153
+ sampleClientData = {
154
+ id: 0,
155
+ name: "Old School Dates",
156
+ domain: "osd.com",
157
+ service: "osd",
158
+ spiffe: "osd.com/osd",
159
+ secret: "SMOPECXP-OS4P-USOG-X2II-3XMD1FQDR3IJX",
160
+ created: 1693003138,
161
+ modified: 1693003138,
162
+ icon: "",
163
+ imageFile: "",
164
+ }
165
+
166
+ selectedRecord = this.fb.control(null)
167
+
168
+ requestForm = this.fb.group({
169
+ datatype: this.fb.control('ARRAY'),
170
+ path: this.fb.control<string>("ai/"),
171
+ headers: this.fb.array([]),
172
+ adapter: [null],
173
+ mapper: [null],
174
+ retry: this.fb.group({
175
+ times: [3],
176
+ delay: [3],
177
+ }),
178
+ polling: [3],
179
+ database: this.fb.group({
180
+ table: [''],
181
+ expiresIn: ['1m'],
182
+ })
183
+ })
184
+
185
+ get hasChanged() {
186
+ return this.requestForm.dirty || this.requestForm.untouched
187
+ }
188
+
189
+ get dataType() {
190
+ return this.requestForm.get("datatype")?.value
191
+ }
192
+
193
+ get database() {
194
+ return this.requestForm.get("database")?.value
195
+ }
196
+
197
+ get retry() {
198
+ return this.requestForm.get("retry")?.value
199
+ }
200
+
201
+ sampleAdaptors = [
202
+ { label: "ClientInfo Basic", value: ClientInfo.adapt },
203
+ { label: "AI Prompt", value: AIPrompt.adapt },
204
+ ]
205
+
206
+ sampleMappers = [
207
+ { label: "Mapper Basic", value: ClientInfoMapper.adapt },
208
+ { label: "AI Prompt", value: AIPrompt.adapt },
209
+ ]
210
+
211
+ get headers(): FormArray {
212
+ return this.requestForm.get('headers') as FormArray
213
+ }
214
+
215
+ get isValid() {
216
+ this.requestForm.markAllAsTouched()
217
+ return this.requestForm.valid
218
+ }
219
+
220
+ // server = `http://sample-endpoint/as/authorization.oauth2`
221
+
222
+ arrayObjectsToObjects = (arr: any[]) => {
223
+ return Array.isArray(arr) ? arr.reduce((obj, item) => Object.assign(obj, { [item.key]: item.value }), {}) : {}
224
+ }
225
+
226
+ props = (adapter: any) => {
227
+ return (adapter) ? adapter() : null
228
+ }
229
+
230
+ constructor() { }
231
+
232
+ ngOnInit() {
233
+
234
+ this.stateManagerDemoService.data$.pipe(
235
+ tap((data) => console.log("API STREAM_AI response", data)),
236
+ )
237
+
238
+ this.error$.pipe(
239
+ tap((data) => {
240
+ debugger
241
+ console.log("API STREAM response", data)
242
+ }),
243
+ catchError(error => {
244
+ return throwError(() => this.errorHandling(error, 'STREAM'))
245
+ })
246
+ )
247
+
248
+ this.selectedRecord.valueChanges
249
+ .subscribe((data: ClientInfo|null) => {
250
+ this.selectedRecord$ = (data) ? this.stateManagerDemoService.selectRecord$(data.id) : EMPTY
251
+ })
252
+
253
+ this.stateManagerDemoService.data$
254
+ .pipe(
255
+ tap((data: any) => {
256
+ console.log('[COMPONENT] State data received:', data)
257
+
258
+ switch (this.requestType) {
259
+ case 'GET':
260
+ console.log('[COMPONENT] Updating GET$ with data:', data)
261
+ this.GET$.next(data)
262
+ break;
263
+
264
+ case 'PUT':
265
+ console.log('[COMPONENT] Updating PUT$ with data:', data)
266
+ this.PUT$.next(data)
267
+ break;
268
+
269
+ case 'POST':
270
+ console.log('[COMPONENT] Updating POST$ with data:', data)
271
+ this.POST$.next(data)
272
+ break;
273
+
274
+ case 'DELETE':
275
+ console.log('[COMPONENT] Updating DELETE$ with data:', data)
276
+ this.DELETE$.next(data)
277
+ break;
278
+
279
+ case 'STREAM':
280
+ console.log('[COMPONENT] Updating STREAM$ with data:', data)
281
+ this.STREAM.next(data)
282
+ // Update table columns dynamically based on streaming data
283
+ if (data && Array.isArray(data) && data.length > 0) {
284
+ this.updateDisplayedColumns(data)
285
+ }
286
+ break;
287
+
288
+ case 'STREAM_AI':
289
+ console.log('[COMPONENT] Updating STREAM_AI$ with data:', data)
290
+ this.STREAM_AI.next(data)
291
+ break;
292
+
293
+ default:
294
+ console.log('[COMPONENT] No requestType set, ignoring data')
295
+ break;
296
+ }
297
+
298
+ })
299
+ ).subscribe()
300
+
301
+ }
302
+
303
+ onStreamType(type: string) {
304
+ this.streamType = type
305
+ }
306
+
307
+ addHeader() {
308
+ const header = this.fb.group({
309
+ key: ['', Validators.required],
310
+ value: ['']
311
+ });
312
+ this.headers.push(header)
313
+ }
314
+
315
+ removeHeader(index: number) {
316
+ this.headers.removeAt(index)
317
+ }
318
+
319
+ compileRequest() {
320
+
321
+ const requestParams = this.requestForm.value
322
+
323
+ requestParams.headers = this.arrayObjectsToObjects(
324
+ requestParams.headers || []
325
+ )
326
+
327
+ const pathReq = (requestParams.path === "") ? [] : (requestParams.path || "").split("/")
328
+
329
+ if (!this.pollingState.checked) requestParams.polling = 0
330
+
331
+ if (!this.failedState.checked) {
332
+ requestParams.retry = { times: 0,delay: 0 }
333
+ }
334
+
335
+ const currentOptions = ApiRequest.adapt(requestParams)
336
+ currentOptions.path = []
337
+ currentOptions.server = this.server
338
+ currentOptions.adapter = this.adapter
339
+ currentOptions.mapper = this.mapper
340
+ const apiOptions = ApiRequest.adapt({ ...currentOptions, path: pathReq })
341
+
342
+ return { apiOptions: apiOptions, path: pathReq }
343
+
344
+ }
345
+
346
+ onSetStateOptions() {
347
+
348
+ if(!this.isValid) return
349
+
350
+ const reqParams = this.compileRequest()
351
+
352
+ const db = DatabaseStorage.adapt(this.database)
353
+ const type = this.dataType === "ARRAY" ? DataType.ARRAY : DataType.OBJECT
354
+ this.stateManagerDemoService.setAPIOptions(reqParams.apiOptions, type, db)
355
+
356
+ this.requestForm.markAsPristine()
357
+ }
358
+
359
+ onClearRecords() {
360
+ this.stateManagerDemoService.clearRecords()
361
+ }
362
+
363
+ onGetRequest() {
364
+ this.requestType = 'GET'
365
+ this.stateManagerDemoService.getClients()
366
+ }
367
+
368
+ onCreateRequest() {
369
+ this.requestType = 'POST'
370
+ this.stateManagerDemoService.createClient(this.sampleClientData)
371
+ }
372
+
373
+ onUpdateRequest() {
374
+ this.requestType = 'PUT'
375
+ this.stateManagerDemoService.updateClient(this.sampleClientData)
376
+ }
377
+
378
+ onDeleteRequest() {
379
+ this.requestType = 'DELETE'
380
+ this.stateManagerDemoService.deleteClient(this.sampleClientData)
381
+ }
382
+
383
+ onStreamRequest() {
384
+ console.log('[COMPONENT] onStreamRequest called')
385
+
386
+ if(!this.isValid) {
387
+ console.log('[COMPONENT] Form invalid, aborting')
388
+ return
389
+ }
390
+
391
+ console.log('[COMPONENT] Compiling request...')
392
+ const reqParams = this.compileRequest()
393
+
394
+ console.log('[COMPONENT] Setting stream options:', reqParams.apiOptions)
395
+ reqParams.apiOptions.stream = true
396
+ reqParams.apiOptions.streamType = this.streamType as StreamType
397
+ this.requestType = 'STREAM'
398
+
399
+ console.log('[COMPONENT] Calling streamRequest...')
400
+ this.stateManagerDemoService.streamRequest()
401
+
402
+ }
403
+
404
+ errorHandling(err: any, type: string) { console.log(err, type)
405
+ if(type === 'GET') this.GET_error$.next(err.message)
406
+ if(type === 'POST') this.POST_error$.next(err.message)
407
+ if(type === 'PUT') this.PUT_error$.next(err.message)
408
+ if(type === 'DELETE') this.DELETE_error$.next(err.message)
409
+ if(type === 'STREAM') this.STREAM_error$.next(err.message)
410
+ if(type === 'STREAM_AI') this.STREAM_AI_error$.next(err.message)
411
+ }
412
+
413
+ onSelectAIType(type: number) {
414
+ this.AIType = type
415
+ }
416
+
417
+ onClearHistory() {
418
+ this.prompts = []
419
+ }
420
+
421
+ }
@@ -0,0 +1,87 @@
1
+ import { Injectable } from '@angular/core';
2
+
3
+ import { DataType, DatabaseStorage } from '../../../models';
4
+ import { HTTPManagerStateService, ApiRequest, RequestOptions } from '../../../services';
5
+
6
+ import { ClientInfo } from '../../request-manager-demo/models/sample-client-info';
7
+ import { ClientInfoMapper } from '../../request-manager-demo/models/sample-mapper-client-info';
8
+
9
+ @Injectable()
10
+ export class StateManagerDemoService extends HTTPManagerStateService<any> {
11
+
12
+ constructor() {
13
+ super(
14
+ ApiRequest.adapt({
15
+ server: "",
16
+ path: [],
17
+ headers: {},
18
+ adapter: ClientInfo.adapt,
19
+ mapper: ClientInfoMapper.adapt,
20
+ stream: false,
21
+ }),
22
+ DataType.ARRAY,
23
+ DatabaseStorage.adapt()
24
+ )
25
+ }
26
+
27
+ setAPIOptions(apiOptions: ApiRequest, dataType: DataType, database?: DatabaseStorage) {
28
+ this.setApiRequestOptions(apiOptions, dataType, database)
29
+ }
30
+
31
+ getClients() {
32
+
33
+ // const headers = {
34
+ // auth: "sample-auth-token"
35
+ // }
36
+ // const sampleOptions = RequestOptions.adapt({ path: ["id", 12], headers, sample: true })
37
+ this.fetchRecords()
38
+
39
+ }
40
+
41
+ createClient(data: any) {
42
+
43
+ // const headers = {
44
+ // auth: "sample-auth-token"
45
+ // }
46
+
47
+ // const sampleOptions = RequestOptions.adapt({ path: ["id", 12], headers, sample: true })
48
+ this.createRecord(data)
49
+
50
+ }
51
+
52
+ updateClient(data: ClientInfo) {
53
+
54
+ // const headers = {
55
+ // auth: "sample-auth-token"
56
+ // }
57
+ data.id = 1031
58
+ const sampleOptions = RequestOptions.adapt({ path: [data.id] })
59
+ this.updateRecord(data, sampleOptions)
60
+
61
+ }
62
+
63
+ deleteClient(data: ClientInfo) {
64
+
65
+ // const headers = {
66
+ // auth: "sample-auth-token"
67
+ // }
68
+
69
+ data.id = 1031
70
+ const sampleOptions = RequestOptions.adapt({ path: [data.id] })
71
+ this.deleteRecord(sampleOptions)
72
+
73
+ }
74
+
75
+ streamRequest() {
76
+ console.log('[DEMO SERVICE] streamRequest called')
77
+
78
+ const headers = {
79
+ auth: "sample-auth-token"
80
+ }
81
+
82
+ console.log('[DEMO SERVICE] Calling fetchStream with headers:', headers)
83
+ this.fetchStream()
84
+
85
+ }
86
+
87
+ }
@@ -0,0 +1,120 @@
1
+ import { Injectable } from '@angular/core';
2
+ import { RandomNumber } from '../../../../services/utils/encryption/random';
3
+ import { RetryOptions, DataType, DatabaseStorage } from '../../../../models';
4
+
5
+ import { HTTPManagerStateService, ApiRequest, RequestOptions } from '../../../../services';
6
+
7
+ import { OIDCClient } from '../../models/oidc-client.model';
8
+ import { UserData } from '../../models/user-data.model';
9
+ import { ChannelMessage } from '../../../../services/ws-manager-service/models/channel-message.model';
10
+
11
+ @Injectable({
12
+ providedIn: 'root'
13
+ })
14
+ export class StateDataRequestService extends HTTPManagerStateService<any> {
15
+
16
+ attempts$ = this.wsRetryAttempts$
17
+ nextRetry$ = this.wsNextRetry$
18
+
19
+ path = ['ai','tests']
20
+
21
+ constructor() {
22
+ super(
23
+ ApiRequest.adapt({
24
+ server: '',
25
+ retry: RetryOptions.adapt({
26
+ times: 3,
27
+ delay: 1,
28
+ }),
29
+ adapter: OIDCClient.adapt,
30
+ ws: {
31
+ id: ``,
32
+ // wsChannels: ['allChannels'],
33
+ // access: ['read,write,delete,update'],
34
+ wsServer: '',
35
+ jwtToken: '',
36
+ user: UserData.adapt(),
37
+ retry: RetryOptions.adapt({
38
+ times: 3,
39
+ delay: 10,
40
+ }),
41
+ }
42
+ }),
43
+ DataType.ARRAY,
44
+ DatabaseStorage.adapt({
45
+ table: 'ws_demo_data',
46
+ expiresIn: '5mn',
47
+ })
48
+ )
49
+ }
50
+
51
+ updateConnection(
52
+ server: string,
53
+ wsServer: string,
54
+ jwtToken: string,
55
+ user: any,
56
+ path: string[] = [],
57
+ wsChannel: string = ''
58
+ ) {
59
+
60
+ this.path = path
61
+
62
+ this.setApiRequestOptions({
63
+ server,
64
+ retry: RetryOptions.adapt({
65
+ times: 3,
66
+ delay: 1,
67
+ }),
68
+ adapter: OIDCClient.adapt,
69
+ ws: {
70
+ id: wsChannel,
71
+ wsServer,
72
+ jwtToken,
73
+ user, // general info about user
74
+ retry: RetryOptions.adapt({
75
+ times: 3,
76
+ delay: 10,
77
+ }),
78
+ }
79
+ })
80
+
81
+ }
82
+
83
+ addData() {
84
+
85
+ const num = RandomNumber(1000, 9999)
86
+
87
+ const newData = {
88
+ "spiffe": `sample.com/developer/${num}`,
89
+ "last_name": "boni",
90
+ "email": "mikeboni@hotmail.com",
91
+ "first_name": "mike"
92
+ }
93
+
94
+ this.createRecord(newData, RequestOptions.adapt({ path: this.path }) )
95
+
96
+ }
97
+
98
+ sendMessage(data: ChannelMessage) {
99
+ console.log('sendMessage', data)
100
+ this.wsMessaging(data)
101
+ }
102
+
103
+ getData() {
104
+ this.fetchRecords(RequestOptions.adapt({ path: this.path }) )
105
+ }
106
+
107
+ updateData(data: any) {
108
+ const sampleOptions = RequestOptions.adapt({ path: [...this.path, data.id] })
109
+ console.log('updateData', sampleOptions)
110
+ this.updateRecord(data, sampleOptions)
111
+
112
+ }
113
+
114
+ deleteData(data: any) {
115
+ const sampleOptions = RequestOptions.adapt({ path: [...this.path, data.id] })
116
+ console.log('deleteData', sampleOptions)
117
+ this.deleteRecord(sampleOptions)
118
+ }
119
+
120
+ }
@@ -0,0 +1,16 @@
1
+ import { Component, OnInit } from '@angular/core';
2
+
3
+ @Component({
4
+ selector: 'app-ws-ai-messaging',
5
+ templateUrl: './ws-ai-messaging.component.html',
6
+ styleUrls: ['./ws-ai-messaging.component.css'],
7
+ standalone: false
8
+ })
9
+ export class WsAiMessagingComponent implements OnInit {
10
+
11
+ constructor() { }
12
+
13
+ ngOnInit() {
14
+ }
15
+
16
+ }
@@ -0,0 +1,16 @@
1
+ import { Component, OnInit } from '@angular/core';
2
+
3
+ @Component({
4
+ selector: 'app-ws-chats',
5
+ templateUrl: './ws-chats.component.html',
6
+ styleUrls: ['./ws-chats.component.css'],
7
+ standalone: false
8
+ })
9
+ export class WsChatsComponent implements OnInit {
10
+
11
+ constructor() { }
12
+
13
+ ngOnInit() {
14
+ }
15
+
16
+ }
@@ -0,0 +1,31 @@
1
+ /* Highlight the current user chip with the theme primary color */
2
+ .user-chip--primary {
3
+ /* Prefer MDC/Material tokens; fall back to a safe primary */
4
+ background-color: var(--mdc-theme-primary, var(--md-sys-color-primary, #3f51b5)) !important;
5
+ /* Ensure foreground text renders white */
6
+ color: #fff !important;
7
+ /* Also set MDC chip variables where applicable */
8
+ --mdc-evolution-chip-container-color: var(--mdc-theme-primary, var(--md-sys-color-primary, #3f51b5));
9
+ --mdc-evolution-chip-label-text-color: #fff;
10
+ }
11
+
12
+ /* Force inner MDC chip parts to inherit white foreground */
13
+ .user-chip--primary :is(
14
+ .mdc-evolution-chip__text-label,
15
+ .mdc-evolution-chip__action,
16
+ .mdc-evolution-chip__cell,
17
+ .mat-mdc-chip-action-label
18
+ ) {
19
+ color: #fff !important;
20
+ }
21
+
22
+ /* Strong fallback: ensure all descendants render white */
23
+ .user-chip--primary,
24
+ .user-chip--primary * {
25
+ color: #fff !important;
26
+ }
27
+ .box {
28
+ padding: .5rem;
29
+ border: 1px solid rgb(174, 174, 13);
30
+ background-color: rgb(236, 236, 175);
31
+ }