http-request-manager 18.7.20 → 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 (197) 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 -7633
  196. package/fesm2022/http-request-manager.mjs.map +0 -1
  197. package/types/http-request-manager.d.ts +0 -2277
@@ -0,0 +1,654 @@
1
+ # HTTP Manager Signals Service
2
+
3
+ The `HTTPManagerSignalsService` provides the same functionality as `HTTPManagerService` but uses Angular Signals for state management, making it ideal for modern Angular applications that leverage fine-grained reactivity.
4
+
5
+ ## Overview
6
+
7
+ This service provides:
8
+
9
+ - **Signal-Based State** - Exposes `data`, `isPending`, `error`, and `countdown` as Angular Signals
10
+ - **Feature Parity** - Supports all features of `HTTPManagerService` including polling, retries, adapters, and streaming
11
+ - **Optimized for Signals** - Designed to work seamlessly with Angular's Signal-based components and templates
12
+ - **Modern Reactivity** - Leverages Angular's latest reactive patterns
13
+
14
+ ## Usage
15
+
16
+ ### Basic Signal-Based HTTP Request
17
+
18
+ ```typescript
19
+ import { Component, inject } from '@angular/core';
20
+ import { HTTPManagerSignalsService, ApiRequest } from 'http-request-manager';
21
+
22
+ @Component({
23
+ selector: 'app-users',
24
+ template: `
25
+ <div *ngIf="isLoading()">Loading...</div>
26
+ <div *ngFor="let user of data()">
27
+ {{ user.name }}
28
+ </div>
29
+ `
30
+ })
31
+ export class UsersComponent {
32
+ httpManager = inject(HTTPManagerSignalsService);
33
+
34
+ data = this.httpManager.data; // Signal<any[]>
35
+ isLoading = this.httpManager.isPending; // Signal<boolean>
36
+ error = this.httpManager.error; // Signal<any>
37
+ countdown = this.httpManager.countdown; // Signal<number>
38
+
39
+ ngOnInit() {
40
+ this.httpManager.getRequest(
41
+ ApiRequest.adapt({ path: ['users'] })
42
+ ).subscribe();
43
+ }
44
+ }
45
+ ```
46
+
47
+ ### Modern Component with Signals
48
+
49
+ ```typescript
50
+ import { Component, inject, signal, computed } from '@angular/core';
51
+ import { HTTPManagerSignalsService, ApiRequest } from 'http-request-manager';
52
+
53
+ interface User {
54
+ id: number;
55
+ name: string;
56
+ email: string;
57
+ }
58
+
59
+ @Component({
60
+ selector: 'app-user-list',
61
+ template: `
62
+ <div class="user-list">
63
+ <h2>Users ({{ userCount() }})</h2>
64
+
65
+ <div *ngIf="loadingState() === 'loading'">
66
+ Loading users...
67
+ </div>
68
+
69
+ <div *ngIf="loadingState() === 'error'" class="error">
70
+ {{ errorMessage() }}
71
+ </div>
72
+
73
+ <div class="user-grid">
74
+ <div *ngFor="let user of activeUsers()" class="user-card">
75
+ <h3>{{ user.name }}</h3>
76
+ <p>{{ user.email }}</p>
77
+ <span class="user-id">#{{ user.id }}</span>
78
+ </div>
79
+ </div>
80
+
81
+ <div *ngIf="isPolling()" class="polling-info">
82
+ Auto-refresh in {{ countdown() }}s
83
+ <button (click)="refreshNow()">Refresh Now</button>
84
+ </div>
85
+ </div>
86
+ `
87
+ })
88
+ export class UserListComponent {
89
+ private httpManager = inject(HTTPManagerSignalsService);
90
+
91
+ // Raw signals
92
+ data = this.httpManager.data;
93
+ isPending = this.httpManager.isPending;
94
+ error = this.httpManager.error;
95
+ countdown = this.httpManager.countdown;
96
+
97
+ // Computed signals
98
+ userCount = computed(() => this.data().length);
99
+
100
+ activeUsers = computed(() =>
101
+ this.data().filter(user => user.active !== false)
102
+ );
103
+
104
+ loadingState = computed(() => {
105
+ if (this.isPending()) return 'loading';
106
+ if (this.error()) return 'error';
107
+ return 'idle';
108
+ });
109
+
110
+ errorMessage = computed(() => {
111
+ const err = this.error();
112
+ return err ? err.message || 'Unknown error' : '';
113
+ });
114
+
115
+ isPolling = computed(() => this.countdown() > 0);
116
+
117
+ constructor() {
118
+ // Initialize with polling
119
+ this.loadUsersWithPolling();
120
+ }
121
+
122
+ loadUsersWithPolling() {
123
+ this.httpManager.getRequest(
124
+ ApiRequest.adapt({
125
+ path: ['users'],
126
+ polling: 30, // Poll every 30 seconds
127
+ retry: { times: 3, delay: 2 },
128
+ displayError: true
129
+ })
130
+ ).subscribe();
131
+ }
132
+
133
+ refreshNow() {
134
+ this.loadUsersWithPolling();
135
+ }
136
+
137
+ stopPolling() {
138
+ this.httpManager.stopPolling();
139
+ }
140
+ }
141
+ ```
142
+
143
+ ## API Reference
144
+
145
+ ### Signal Properties
146
+
147
+ | Signal | Type | Description | Usage |
148
+ |--------|------|-------------|-------|
149
+ | `data` | `Signal<any>` | Response data from requests | `this.data()` |
150
+ | `isPending` | `Signal<boolean>` | Loading state indicator | `this.isPending()` |
151
+ | `error` | `Signal<any>` | Error state | `this.error()` |
152
+ | `countdown` | `Signal<number>` | Countdown for polling | `this.countdown()` |
153
+
154
+ ### HTTP Methods
155
+
156
+ All HTTP methods work the same as `HTTPManagerService`:
157
+
158
+ ```typescript
159
+ // GET Request
160
+ this.httpManager.getRequest(
161
+ ApiRequest.adapt({ path: ['users'] })
162
+ ).subscribe();
163
+
164
+ // POST Request
165
+ this.httpManager.postRequest(
166
+ ApiRequest.adapt({ path: ['users'] }),
167
+ { name: 'John Doe', email: 'john@example.com' }
168
+ ).subscribe();
169
+
170
+ // PUT Request
171
+ this.httpManager.putRequest(
172
+ ApiRequest.adapt({ path: ['users', '123'] }),
173
+ { name: 'Jane Doe' }
174
+ ).subscribe();
175
+
176
+ // DELETE Request
177
+ this.httpManager.deleteRequest(
178
+ ApiRequest.adapt({ path: ['users', '123'] })
179
+ ).subscribe();
180
+
181
+ // Download Request
182
+ this.httpManager.downloadRequest(
183
+ ApiRequest.adapt({
184
+ path: ['files', 'report.pdf'],
185
+ saveAs: 'my-report.pdf'
186
+ })
187
+ ).subscribe();
188
+ ```
189
+
190
+ ## Advanced Signal Patterns
191
+
192
+ ### Computed Signals for Data Transformation
193
+
194
+ ```typescript
195
+ import { computed, signal, inject } from '@angular/core';
196
+ import { HTTPManagerSignalsService, ApiRequest } from 'http-request-manager';
197
+
198
+ @Component({
199
+ template: `
200
+ <div class="dashboard">
201
+ <div class="stats">
202
+ <div class="stat-card">
203
+ <h3>Total Users</h3>
204
+ <div class="stat-value">{{ totalUsers() }}</div>
205
+ </div>
206
+ <div class="stat-card">
207
+ <h3>Active Users</h3>
208
+ <div class="stat-value">{{ activeUsers() }}</div>
209
+ </div>
210
+ <div class="stat-card">
211
+ <h3>Admins</h3>
212
+ <div class="stat-value">{{ adminUsers() }}</div>
213
+ </div>
214
+ </div>
215
+
216
+ <div class="filters">
217
+ <select (change)="setRoleFilter($any($event.target).value)">
218
+ <option value="">All Roles</option>
219
+ <option value="admin">Admin</option>
220
+ <option value="user">User</option>
221
+ </select>
222
+
223
+ <select (change)="setStatusFilter($any($event.target).value)">
224
+ <option value="">All Status</option>
225
+ <option value="active">Active</option>
226
+ <option value="inactive">Inactive</option>
227
+ </select>
228
+ </div>
229
+
230
+ <div class="user-list">
231
+ <div *ngFor="let user of filteredUsers()">
232
+ {{ user.name }} - {{ user.role }} ({{ user.status }})
233
+ </div>
234
+ </div>
235
+ </div>
236
+ `
237
+ })
238
+ export class UserDashboardComponent {
239
+ private httpManager = inject(HTTPManagerSignalsService);
240
+
241
+ // Raw data signal
242
+ rawData = this.httpManager.data;
243
+
244
+ // Filter state signals
245
+ roleFilter = signal<string>('');
246
+ statusFilter = signal<string>('');
247
+
248
+ // Computed signals
249
+ totalUsers = computed(() => this.rawData().length);
250
+
251
+ activeUsers = computed(() =>
252
+ this.rawData().filter(user => user.status === 'active').length
253
+ );
254
+
255
+ adminUsers = computed(() =>
256
+ this.rawData().filter(user => user.role === 'admin').length
257
+ );
258
+
259
+ filteredUsers = computed(() => {
260
+ const data = this.rawData();
261
+ const roleFilter = this.roleFilter();
262
+ const statusFilter = this.statusFilter();
263
+
264
+ return data.filter(user => {
265
+ const matchesRole = !roleFilter || user.role === roleFilter;
266
+ const matchesStatus = !statusFilter || user.status === statusFilter;
267
+ return matchesRole && matchesStatus;
268
+ });
269
+ });
270
+
271
+ constructor() {
272
+ this.loadUsers();
273
+ }
274
+
275
+ loadUsers() {
276
+ this.httpManager.getRequest(
277
+ ApiRequest.adapt({
278
+ path: ['users'],
279
+ adapter: User.adapt
280
+ })
281
+ ).subscribe();
282
+ }
283
+
284
+ setRoleFilter(role: string) {
285
+ this.roleFilter.set(role);
286
+ }
287
+
288
+ setStatusFilter(status: string) {
289
+ this.statusFilter.set(status);
290
+ }
291
+ }
292
+ ```
293
+
294
+ ### Effect-Based Side Effects
295
+
296
+ ```typescript
297
+ import { effect, inject } from '@angular/core';
298
+ import { HTTPManagerSignalsService, ApiRequest } from 'http-request-manager';
299
+
300
+ @Component({
301
+ template: `
302
+ <div class="notifications">
303
+ <div *ngFor="let notification of notifications()">
304
+ {{ notification.message }}
305
+ </div>
306
+ </div>
307
+
308
+ <div class="data-display">
309
+ <div *ngFor="let item of data()">
310
+ {{ item.name }}
311
+ </div>
312
+ </div>
313
+ `
314
+ })
315
+ export class NotificationComponent {
316
+ private httpManager = inject(HTTPManagerSignalsService);
317
+
318
+ data = this.httpManager.data;
319
+ error = this.httpManager.error;
320
+ isPending = this.httpManager.isPending;
321
+
322
+ // External state
323
+ notifications = signal<Array<{message: string, type: string}>>([]);
324
+
325
+ constructor() {
326
+ // Auto-load data on component init
327
+ this.loadData();
328
+
329
+ // Set up effects for side effects
330
+ this.setupEffects();
331
+ }
332
+
333
+ private setupEffects() {
334
+ // Show loading notifications
335
+ effect(() => {
336
+ if (this.isPending()) {
337
+ this.addNotification('Loading data...', 'info');
338
+ }
339
+ });
340
+
341
+ // Show error notifications
342
+ effect(() => {
343
+ const error = this.error();
344
+ if (error) {
345
+ this.addNotification(`Error: ${error.message}`, 'error');
346
+ }
347
+ });
348
+
349
+ // Auto-retry on certain errors
350
+ effect(() => {
351
+ const error = this.error();
352
+ if (error && error.status === 503) { // Service unavailable
353
+ setTimeout(() => this.loadData(), 5000); // Retry in 5s
354
+ }
355
+ });
356
+ }
357
+
358
+ loadData() {
359
+ this.httpManager.getRequest(
360
+ ApiRequest.adapt({
361
+ path: ['data'],
362
+ retry: { times: 3, delay: 2 }
363
+ })
364
+ ).subscribe();
365
+ }
366
+
367
+ private addNotification(message: string, type: string) {
368
+ const current = this.notifications();
369
+ this.notifications.set([
370
+ ...current,
371
+ { message, type }
372
+ ]);
373
+
374
+ // Auto-remove after 5 seconds
375
+ setTimeout(() => {
376
+ const updated = this.notifications().slice(1);
377
+ this.notifications.set(updated);
378
+ }, 5000);
379
+ }
380
+ }
381
+ ```
382
+
383
+ ## Migration from Observables to Signals
384
+
385
+ ### Before (Observable-based)
386
+
387
+ ```typescript
388
+ @Component({
389
+ template: `
390
+ <div *ngIf="isLoading$ | async">Loading...</div>
391
+ <div *ngFor="let user of users$ | async">
392
+ {{ user.name }}
393
+ </div>
394
+ <div *ngIf="error$ | async as error">
395
+ Error: {{ error }}
396
+ </div>
397
+ `
398
+ })
399
+ export class UserListComponent implements OnInit {
400
+ private httpManager = inject(HTTPManagerService);
401
+
402
+ users$ = this.httpManager.data$;
403
+ isLoading$ = this.httpManager.isPending$;
404
+ error$ = this.httpManager.error$;
405
+
406
+ ngOnInit() {
407
+ this.httpManager.getRequest(
408
+ ApiRequest.adapt({ path: ['users'] })
409
+ ).subscribe();
410
+ }
411
+ }
412
+ ```
413
+
414
+ ### After (Signal-based)
415
+
416
+ ```typescript
417
+ @Component({
418
+ template: `
419
+ <div *ngIf="isLoading()">Loading...</div>
420
+ <div *ngIf="data() as users">
421
+ <div *ngFor="let user of users">
422
+ {{ user.name }}
423
+ </div>
424
+ </div>
425
+ <div *ngIf="error() as error">
426
+ Error: {{ error }}
427
+ </div>
428
+ `
429
+ })
430
+ export class UserListComponent {
431
+ private httpManager = inject(HTTPManagerSignalsService);
432
+
433
+ data = this.httpManager.data;
434
+ isLoading = this.httpManager.isPending;
435
+ error = this.httpManager.error;
436
+
437
+ constructor() {
438
+ this.httpManager.getRequest(
439
+ ApiRequest.adapt({ path: ['users'] })
440
+ ).subscribe();
441
+ }
442
+ }
443
+ ```
444
+
445
+ ## Integration with Other Signal-Based Services
446
+
447
+ ### Local Storage Signals
448
+
449
+ ```typescript
450
+ import { signal, computed, inject } from '@angular/core';
451
+ import { LocalStorageSignalsManagerService } from 'http-request-manager';
452
+
453
+ @Component({
454
+ template: `
455
+ <div class="user-preferences">
456
+ <h3>Welcome, {{ userName() }}!</h3>
457
+
458
+ <div class="preferences">
459
+ <label>
460
+ Theme:
461
+ <select [value]="theme()" (change)="setTheme($any($event.target).value)">
462
+ <option value="light">Light</option>
463
+ <option value="dark">Dark</option>
464
+ </select>
465
+ </label>
466
+
467
+ <label>
468
+ Notifications:
469
+ <input type="checkbox" [checked]="notifications()"
470
+ (change)="setNotifications($any($event.target).checked)">
471
+ </label>
472
+ </div>
473
+
474
+ <div class="data-sync">
475
+ <p>Data last updated: {{ lastUpdated() }}</p>
476
+ <button (click)="refreshData()">Refresh from Server</button>
477
+ </div>
478
+ </div>
479
+ `
480
+ })
481
+ export class UserPreferencesComponent {
482
+ private httpManager = inject(HTTPManagerSignalsService);
483
+ private storage = inject(LocalStorageSignalsManagerService);
484
+
485
+ // HTTP data signals
486
+ serverData = this.httpManager.data;
487
+
488
+ // Storage signals
489
+ theme = this.storage.signal('theme', 'light');
490
+ notifications = this.storage.signal('notifications', true);
491
+ lastUpdated = this.storage.signal('lastUpdated', new Date().toISOString());
492
+
493
+ // Computed signals
494
+ userName = computed(() => {
495
+ const data = this.serverData();
496
+ return data?.user?.name || 'Guest';
497
+ });
498
+
499
+ hasUnsavedChanges = computed(() => {
500
+ // Compare local storage with server data
501
+ return this.theme() !== 'light' || this.notifications() !== true;
502
+ });
503
+
504
+ constructor() {
505
+ this.loadUserData();
506
+ this.setupAutoSync();
507
+ }
508
+
509
+ private setupAutoSync() {
510
+ // Auto-save to server when preferences change
511
+ setInterval(() => {
512
+ if (this.hasUnsavedChanges()) {
513
+ this.saveToServer();
514
+ }
515
+ }, 30000); // Every 30 seconds
516
+ }
517
+
518
+ loadUserData() {
519
+ this.httpManager.getRequest(
520
+ ApiRequest.adapt({ path: ['user', 'preferences'] })
521
+ ).subscribe();
522
+ }
523
+
524
+ setTheme(theme: string) {
525
+ this.theme.set(theme);
526
+ this.updateLastUpdated();
527
+ }
528
+
529
+ setNotifications(enabled: boolean) {
530
+ this.notifications.set(enabled);
531
+ this.updateLastUpdated();
532
+ }
533
+
534
+ private updateLastUpdated() {
535
+ this.lastUpdated.set(new Date().toISOString());
536
+ }
537
+
538
+ refreshData() {
539
+ this.loadUserData();
540
+ }
541
+
542
+ private saveToServer() {
543
+ const preferences = {
544
+ theme: this.theme(),
545
+ notifications: this.notifications(),
546
+ lastUpdated: this.lastUpdated()
547
+ };
548
+
549
+ this.httpManager.postRequest(
550
+ ApiRequest.adapt({ path: ['user', 'preferences'] }),
551
+ preferences
552
+ ).subscribe();
553
+ }
554
+ }
555
+ ```
556
+
557
+ ## Performance Considerations
558
+
559
+ ### Optimized Rendering
560
+
561
+ ```typescript
562
+ import { trackByFn } from '@angular/core';
563
+
564
+ @Component({
565
+ template: `
566
+ <div *ngFor="let user; trackBy: trackByUserId">
567
+ {{ user.name }}
568
+ </div>
569
+ `
570
+ })
571
+ export class OptimizedComponent {
572
+ private httpManager = inject(HTTPManagerSignalsService);
573
+ data = this.httpManager.data;
574
+
575
+ trackByUserId = (index: number, user: any) => user.id;
576
+ }
577
+ ```
578
+
579
+ ### Efficient Computed Signals
580
+
581
+ ```typescript
582
+ // ✅ Good - Efficient computed
583
+ filteredData = computed(() => {
584
+ return this.data().filter(item => item.active);
585
+ });
586
+
587
+ // ❌ Avoid - Inefficient computed
588
+ allData = computed(() => this.data());
589
+ activeData = computed(() => this.allData().filter(item => item.active));
590
+ ```
591
+
592
+ ## Best Practices
593
+
594
+ ### 1. Signal Initialization
595
+
596
+ ```typescript
597
+ // ✅ Good
598
+ data = this.httpManager.data;
599
+ isLoading = this.httpManager.isPending;
600
+
601
+ // ❌ Avoid
602
+ data = signal<any[]>([]);
603
+ isLoading = signal(false);
604
+ ```
605
+
606
+ ### 2. Computed Signal Usage
607
+
608
+ ```typescript
609
+ // ✅ Good
610
+ userCount = computed(() => this.data().length);
611
+
612
+ // ❌ Avoid
613
+ getUserCount() {
614
+ return this.data().length; // Called on every change detection
615
+ }
616
+ ```
617
+
618
+ ### 3. Effect Cleanup
619
+
620
+ ```typescript
621
+ import { effect, inject, OnDestroy } from '@angular/core';
622
+
623
+ @Component({ template: '...' })
624
+ export class MyComponent implements OnDestroy {
625
+ private httpManager = inject(HTTPManagerSignalsService);
626
+ private cleanup?: () => void;
627
+
628
+ constructor() {
629
+ // Store cleanup function
630
+ this.setupEffects();
631
+ }
632
+
633
+ private setupEffects() {
634
+ const stopEffect = effect(() => {
635
+ console.log('Data changed:', this.httpManager.data());
636
+ });
637
+
638
+ this.cleanup = stopEffect;
639
+ }
640
+
641
+ ngOnDestroy() {
642
+ if (this.cleanup) {
643
+ this.cleanup();
644
+ }
645
+ }
646
+ }
647
+ ```
648
+
649
+ ## Related Documentation
650
+
651
+ - [HTTP Manager Service](http-manager/README.md)
652
+ - [HTTP State Service](http-state/README.md)
653
+ - [Local Storage Signals](local-storage/README.md)
654
+ - [Angular Signals Documentation](https://angular.io/guide/signals)