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,579 @@
1
+ # HTTP Manager Service
2
+
3
+ The `HTTPManagerService` is the core HTTP client service that provides Observable-based request management with comprehensive features for enterprise applications.
4
+
5
+ ## Overview
6
+
7
+ The HTTPManagerService acts as a wrapper around Angular's HttpClient, providing a centralized way to manage HTTP requests with:
8
+
9
+ - **State Management** - Exposes `data$`, `isPending$`, `error$`, and `countdown$` observables
10
+ - **Polling Support** - Automatic endpoint polling with countdown timers
11
+ - **Retry Logic** - Configurable retry attempts with delays
12
+ - **Adapters & Mappers** - Data transformation for requests and responses
13
+ - **Streaming** - Support for streaming responses (NDJSON, Server-Sent Events)
14
+ - **Error Handling** - Centralized error handling with optional toast notifications
15
+ - **File Downloads** - Progress tracking for file downloads
16
+
17
+ ## Installation
18
+
19
+ This service is automatically available when you import `HttpRequestManagerModule`.
20
+
21
+ ```typescript
22
+ import { HttpRequestManagerModule } from 'http-request-manager';
23
+
24
+ @NgModule({
25
+ imports: [HttpRequestManagerModule.forRoot({})]
26
+ })
27
+ export class AppModule { }
28
+ ```
29
+
30
+ ## Usage
31
+
32
+ ### Basic HTTP Request
33
+
34
+ ```typescript
35
+ import { Component, inject } from '@angular/core';
36
+ import { HTTPManagerService, ApiRequest } from 'http-request-manager';
37
+
38
+ @Component({
39
+ selector: 'app-users',
40
+ template: `
41
+ <div *ngIf="isLoading$ | async">Loading...</div>
42
+ <div *ngFor="let user of data$ | async">
43
+ {{ user.name }}
44
+ </div>
45
+ `
46
+ })
47
+ export class UsersComponent {
48
+ httpManager = inject(HTTPManagerService);
49
+
50
+ data$ = this.httpManager.data$;
51
+ isLoading$ = this.httpManager.isPending$;
52
+
53
+ ngOnInit() {
54
+ this.httpManager.getRequest(
55
+ ApiRequest.adapt({ path: ['users'] })
56
+ ).subscribe();
57
+ }
58
+ }
59
+ ```
60
+
61
+ ### Service Extension Pattern
62
+
63
+ ```typescript
64
+ import { Injectable } from '@angular/core';
65
+ import { HTTPManagerService, ApiRequest } from 'http-request-manager';
66
+ import { BehaviorSubject, EMPTY } from 'rxjs';
67
+ import { catchError } from 'rxjs/operators';
68
+
69
+ @Injectable()
70
+ export class UserService extends HTTPManagerService<any> {
71
+
72
+ private errorRetry$ = new BehaviorSubject<{ func: Function, message: string } | null>(null);
73
+ errorRetryMessage$ = this.errorRetry$.asObservable();
74
+
75
+ private apiRequest = ApiRequest.adapt({
76
+ server: 'api/users',
77
+ adapter: User.adapt
78
+ });
79
+
80
+ private params = { type: 'ACTIVE' };
81
+
82
+ fetchUsers(params = this.params) {
83
+ return this.httpManagerService.getRequest(this.apiRequest, [params])
84
+ .pipe(
85
+ catchError((error: HttpErrorResponse) => {
86
+ const func = this.fetchUsers.bind(this);
87
+ const message = error.message;
88
+ this.errorRetry$.next({ func, message });
89
+ return EMPTY;
90
+ })
91
+ );
92
+ }
93
+ }
94
+ ```
95
+
96
+ ## API Reference
97
+
98
+ ### ApiRequest Configuration
99
+
100
+ | Option | Type | Description | Default |
101
+ |--------|------|-------------|---------|
102
+ | `server` | `string` | Base URL for the request | `''` |
103
+ | `path` | `any[]` | Path segments to append to URL | `[]` |
104
+ | `headers` | `any` | Custom headers for request | `{}` |
105
+ | `adapter` | `function` | Transform incoming response data | `undefined` |
106
+ | `mapper` | `function` | Transform outgoing request payload | `undefined` |
107
+ | `polling` | `number` | Polling interval in seconds (0 = disabled) | `0` |
108
+ | `retry` | `RetryOptions` | Retry configuration | `{ times: 0, delay: 3 }` |
109
+ | `stream` | `boolean` | Enable streaming response handling | `false` |
110
+ | `displayError` | `boolean` | Show toast notification on error | `false` |
111
+ | `saveAs` | `string` | Filename for file downloads | `undefined` |
112
+
113
+ ### Observable Properties
114
+
115
+ | Property | Type | Description |
116
+ |----------|------|-------------|
117
+ | `data$` | `Observable<any>` | Response data from requests |
118
+ | `isPending$` | `Observable<boolean>` | Loading state indicator |
119
+ | `error$` | `Observable<any>` | Error state |
120
+ | `countdown$` | `Observable<number>` | Countdown for polling (if active) |
121
+
122
+ ### HTTP Methods
123
+
124
+ #### getRequest(options: ApiRequest, params?: any[])
125
+
126
+ Make a GET request with the specified options.
127
+
128
+ ```typescript
129
+ this.httpManager.getRequest(
130
+ ApiRequest.adapt({
131
+ path: ['users', '123'],
132
+ retry: { times: 3, delay: 1 }
133
+ })
134
+ ).subscribe();
135
+ ```
136
+
137
+ #### postRequest(options: ApiRequest, body?: any)
138
+
139
+ Make a POST request with optional body.
140
+
141
+ ```typescript
142
+ this.httpManager.postRequest(
143
+ ApiRequest.adapt({ path: ['users'] }),
144
+ { name: 'John Doe', email: 'john@example.com' }
145
+ ).subscribe();
146
+ ```
147
+
148
+ #### putRequest(options: ApiRequest, body?: any)
149
+
150
+ Make a PUT request with optional body.
151
+
152
+ ```typescript
153
+ this.httpManager.putRequest(
154
+ ApiRequest.adapt({ path: ['users', '123'] }),
155
+ { name: 'Jane Doe', email: 'jane@example.com' }
156
+ ).subscribe();
157
+ ```
158
+
159
+ #### deleteRequest(options: ApiRequest)
160
+
161
+ Make a DELETE request.
162
+
163
+ ```typescript
164
+ this.httpManager.deleteRequest(
165
+ ApiRequest.adapt({ path: ['users', '123'] })
166
+ ).subscribe();
167
+ ```
168
+
169
+ #### downloadRequest(options: ApiRequest)
170
+
171
+ Download a file with progress tracking.
172
+
173
+ ```typescript
174
+ this.httpManager.downloadRequest(
175
+ ApiRequest.adapt({
176
+ server: 'assets',
177
+ path: ['report.pdf'],
178
+ saveAs: 'monthly-report.pdf'
179
+ })
180
+ ).subscribe();
181
+ ```
182
+
183
+ ## Advanced Features
184
+
185
+ ### Polling
186
+
187
+ Enable automatic polling of endpoints with countdown display:
188
+
189
+ ```typescript
190
+ this.httpManager.getRequest(
191
+ ApiRequest.adapt({
192
+ path: ['server-status'],
193
+ polling: 10 // Poll every 10 seconds
194
+ })
195
+ ).subscribe();
196
+
197
+ // Countdown display
198
+ countdown$ = this.httpManager.countdown$; // 10, 9, 8, 7...
199
+ ```
200
+
201
+ ### Streaming Responses
202
+
203
+ Handle streaming responses for real-time data:
204
+
205
+ ```typescript
206
+ // NDJSON Streaming
207
+ this.httpManager.getRequest(
208
+ ApiRequest.adapt({
209
+ path: ['stream', 'data'],
210
+ stream: true,
211
+ adapter: StreamingData.adapt
212
+ })
213
+ ).subscribe();
214
+
215
+ // AI Streaming
216
+ this.httpManager.postRequest(
217
+ ApiRequest.adapt({
218
+ path: ['ai', 'chat'],
219
+ stream: true,
220
+ streamType: 'ai_streaming'
221
+ }),
222
+ { message: 'Hello AI' }
223
+ ).subscribe();
224
+ ```
225
+
226
+ ### Retry Logic
227
+
228
+ Configure automatic retry for failed requests:
229
+
230
+ ```typescript
231
+ this.httpManager.getRequest(
232
+ ApiRequest.adapt({
233
+ path: ['unreliable-endpoint'],
234
+ retry: { times: 5, delay: 2 }, // Retry 5 times with 2s delay
235
+ displayError: true // Show toast on final failure
236
+ })
237
+ ).subscribe();
238
+ ```
239
+
240
+ ### Data Adapters
241
+
242
+ Transform incoming data using adapter functions:
243
+
244
+ ```typescript
245
+ // Define adapter
246
+ export class User {
247
+ constructor(
248
+ public id: number = 0,
249
+ public name: string = '',
250
+ public email: string = ''
251
+ ) {}
252
+
253
+ static adapt(item: any): User {
254
+ return new User(
255
+ item.id,
256
+ item.fullName, // Map fullName to name
257
+ item.emailAddress // Map emailAddress to email
258
+ );
259
+ }
260
+ }
261
+
262
+ // Use adapter
263
+ this.httpManager.getRequest(
264
+ ApiRequest.adapt({
265
+ path: ['users'],
266
+ adapter: User.adapt
267
+ })
268
+ ).subscribe();
269
+
270
+ // Data is automatically transformed using User.adapt
271
+ data$ = this.httpManager.data$; // Observable<User[]>
272
+ ```
273
+
274
+ ### Data Mappers
275
+
276
+ Transform outgoing data before sending to API:
277
+
278
+ ```typescript
279
+ // Define mapper
280
+ export class UserMapper {
281
+ static adapt(user: User): any {
282
+ return {
283
+ id: user.id,
284
+ fullName: user.name, // Map name to fullName
285
+ emailAddress: user.email, // Map email to emailAddress
286
+ active: true
287
+ };
288
+ }
289
+ }
290
+
291
+ // Use mapper
292
+ this.httpManager.postRequest(
293
+ ApiRequest.adapt({
294
+ path: ['users'],
295
+ mapper: UserMapper.adapt
296
+ }),
297
+ new User(1, 'John Doe', 'john@example.com')
298
+ ).subscribe();
299
+ ```
300
+
301
+ ## Demo Examples
302
+
303
+ ### Complete HTTP Service Example
304
+
305
+ ```typescript
306
+ import { Component, inject } from '@angular/core';
307
+ import { FormBuilder, Validators } from '@angular/forms';
308
+ import { HTTPManagerService, ApiRequest } from 'http-request-manager';
309
+
310
+ @Component({
311
+ selector: 'app-api-client',
312
+ template: `
313
+ <form [formGroup]="requestForm" (ngSubmit)="makeRequest()">
314
+ <input formControlName="endpoint" placeholder="API endpoint">
315
+ <button type="submit">Make Request</button>
316
+ </form>
317
+
318
+ <div *ngIf="isLoading$ | async">Loading...</div>
319
+
320
+ <div *ngIf="error$ | async as error" class="error">
321
+ Error: {{ error }}
322
+ </div>
323
+
324
+ <pre *ngIf="data$ | async as data">
325
+ {{ data | json }}
326
+ </pre>
327
+
328
+ <div *ngIf="countdown$ | async as countdown">
329
+ Next request in: {{ countdown }}s
330
+ </div>
331
+ `
332
+ })
333
+ export class ApiClientComponent {
334
+ private fb = inject(FormBuilder);
335
+ private httpManager = inject(HTTPManagerService);
336
+
337
+ data$ = this.httpManager.data$;
338
+ isLoading$ = this.httpManager.isPending$;
339
+ error$ = this.httpManager.error$;
340
+ countdown$ = this.httpManager.countdown$;
341
+
342
+ requestForm = this.fb.group({
343
+ endpoint: ['users', Validators.required],
344
+ method: ['GET', Validators.required],
345
+ polling: [0],
346
+ retry: this.fb.group({
347
+ times: [3],
348
+ delay: [2],
349
+ })
350
+ });
351
+
352
+ makeRequest() {
353
+ const formValue = this.requestForm.value;
354
+
355
+ this.httpManager.getRequest(
356
+ ApiRequest.adapt({
357
+ path: [formValue.endpoint],
358
+ polling: formValue.polling,
359
+ retry: formValue.retry,
360
+ displayError: true
361
+ })
362
+ ).subscribe();
363
+ }
364
+ }
365
+ ```
366
+
367
+ ### Error Handling with Retry
368
+
369
+ ```typescript
370
+ export class RobustApiService {
371
+ private errorRetry$ = new BehaviorSubject<{ func: Function, message: string } | null>(null);
372
+ errorRetryMessage$ = this.errorRetry$.asObservable();
373
+
374
+ makeRequestWithRetry(endpoint: string) {
375
+ return this.httpManager.getRequest(
376
+ ApiRequest.adapt({
377
+ path: [endpoint],
378
+ retry: { times: 3, delay: 2 },
379
+ displayError: true
380
+ })
381
+ ).pipe(
382
+ catchError((error: HttpErrorResponse) => {
383
+ this.errorRetry$.next({
384
+ func: () => this.makeRequestWithRetry(endpoint),
385
+ message: error.message
386
+ });
387
+ return EMPTY;
388
+ })
389
+ );
390
+ }
391
+
392
+ retry() {
393
+ const retryAction = this.errorRetry$.value;
394
+ if (retryAction) {
395
+ retryAction.func();
396
+ }
397
+ }
398
+ }
399
+ ```
400
+
401
+ ## Integration with Other Services
402
+
403
+ The HTTPManagerService can be extended and used with other services:
404
+
405
+ ### With State Management
406
+
407
+ ```typescript
408
+ @Injectable()
409
+ export class UserStateService extends HTTPManagerStateService<User> {
410
+ constructor() {
411
+ super(
412
+ ApiRequest.adapt({
413
+ path: ['users'],
414
+ adapter: User.adapt
415
+ }),
416
+ DataType.ARRAY
417
+ );
418
+ }
419
+
420
+ loadUsers() {
421
+ this.fetchRecords(); // Uses HTTPManagerService internally
422
+ }
423
+ }
424
+ ```
425
+
426
+ ### With WebSocket
427
+
428
+ ```typescript
429
+ @Injectable()
430
+ export class ChatService extends HTTPManagerStateService<Message> {
431
+ constructor() {
432
+ super(
433
+ ApiRequest.adapt({
434
+ path: ['messages'],
435
+ adapter: Message.adapt,
436
+ ws: {
437
+ id: 'CHAT_WS',
438
+ wsServer: 'ws://localhost:8080'
439
+ }
440
+ }),
441
+ DataType.ARRAY
442
+ );
443
+ }
444
+
445
+ // HTTP + WebSocket combined
446
+ sendMessage(content: string) {
447
+ // HTTP POST to save message
448
+ this.createRecord({ content, timestamp: Date.now() });
449
+
450
+ // WebSocket broadcast
451
+ this.wsMessaging(
452
+ { content: { message: content } },
453
+ ['chat-room']
454
+ );
455
+ }
456
+ }
457
+ ```
458
+
459
+ ## Best Practices
460
+
461
+ ### 1. Service Layer Pattern
462
+
463
+ Always create dedicated services that extend or use HTTPManagerService:
464
+
465
+ ```typescript
466
+ // ✅ Good
467
+ @Injectable()
468
+ export class UserService {
469
+ constructor(private http: HTTPManagerService) {}
470
+
471
+ getUsers() {
472
+ return this.http.getRequest(
473
+ ApiRequest.adapt({ path: ['users'] })
474
+ );
475
+ }
476
+ }
477
+
478
+ // ❌ Avoid
479
+ @Component({
480
+ template: `<div *ngFor="let user of http.data$ | async">`
481
+ })
482
+ export class BadComponent {
483
+ constructor(private http: HTTPManagerService) {}
484
+ }
485
+ ```
486
+
487
+ ### 2. Error Handling
488
+
489
+ Implement comprehensive error handling:
490
+
491
+ ```typescript
492
+ fetchData() {
493
+ this.data$ = this.httpManager.getRequest(
494
+ ApiRequest.adapt({
495
+ path: ['data'],
496
+ retry: { times: 3, delay: 2 },
497
+ displayError: true
498
+ })
499
+ );
500
+ }
501
+ ```
502
+
503
+ ### 3. Adapter Usage
504
+
505
+ Use adapters for type safety:
506
+
507
+ ```typescript
508
+ // ✅ Good
509
+ ApiRequest.adapt({
510
+ path: ['users'],
511
+ adapter: User.adapt // Ensures type safety
512
+ });
513
+
514
+ // ❌ Avoid
515
+ ApiRequest.adapt({
516
+ path: ['users']
517
+ // No adapter = loose typing
518
+ });
519
+ ```
520
+
521
+ ### 4. Cleanup
522
+
523
+ Always clean up subscriptions:
524
+
525
+ ```typescript
526
+ @Component({ template: '...' })
527
+ export class MyComponent implements OnDestroy {
528
+ private destroy$ = new Subject<void>();
529
+
530
+ ngOnInit() {
531
+ this.httpManager.getRequest(
532
+ ApiRequest.adapt({ path: ['data'] })
533
+ ).pipe(takeUntil(this.destroy$)).subscribe();
534
+ }
535
+
536
+ ngOnDestroy() {
537
+ this.destroy$.next();
538
+ this.destroy$.complete();
539
+ }
540
+ }
541
+ ```
542
+
543
+ ## Troubleshooting
544
+
545
+ ### Common Issues
546
+
547
+ #### 1. CORS Errors
548
+ ```typescript
549
+ // Enable CORS in ApiRequest
550
+ ApiRequest.adapt({
551
+ server: 'https://api.example.com',
552
+ headers: { 'Access-Control-Allow-Origin': '*' }
553
+ });
554
+ ```
555
+
556
+ #### 2. Authentication Headers
557
+ ```typescript
558
+ // Add auth headers
559
+ ApiRequest.adapt({
560
+ headers: {
561
+ 'Authorization': `Bearer ${this.authToken}`,
562
+ 'Content-Type': 'application/json'
563
+ }
564
+ });
565
+ ```
566
+
567
+ #### 3. Polling Not Stopping
568
+ ```typescript
569
+ ngOnDestroy() {
570
+ this.httpManager.stopPolling(); // Important!
571
+ }
572
+ ```
573
+
574
+ ## Related Documentation
575
+
576
+ - [Architecture Overview](../architecture/README.md)
577
+ - [HTTP State Service](http-state/README.md)
578
+ - [HTTP Signals Service](http-signals/README.md)
579
+ - [Demo Examples](../demos/README.md)