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.
- 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 -7633
- package/fesm2022/http-request-manager.mjs.map +0 -1
- package/types/http-request-manager.d.ts +0 -2277
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generate a random hex color code
|
|
3
|
+
* @returns A random hex color string (e.g., "#FF5733")
|
|
4
|
+
*/
|
|
5
|
+
export const RandomHexColor = (): string => {
|
|
6
|
+
// Generate a random number between 0 and 16777215 (0xFFFFFF)
|
|
7
|
+
const randomColor = Math.floor(Math.random() * 16777215);
|
|
8
|
+
// Convert to hexadecimal and pad with zeros to ensure 6 digits
|
|
9
|
+
const hexColor = randomColor.toString(16).padStart(6, '0');
|
|
10
|
+
// Return with # prefix
|
|
11
|
+
return `#${hexColor}`;
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Generate a random hex color with constraints to ensure good visibility
|
|
16
|
+
* @param options Optional constraints for color generation
|
|
17
|
+
* @returns A random hex color string with good contrast
|
|
18
|
+
*/
|
|
19
|
+
export const RandomVisibleColor = (options?: {
|
|
20
|
+
minBrightness?: number; // Minimum brightness (0-255), default: 50
|
|
21
|
+
maxBrightness?: number; // Maximum brightness (0-255), default: 200
|
|
22
|
+
}): string => {
|
|
23
|
+
const minBrightness = options?.minBrightness ?? 50;
|
|
24
|
+
const maxBrightness = options?.maxBrightness ?? 200;
|
|
25
|
+
|
|
26
|
+
// Generate RGB values within the specified brightness range
|
|
27
|
+
const r = Math.floor(Math.random() * (maxBrightness - minBrightness) + minBrightness);
|
|
28
|
+
const g = Math.floor(Math.random() * (maxBrightness - minBrightness) + minBrightness);
|
|
29
|
+
const b = Math.floor(Math.random() * (maxBrightness - minBrightness) + minBrightness);
|
|
30
|
+
|
|
31
|
+
// Convert to hex and pad with zeros
|
|
32
|
+
const toHex = (n: number) => n.toString(16).padStart(2, '0');
|
|
33
|
+
return `#${toHex(r)}${toHex(g)}${toHex(b)}`;
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Generate a random color from a predefined palette
|
|
38
|
+
* @returns A hex color from a set of visually distinct colors
|
|
39
|
+
*/
|
|
40
|
+
export const RandomPaletteColor = (): string => {
|
|
41
|
+
const colorPalette = [
|
|
42
|
+
'#FF6B6B', // Coral
|
|
43
|
+
'#4ECDC4', // Turquoise
|
|
44
|
+
'#45B7D1', // Sky Blue
|
|
45
|
+
'#FFBE0B', // Amber
|
|
46
|
+
'#FB5607', // Orange
|
|
47
|
+
'#8338EC', // Violet
|
|
48
|
+
'#3A86FF', // Azure
|
|
49
|
+
'#38B000', // Green
|
|
50
|
+
'#9D4EDD', // Purple
|
|
51
|
+
'#FF006E', // Pink
|
|
52
|
+
'#0077B6', // Blue
|
|
53
|
+
'#2A9D8F' // Teal
|
|
54
|
+
];
|
|
55
|
+
|
|
56
|
+
const randomIndex = Math.floor(Math.random() * colorPalette.length);
|
|
57
|
+
return colorPalette[randomIndex];
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Generate a random HSL color
|
|
62
|
+
* @param options Optional constraints for HSL generation
|
|
63
|
+
* @returns A random HSL color string (e.g., "hsl(120, 100%, 50%)")
|
|
64
|
+
*/
|
|
65
|
+
export const RandomHSLColor = (options?: {
|
|
66
|
+
saturation?: [number, number]; // Saturation range (0-100), default: [50, 100]
|
|
67
|
+
lightness?: [number, number]; // Lightness range (0-100), default: [40, 80]
|
|
68
|
+
}): string => {
|
|
69
|
+
// Full range for hue (0-360)
|
|
70
|
+
const hue = Math.floor(Math.random() * 361);
|
|
71
|
+
|
|
72
|
+
// Default or custom saturation range
|
|
73
|
+
const satMin = options?.saturation?.[0] ?? 50;
|
|
74
|
+
const satMax = options?.saturation?.[1] ?? 100;
|
|
75
|
+
const saturation = Math.floor(Math.random() * (satMax - satMin + 1) + satMin);
|
|
76
|
+
|
|
77
|
+
// Default or custom lightness range
|
|
78
|
+
const lightMin = options?.lightness?.[0] ?? 40;
|
|
79
|
+
const lightMax = options?.lightness?.[1] ?? 80;
|
|
80
|
+
const lightness = Math.floor(Math.random() * (lightMax - lightMin + 1) + lightMin);
|
|
81
|
+
|
|
82
|
+
return `hsl(${hue}, ${saturation}%, ${lightness}%)`;
|
|
83
|
+
};
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
import { TestBed } from '@angular/core/testing';
|
|
2
|
+
import { HttpTestingController, provideHttpClientTesting } from '@angular/common/http/testing';
|
|
3
|
+
import { UtilsService } from './utils.service';
|
|
4
|
+
import { provideHttpClient, withInterceptorsFromDi } from '@angular/common/http';
|
|
5
|
+
|
|
6
|
+
describe('UtilsService', () => {
|
|
7
|
+
let service: UtilsService;
|
|
8
|
+
let httpMock: HttpTestingController;
|
|
9
|
+
|
|
10
|
+
beforeEach(() => {
|
|
11
|
+
TestBed.configureTestingModule({
|
|
12
|
+
imports: [],
|
|
13
|
+
providers: [UtilsService, provideHttpClient(withInterceptorsFromDi()), provideHttpClientTesting()]
|
|
14
|
+
});
|
|
15
|
+
service = TestBed.inject(UtilsService);
|
|
16
|
+
httpMock = TestBed.inject(HttpTestingController);
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
afterEach(() => {
|
|
20
|
+
httpMock.verify();
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
it('should be created', () => {
|
|
24
|
+
expect(service).toBeTruthy();
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
describe('Type Checks and JSON Conversions', () => {
|
|
28
|
+
it('should check string and object types', () => {
|
|
29
|
+
expect(service.isString('test')).toBeTrue();
|
|
30
|
+
expect(service.isString(123)).toBeFalse();
|
|
31
|
+
expect(service.isObject({})).toBeTrue();
|
|
32
|
+
expect(service.isObject('test')).toBeFalse();
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
it('should convert between JSON and string', () => {
|
|
36
|
+
const obj = { key: 'value' };
|
|
37
|
+
const jsonString = '{"key":"value"}';
|
|
38
|
+
expect(service.JSONToString(obj)).toBe(JSON.stringify(obj));
|
|
39
|
+
expect(service.JSONToString('test')).toBe('test');
|
|
40
|
+
expect(service.stringToJSON(jsonString)).toEqual(JSON.parse(jsonString));
|
|
41
|
+
expect(service.stringToJSON('test')).toBe('test');
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
it('should check if a string is valid JSON', () => {
|
|
45
|
+
expect(service.isJSON('{"key":"value"}')).toBeTrue();
|
|
46
|
+
expect(service.isJSON('not json')).toBeFalse();
|
|
47
|
+
});
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
describe('Object Access and Comparison', () => {
|
|
51
|
+
it('should return property value and compare objects', () => {
|
|
52
|
+
const obj = { key: 'value' };
|
|
53
|
+
expect(service.getValueByProp(obj, 'key')).toBe('value');
|
|
54
|
+
expect(service.getValueByProp(undefined, 'key')).toBeFalse();
|
|
55
|
+
|
|
56
|
+
const obj1 = { key: 'value', nested: { a: 1 } };
|
|
57
|
+
const obj2 = { key: 'value', nested: { a: 1 } };
|
|
58
|
+
const obj3 = { key: 'value', nested: { a: 2 } };
|
|
59
|
+
expect(service.objectsEqual(obj1, obj2)).toBeTrue();
|
|
60
|
+
expect(service.objectsEqual(obj1, obj3)).toBeFalse();
|
|
61
|
+
});
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
describe('HTTP and Getter', () => {
|
|
65
|
+
it('should obtain JSON from file', () => {
|
|
66
|
+
const dummyData = { key: 'value' };
|
|
67
|
+
service.getJSON('test.json').subscribe(data => {
|
|
68
|
+
expect(data).toEqual(dummyData);
|
|
69
|
+
});
|
|
70
|
+
const req = httpMock.expectOne('assets/data/test.json');
|
|
71
|
+
expect(req.request.method).toBe('GET');
|
|
72
|
+
req.flush(dummyData);
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
it('should return current time from today getter', () => {
|
|
76
|
+
const nowInSec = new Date().getMilliseconds() / 1000;
|
|
77
|
+
expect(service.today).toBeCloseTo(nowInSec, 0);
|
|
78
|
+
});
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
describe('Conversion Methods', () => {
|
|
82
|
+
it('should convert base32 to hex (simple case)', () => {
|
|
83
|
+
// For "A", expecting "0".
|
|
84
|
+
expect(service.base32ToHex('A')).toBe('0');
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
it('should convert binary to hex with 32-character padding', () => {
|
|
88
|
+
/* For the binary representation of "Hello":
|
|
89
|
+
H -> 01001000
|
|
90
|
+
e -> 01100101
|
|
91
|
+
l -> 01101100
|
|
92
|
+
l -> 01101100
|
|
93
|
+
o -> 01101111
|
|
94
|
+
-> Hex: "48656c6c6f"
|
|
95
|
+
Padded (22 zeros in front): "00000000000000000000000048656c6c6f"
|
|
96
|
+
*/
|
|
97
|
+
const binary = '0100100001100101011011000110110001101111';
|
|
98
|
+
const expected = '000000000000000000000048656c6c6f';
|
|
99
|
+
expect(service.binaryToHex(binary)).toBe(expected);
|
|
100
|
+
});
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
describe('Expiry Calculations', () => {
|
|
104
|
+
// Helper to test expiry() returns a value close to now + (multiplier)
|
|
105
|
+
function expectExpiryClose(input: string, multiplier: number) {
|
|
106
|
+
const now = Math.floor(new Date().getTime() / 1000);
|
|
107
|
+
const expiry = service.expires(input);
|
|
108
|
+
expect(expiry).toBeGreaterThanOrEqual(now + multiplier - 1);
|
|
109
|
+
expect(expiry).toBeLessThanOrEqual(now + multiplier + 1);
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
it('should calculate expiry for various time units', () => {
|
|
113
|
+
expectExpiryClose("1y", 31556926);
|
|
114
|
+
expectExpiryClose("1m", 2629743);
|
|
115
|
+
expectExpiryClose("1w", 604800);
|
|
116
|
+
expectExpiryClose("1d", 86400);
|
|
117
|
+
expectExpiryClose("1hr", 3600);
|
|
118
|
+
expectExpiryClose("1mn", 60);
|
|
119
|
+
expectExpiryClose("1s", 1);
|
|
120
|
+
});
|
|
121
|
+
|
|
122
|
+
it('should return undefined for missing expiry string', () => {
|
|
123
|
+
expect(service.expires()).toBeUndefined();
|
|
124
|
+
});
|
|
125
|
+
|
|
126
|
+
it('should indicate if expired', () => {
|
|
127
|
+
const now = Math.floor(new Date().getTime() / 1000);
|
|
128
|
+
expect(service.hasExpired(now - 10)).toBeTrue();
|
|
129
|
+
expect(service.hasExpired(now + 10)).toBeFalse();
|
|
130
|
+
expect(service.hasExpired(0)).toBeFalse();
|
|
131
|
+
});
|
|
132
|
+
|
|
133
|
+
it('should check setting for expiry', () => {
|
|
134
|
+
const settingWithExpiry = { expires: 1234567890 };
|
|
135
|
+
const settingWithoutExpiry = { key: 'value' };
|
|
136
|
+
expect(service.hasExpiry(settingWithExpiry)).toBeTrue();
|
|
137
|
+
expect(service.hasExpiry(settingWithoutExpiry)).toBeFalse();
|
|
138
|
+
});
|
|
139
|
+
|
|
140
|
+
it('should return a formatted string for future expiry dates', () => {
|
|
141
|
+
const now = Math.floor(new Date().getTime() / 1000);
|
|
142
|
+
const future = now + 10000;
|
|
143
|
+
const result = service.expiresIn(future);
|
|
144
|
+
expect(typeof result).toBe('string');
|
|
145
|
+
expect(result).toBeDefined();
|
|
146
|
+
expect(result!.length).toBeGreaterThan(0);
|
|
147
|
+
// Expect one of the time unit labels in the formatted result.
|
|
148
|
+
expect(result).toMatch(/(y|m|w|d|h|min|s)/);
|
|
149
|
+
});
|
|
150
|
+
|
|
151
|
+
it('should return "Expired" for past or current expiry dates', () => {
|
|
152
|
+
const now = Math.floor(new Date().getTime() / 1000);
|
|
153
|
+
expect(service.expiresIn(now - 1)).toBe("Expired");
|
|
154
|
+
expect(service.expiresIn(now)).toBe("Expired");
|
|
155
|
+
});
|
|
156
|
+
});
|
|
157
|
+
|
|
158
|
+
describe('String Conversion', () => {
|
|
159
|
+
it('should convert string to lowercase with underscores', () => {
|
|
160
|
+
const input = 'Hello, World!';
|
|
161
|
+
// Expected conversion: remove punctuation, convert to lowercase, replace spaces with underscores.
|
|
162
|
+
expect(service.lc(input)).toBe('hello_world');
|
|
163
|
+
});
|
|
164
|
+
});
|
|
165
|
+
});
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
|
|
2
|
+
import { HttpClient } from '@angular/common/http';
|
|
3
|
+
import { Injectable, inject } from '@angular/core';
|
|
4
|
+
|
|
5
|
+
@Injectable({
|
|
6
|
+
providedIn: 'root'
|
|
7
|
+
})
|
|
8
|
+
export class UtilsService {
|
|
9
|
+
|
|
10
|
+
http = inject(HttpClient)
|
|
11
|
+
|
|
12
|
+
constructor() { }
|
|
13
|
+
|
|
14
|
+
isString(x: string | number) {
|
|
15
|
+
return Object.prototype.toString.call(x) === '[object String]'
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
isObject(obj: any) {
|
|
19
|
+
return Object.prototype.toString.call(obj) === '[object Object]'
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
JSONToString(value: any) {
|
|
23
|
+
return (this.isObject(value)) ? JSON.stringify(value) : value
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
stringToJSON(value: string) {
|
|
27
|
+
return (this.isJSON(value)) ? JSON.parse(value) : value
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
isJSON(str: any) {
|
|
31
|
+
try {
|
|
32
|
+
JSON.parse(str)
|
|
33
|
+
} catch (e) {
|
|
34
|
+
return false
|
|
35
|
+
}
|
|
36
|
+
return true
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
getValueByProp(obj: any, prop: string) {
|
|
40
|
+
if(typeof obj === 'undefined') return false
|
|
41
|
+
return obj[prop]
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
objectsEqual(x: any, y: any): boolean {
|
|
45
|
+
|
|
46
|
+
const ok = Object.keys, tx = typeof x, ty = typeof y
|
|
47
|
+
|
|
48
|
+
return x && y && tx === 'object' && tx === ty ? (
|
|
49
|
+
ok(x).length === ok(y).length &&
|
|
50
|
+
ok(x).every((key: any) => this.objectsEqual(x[key], y[key]))
|
|
51
|
+
) : (x === y)
|
|
52
|
+
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
getJSON(file: string) {
|
|
56
|
+
return this.http.get(`assets/data/${file}`)
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
get today() {
|
|
60
|
+
return new Date().getMilliseconds() / 1000
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
base32ToHex(base32: string): string {
|
|
64
|
+
|
|
65
|
+
const base32chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567"
|
|
66
|
+
|
|
67
|
+
const charToValue = (char: string) => base32chars.indexOf(char.toUpperCase())
|
|
68
|
+
|
|
69
|
+
let bits = ''
|
|
70
|
+
let hex = ''
|
|
71
|
+
|
|
72
|
+
for (let i = 0; i < base32.length; i++) {
|
|
73
|
+
const val = charToValue(base32.charAt(i))
|
|
74
|
+
bits += val.toString(2).padStart(5, '0')
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
for (let i = 0; i + 4 <= bits.length; i += 4) {
|
|
78
|
+
const chunk = bits.substr(i, 4)
|
|
79
|
+
hex += parseInt(chunk, 2).toString(16)
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
return hex.toUpperCase()
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
binaryToHex(binary: string): string {
|
|
86
|
+
let hex = '';
|
|
87
|
+
for (let i = 0; i < binary.length; i += 8) {
|
|
88
|
+
const byte = binary.substr(i, 8);
|
|
89
|
+
const decimal = parseInt(byte, 2);
|
|
90
|
+
hex += decimal.toString(16).padStart(2, '0');
|
|
91
|
+
}
|
|
92
|
+
return hex.padStart(32, '0').substr(0, 32);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
// y = years, m = months, w = weeks, d = days, hr = hours, mn = minutes else seconds
|
|
96
|
+
// returns epoch time corresponding to the expiry type
|
|
97
|
+
expires(str?: string) {
|
|
98
|
+
|
|
99
|
+
if(!str) return undefined
|
|
100
|
+
|
|
101
|
+
const match = str.match(/[^0-9]+$/)
|
|
102
|
+
|
|
103
|
+
const type = (match) ? str.slice(-match[0].length) : 0
|
|
104
|
+
|
|
105
|
+
const now = Math.floor(new Date().getTime() / 1000)
|
|
106
|
+
|
|
107
|
+
let value = 0;
|
|
108
|
+
|
|
109
|
+
switch (type) {
|
|
110
|
+
case
|
|
111
|
+
'y':
|
|
112
|
+
const years = parseInt(str.slice(0, -1))
|
|
113
|
+
value = now + (years * 31556926)
|
|
114
|
+
break;
|
|
115
|
+
case
|
|
116
|
+
'm':
|
|
117
|
+
const months = parseInt(str.slice(0, -1))
|
|
118
|
+
value = now + (months * 2629743)
|
|
119
|
+
break;
|
|
120
|
+
case
|
|
121
|
+
'w':
|
|
122
|
+
const weeks = parseInt(str.slice(0, -1))
|
|
123
|
+
value = now + (weeks * 604800)
|
|
124
|
+
break;
|
|
125
|
+
case
|
|
126
|
+
'd':
|
|
127
|
+
const days = parseInt(str.slice(0, -1))
|
|
128
|
+
value = now + (days * 86400)
|
|
129
|
+
break;
|
|
130
|
+
case
|
|
131
|
+
'hr':
|
|
132
|
+
const hrs = parseInt(str.slice(0, -2))
|
|
133
|
+
value = now + (hrs * 3600)
|
|
134
|
+
break;
|
|
135
|
+
case
|
|
136
|
+
'mn':
|
|
137
|
+
const min = parseInt(str.slice(0, -2))
|
|
138
|
+
value = now + (min * 60)
|
|
139
|
+
break;
|
|
140
|
+
default: //seconds
|
|
141
|
+
const sec = parseInt(str.slice(0, -1))
|
|
142
|
+
value = now + sec
|
|
143
|
+
break;
|
|
144
|
+
}
|
|
145
|
+
return value;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
hasExpired(expiryDate: number): boolean {
|
|
149
|
+
if (!expiryDate || expiryDate === 0) return false
|
|
150
|
+
const currentTime = Math.floor(new Date().getTime() / 1000)
|
|
151
|
+
return expiryDate < currentTime
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
hasExpiry(setting: any) {
|
|
155
|
+
return (setting?.expires) ? true : false
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
expiresIn(expiryDate: number) {
|
|
159
|
+
|
|
160
|
+
if (!expiryDate) return;
|
|
161
|
+
|
|
162
|
+
const now = Math.floor(new Date().getTime() / 1000);
|
|
163
|
+
let diff = expiryDate - now;
|
|
164
|
+
|
|
165
|
+
if (diff <= 0) return "Expired";
|
|
166
|
+
|
|
167
|
+
const units = [
|
|
168
|
+
{ label: 'y', s: 31536000 },
|
|
169
|
+
{ label: 'm', s: 2592000 },
|
|
170
|
+
{ label: 'w', s: 604800 },
|
|
171
|
+
{ label: 'd', s: 86400 },
|
|
172
|
+
{ label: 'h', s: 3600 },
|
|
173
|
+
{ label: 'min', s: 60 },
|
|
174
|
+
{ label: 's', s: 1 },
|
|
175
|
+
];
|
|
176
|
+
|
|
177
|
+
let result = [];
|
|
178
|
+
|
|
179
|
+
for (const unit of units) {
|
|
180
|
+
if (diff >= unit.s) {
|
|
181
|
+
const value = Math.floor(diff / unit.s);
|
|
182
|
+
diff %= unit.s;
|
|
183
|
+
result.push(`${value}${unit.label}`);
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
return result.join(', ');
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
lc = (str: string) => str.toLowerCase().replace(/[^\w\s]/g, '').replace(/\s+/g, '_')
|
|
191
|
+
|
|
192
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export interface ChannelInfoInterface {
|
|
2
|
+
name: string
|
|
3
|
+
canSubscribe: boolean
|
|
4
|
+
}
|
|
5
|
+
|
|
6
|
+
export class ChannelInfo implements ChannelInfoInterface {
|
|
7
|
+
|
|
8
|
+
constructor(
|
|
9
|
+
public name = '',
|
|
10
|
+
public canSubscribe = false,
|
|
11
|
+
) {}
|
|
12
|
+
|
|
13
|
+
static adapt(item?: any): ChannelInfo {
|
|
14
|
+
|
|
15
|
+
return new ChannelInfo(
|
|
16
|
+
item?.name,
|
|
17
|
+
item?.canSubscribe,
|
|
18
|
+
)
|
|
19
|
+
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { UserMessage } from "./user-message.model"
|
|
2
|
+
|
|
3
|
+
export interface ChannelMessageInterface {
|
|
4
|
+
channel: string,
|
|
5
|
+
users: UserMessage[],
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
export class ChannelMessage implements ChannelMessageInterface {
|
|
9
|
+
|
|
10
|
+
constructor(
|
|
11
|
+
public channel: string,
|
|
12
|
+
public users: UserMessage[] = [],
|
|
13
|
+
) {}
|
|
14
|
+
|
|
15
|
+
static adapt(item?: any): ChannelMessage {
|
|
16
|
+
|
|
17
|
+
return new ChannelMessage(
|
|
18
|
+
item?.channel,
|
|
19
|
+
(item?.users) ? item?.users.map((userItem: any) => UserMessage.adapt(userItem)) : [],
|
|
20
|
+
)
|
|
21
|
+
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { WSUser } from "./ws-user.model";
|
|
2
|
+
|
|
3
|
+
export interface ChannelMessageInterface {
|
|
4
|
+
sessionId: any,
|
|
5
|
+
content: any,
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
export class ChannelMessage implements ChannelMessageInterface {
|
|
9
|
+
|
|
10
|
+
constructor(
|
|
11
|
+
public sessionId: any = null,
|
|
12
|
+
public content: any = null,
|
|
13
|
+
) {}
|
|
14
|
+
|
|
15
|
+
static adapt(item?: any): ChannelMessage {
|
|
16
|
+
|
|
17
|
+
return new ChannelMessage(
|
|
18
|
+
item?.sessionId || item?.id, // Support both for backward compatibility
|
|
19
|
+
item?.content,
|
|
20
|
+
)
|
|
21
|
+
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
export interface WSUserInterface {
|
|
2
|
+
id: string,
|
|
3
|
+
ldap?: string,
|
|
4
|
+
name?: string,
|
|
5
|
+
email?: string,
|
|
6
|
+
[key: string]: any, // Allow additional properties
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export class WSUser implements WSUserInterface {
|
|
10
|
+
|
|
11
|
+
constructor(
|
|
12
|
+
public id: string = '',
|
|
13
|
+
public ldap: string = '',
|
|
14
|
+
public name: string = '',
|
|
15
|
+
public email: string = '',
|
|
16
|
+
) {}
|
|
17
|
+
|
|
18
|
+
static adapt(item?: any): WSUser {
|
|
19
|
+
const user = new WSUser(
|
|
20
|
+
item?.id || item?.sessionId, // Support both for backward compatibility
|
|
21
|
+
item?.ldap,
|
|
22
|
+
item?.name,
|
|
23
|
+
item?.email,
|
|
24
|
+
);
|
|
25
|
+
// Copy any additional properties
|
|
26
|
+
if (item) {
|
|
27
|
+
Object.keys(item).forEach(key => {
|
|
28
|
+
if (!['id', 'sessionId', 'ldap', 'name', 'email'].includes(key)) {
|
|
29
|
+
(user as any)[key] = item[key];
|
|
30
|
+
}
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
return user;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
|