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.
- package/ARCHITECTURE.md +483 -0
- package/DATABASE_README.md +1176 -0
- package/HTTP_MANAGER_README.md +579 -0
- package/HTTP_SINGNALS_MANAGER_README.md +654 -0
- package/HTTP_STATE_MANAGER_README.md +948 -0
- package/INTERCEPTOR_README.md +549 -0
- package/LOCAL_STORAGE_README.md +1056 -0
- package/STORE_STATE_MANAGER_README.md +1322 -0
- package/UTILS_README.md +1186 -0
- package/WS_MANAGER_README.md +613 -0
- package/ng-package.json +8 -0
- package/package.json +1 -12
- package/src/lib/http-request-manager.module.ts +132 -0
- package/src/lib/http-request-services-demo/database-data-demo/database-data-demo.component.html +65 -0
- package/src/lib/http-request-services-demo/database-data-demo/database-data-demo.component.scss +0 -0
- package/src/lib/http-request-services-demo/database-data-demo/database-data-demo.component.ts +224 -0
- package/src/lib/http-request-services-demo/http-request-services-demo.component.html +114 -0
- package/src/lib/http-request-services-demo/http-request-services-demo.component.scss +6 -0
- package/src/lib/http-request-services-demo/http-request-services-demo.component.ts +52 -0
- package/src/lib/http-request-services-demo/local-storage-demo/local-storage-demo.component.html +195 -0
- package/src/lib/http-request-services-demo/local-storage-demo/local-storage-demo.component.scss +17 -0
- package/src/lib/http-request-services-demo/local-storage-demo/local-storage-demo.component.ts +206 -0
- package/src/lib/http-request-services-demo/local-storage-signals-demo/local-storage-signals-demo.component.html +200 -0
- package/src/lib/http-request-services-demo/local-storage-signals-demo/local-storage-signals-demo.component.scss +17 -0
- package/src/lib/http-request-services-demo/local-storage-signals-demo/local-storage-signals-demo.component.ts +212 -0
- package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/download-file/download-file.component.html +53 -0
- package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/download-file/download-file.component.scss +60 -0
- package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/download-file/download-file.component.ts +72 -0
- package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/file-download.module.ts +28 -0
- package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/file-downloader.component.html +10 -0
- package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/file-downloader.component.scss +29 -0
- package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/file-downloader.component.ts +100 -0
- package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/models/download-labels-model.ts +22 -0
- package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/spinner/spinner.component.html +8 -0
- package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/spinner/spinner.component.scss +19 -0
- package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/spinner/spinner.component.ts +26 -0
- package/src/lib/http-request-services-demo/request-manager-demo/models/app-session.model.ts +30 -0
- package/src/lib/http-request-services-demo/request-manager-demo/models/app.model.ts +19 -0
- package/src/lib/http-request-services-demo/request-manager-demo/models/get-sample.model.ts +25 -0
- package/src/lib/http-request-services-demo/request-manager-demo/models/sample-ai-prompt.ts +19 -0
- package/src/lib/http-request-services-demo/request-manager-demo/models/sample-client-details.ts +24 -0
- package/src/lib/http-request-services-demo/request-manager-demo/models/sample-client-info.ts +30 -0
- package/src/lib/http-request-services-demo/request-manager-demo/models/sample-client.model.ts +49 -0
- package/src/lib/http-request-services-demo/request-manager-demo/models/sample-mapper-client-info.ts +33 -0
- package/src/lib/http-request-services-demo/request-manager-demo/request-manager-demo.component.html +392 -0
- package/src/lib/http-request-services-demo/request-manager-demo/request-manager-demo.component.scss +24 -0
- package/src/lib/http-request-services-demo/request-manager-demo/request-manager-demo.component.ts +461 -0
- package/src/lib/http-request-services-demo/request-manager-state-demo/request-manager-state-demo.component.html +393 -0
- package/src/lib/http-request-services-demo/request-manager-state-demo/request-manager-state-demo.component.scss +24 -0
- package/src/lib/http-request-services-demo/request-manager-state-demo/request-manager-state-demo.component.ts +421 -0
- package/src/lib/http-request-services-demo/request-manager-state-demo/services/state-manager-demo.service.ts +87 -0
- package/src/lib/http-request-services-demo/request-manager-ws-demo/components/services/state-data-request.service.ts +120 -0
- package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-ai-messaging/ws-ai-messaging.component.css +0 -0
- package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-ai-messaging/ws-ai-messaging.component.html +3 -0
- package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-ai-messaging/ws-ai-messaging.component.ts +16 -0
- package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-chats/ws-chats.component.css +0 -0
- package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-chats/ws-chats.component.html +3 -0
- package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-chats/ws-chats.component.ts +16 -0
- package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-data-control/ws-data-control.component.css +31 -0
- package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-data-control/ws-data-control.component.html +72 -0
- package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-data-control/ws-data-control.component.scss +41 -0
- package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-data-control/ws-data-control.component.spec.ts +205 -0
- package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-data-control/ws-data-control.component.ts +77 -0
- package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-messaging/ws-messaging.component.css +11 -0
- package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-messaging/ws-messaging.component.html +96 -0
- package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-messaging/ws-messaging.component.spec.ts +31 -0
- package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-messaging/ws-messaging.component.ts +229 -0
- package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-notifications/ws-notifications.component.css +30 -0
- package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-notifications/ws-notifications.component.html +172 -0
- package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-notifications/ws-notifications.component.spec.ts +31 -0
- package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-notifications/ws-notifications.component.ts +239 -0
- package/src/lib/http-request-services-demo/request-manager-ws-demo/models/oidc-client.model.ts +31 -0
- package/src/lib/http-request-services-demo/request-manager-ws-demo/models/user-data.model.ts +32 -0
- package/src/lib/http-request-services-demo/request-manager-ws-demo/request-manager-ws-demo.component.css +0 -0
- package/src/lib/http-request-services-demo/request-manager-ws-demo/request-manager-ws-demo.component.html +84 -0
- package/src/lib/http-request-services-demo/request-manager-ws-demo/request-manager-ws-demo.component.ts +41 -0
- package/src/lib/http-request-services-demo/request-manager-ws-demo/services/index.ts +3 -0
- package/src/lib/http-request-services-demo/request-manager-ws-demo/services/message-service-demo.service.ts +83 -0
- package/src/lib/http-request-services-demo/request-manager-ws-demo/services/notification-service-demo.service.ts +147 -0
- package/src/lib/http-request-services-demo/request-manager-ws-demo/services/state-service-demo.service.ts +158 -0
- package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/download-file/download-file.component.html +53 -0
- package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/download-file/download-file.component.scss +60 -0
- package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/download-file/download-file.component.ts +72 -0
- package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/file-download.module.ts +28 -0
- package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/file-downloader.component.html +10 -0
- package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/file-downloader.component.scss +29 -0
- package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/file-downloader.component.ts +100 -0
- package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/models/download-labels-model.ts +22 -0
- package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/spinner/spinner.component.html +8 -0
- package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/spinner/spinner.component.scss +19 -0
- package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/spinner/spinner.component.ts +26 -0
- package/src/lib/http-request-services-demo/request-signals-manager-demo/models/app-session.model.ts +30 -0
- package/src/lib/http-request-services-demo/request-signals-manager-demo/models/app.model.ts +19 -0
- package/src/lib/http-request-services-demo/request-signals-manager-demo/models/get-sample.model.ts +25 -0
- package/src/lib/http-request-services-demo/request-signals-manager-demo/models/sample-ai-prompt.ts +19 -0
- package/src/lib/http-request-services-demo/request-signals-manager-demo/models/sample-client-details.ts +24 -0
- package/src/lib/http-request-services-demo/request-signals-manager-demo/models/sample-client-info.ts +30 -0
- package/src/lib/http-request-services-demo/request-signals-manager-demo/models/sample-client.model.ts +49 -0
- package/src/lib/http-request-services-demo/request-signals-manager-demo/models/sample-mapper-client-info.ts +33 -0
- package/src/lib/http-request-services-demo/request-signals-manager-demo/request-signals-manager-demo.component.html +380 -0
- package/src/lib/http-request-services-demo/request-signals-manager-demo/request-signals-manager-demo.component.scss +24 -0
- package/src/lib/http-request-services-demo/request-signals-manager-demo/request-signals-manager-demo.component.ts +410 -0
- package/src/lib/http-request-services-demo/store-state-manager-demo/models/settings.model.ts +28 -0
- package/src/lib/http-request-services-demo/store-state-manager-demo/services/settings-state.service.ts +48 -0
- package/src/lib/http-request-services-demo/store-state-manager-demo/store-state-manager-demo.component.css +0 -0
- package/src/lib/http-request-services-demo/store-state-manager-demo/store-state-manager-demo.component.html +23 -0
- package/src/lib/http-request-services-demo/store-state-manager-demo/store-state-manager-demo.component.ts +36 -0
- package/src/lib/index.ts +3 -0
- package/src/lib/interceptors/credentials.interceptor.ts +16 -0
- package/src/lib/interceptors/index.ts +6 -0
- package/src/lib/interceptors/models/error-settings.model.ts +22 -0
- package/src/lib/interceptors/models/index.ts +2 -0
- package/src/lib/interceptors/proxy-debugger.interceptor.ts +46 -0
- package/src/lib/interceptors/request-error.interceptor.ts +65 -0
- package/src/lib/interceptors/request-header.interceptor.ts +53 -0
- package/src/lib/models/config-http-options.model.ts +42 -0
- package/src/lib/models/config-local-storage-options.model.ts +27 -0
- package/src/lib/models/config-options.model.ts +27 -0
- package/src/lib/models/config-token.model.ts +9 -0
- package/src/lib/models/data-type.enum.ts +5 -0
- package/src/lib/models/database-storage.model.ts +24 -0
- package/src/lib/models/index.ts +12 -0
- package/src/lib/models/retry-options.model.ts +22 -0
- package/src/lib/services/database-manager-service/database.manager.service.ts +262 -0
- package/src/lib/services/database-manager-service/db.storage.service.ts +207 -0
- package/src/lib/services/database-manager-service/index.ts +4 -0
- package/src/lib/services/database-manager-service/models/index.ts +2 -0
- package/src/lib/services/database-manager-service/models/table-schema.ts +33 -0
- package/src/lib/services/index.ts +12 -0
- package/src/lib/services/local-storage-manager-service/index.ts +4 -0
- package/src/lib/services/local-storage-manager-service/local-storage-manager.service.spec.ts +71 -0
- package/src/lib/services/local-storage-manager-service/local-storage-manager.service.ts +426 -0
- package/src/lib/services/local-storage-manager-service/local-storage-signals-manager.service.spec.ts +67 -0
- package/src/lib/services/local-storage-manager-service/local-storage-signals-manager.service.ts +345 -0
- package/src/lib/services/local-storage-manager-service/models/global-store-options.model.ts +30 -0
- package/src/lib/services/local-storage-manager-service/models/index.ts +6 -0
- package/src/lib/services/local-storage-manager-service/models/setting-options.model.ts +35 -0
- package/src/lib/services/local-storage-manager-service/models/storage-data.model.ts +24 -0
- package/src/lib/services/local-storage-manager-service/models/storage-option.model.ts +32 -0
- package/src/lib/services/local-storage-manager-service/models/storage-type.enum.ts +5 -0
- package/src/lib/services/request-manager-services/README.md +268 -0
- package/src/lib/services/request-manager-services/http-manager-signals.service.ts +246 -0
- package/src/lib/services/request-manager-services/http-manager.service.spec.ts +232 -0
- package/src/lib/services/request-manager-services/http-manager.service.ts +274 -0
- package/src/lib/services/request-manager-services/index.ts +8 -0
- package/src/lib/services/request-manager-services/request-signals.service.ts +214 -0
- package/src/lib/services/request-manager-services/request.service.ts +309 -0
- package/src/lib/services/request-manager-services/rxjs-operators/countdown.ts +17 -0
- package/src/lib/services/request-manager-services/rxjs-operators/delay-retry.ts +16 -0
- package/src/lib/services/request-manager-services/rxjs-operators/index.ts +4 -0
- package/src/lib/services/request-manager-services/rxjs-operators/request-polling.ts +35 -0
- package/src/lib/services/request-manager-services/rxjs-operators/request-streaming.ts +436 -0
- package/src/lib/services/request-manager-state-service/http-manager-state.store.ts +1321 -0
- package/src/lib/services/request-manager-state-service/index.ts +3 -0
- package/src/lib/services/request-manager-state-service/models/api-request.model.ts +61 -0
- package/src/lib/services/request-manager-state-service/models/index.ts +6 -0
- package/src/lib/services/request-manager-state-service/models/request-options.model.ts +22 -0
- package/src/lib/services/request-manager-state-service/models/stream-type.enum.ts +13 -0
- package/src/lib/services/request-manager-state-service/models/ws-options.model.ts +39 -0
- package/src/lib/services/store-state-manager-service/index.ts +3 -0
- package/src/lib/services/store-state-manager-service/models/index.ts +2 -0
- package/src/lib/services/store-state-manager-service/models/state-storage-options.model.ts +24 -0
- package/src/lib/services/store-state-manager-service/store-state-manager.service.ts +88 -0
- package/src/lib/services/utils/app.service.spec.ts +25 -0
- package/src/lib/services/utils/app.service.ts +21 -0
- package/src/lib/services/utils/encryption/README.md +79 -0
- package/src/lib/services/utils/encryption/asymmetrical-encryption.service.ts +282 -0
- package/src/lib/services/utils/encryption/encryption-test.service.ts +39 -0
- package/src/lib/services/utils/encryption/index.ts +5 -0
- package/src/lib/services/utils/encryption/random.ts +81 -0
- package/src/lib/services/utils/encryption/symmetrical-encryption.service.ts +93 -0
- package/src/lib/services/utils/headers.service.spec.ts +80 -0
- package/src/lib/services/utils/headers.service.ts +18 -0
- package/src/lib/services/utils/index.ts +7 -0
- package/src/lib/services/utils/object-merger.service.spec.ts +18 -0
- package/src/lib/services/utils/object-merger.service.ts +78 -0
- package/src/lib/services/utils/path-query.service.spec.ts +117 -0
- package/src/lib/services/utils/path-query.service.ts +69 -0
- package/src/lib/services/utils/random-color.utils.ts +83 -0
- package/src/lib/services/utils/utils.service.spec.ts +165 -0
- package/src/lib/services/utils/utils.service.ts +192 -0
- package/src/lib/services/ws-manager-service/index.ts +4 -0
- package/src/lib/services/ws-manager-service/models/channel-info.model.ts +24 -0
- package/src/lib/services/ws-manager-service/models/channel-message-data.model.ts +24 -0
- package/src/lib/services/ws-manager-service/models/channel-message.model.ts +24 -0
- package/src/lib/services/ws-manager-service/models/communication-type.enum.ts +5 -0
- package/src/lib/services/ws-manager-service/models/index.ts +5 -0
- package/src/lib/services/ws-manager-service/models/ws-user.model.ts +38 -0
- package/src/lib/services/ws-manager-service/services/index.ts +3 -0
- package/src/lib/services/ws-manager-service/services/websocket.service.ts +392 -0
- package/src/public-api.ts +14 -0
- package/tsconfig.lib.json +32 -0
- package/tsconfig.lib.prod.json +10 -0
- package/tsconfig.spec.json +14 -0
- package/fesm2022/http-request-manager.mjs +0 -7634
- package/fesm2022/http-request-manager.mjs.map +0 -1
- package/http-request-manager-18.7.19.tgz +0 -0
- 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)
|