http-request-manager 18.7.19 → 18.7.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (198) hide show
  1. package/ARCHITECTURE.md +483 -0
  2. package/DATABASE_README.md +1176 -0
  3. package/HTTP_MANAGER_README.md +579 -0
  4. package/HTTP_SINGNALS_MANAGER_README.md +654 -0
  5. package/HTTP_STATE_MANAGER_README.md +948 -0
  6. package/INTERCEPTOR_README.md +549 -0
  7. package/LOCAL_STORAGE_README.md +1056 -0
  8. package/STORE_STATE_MANAGER_README.md +1322 -0
  9. package/UTILS_README.md +1186 -0
  10. package/WS_MANAGER_README.md +613 -0
  11. package/ng-package.json +8 -0
  12. package/package.json +1 -12
  13. package/src/lib/http-request-manager.module.ts +132 -0
  14. package/src/lib/http-request-services-demo/database-data-demo/database-data-demo.component.html +65 -0
  15. package/src/lib/http-request-services-demo/database-data-demo/database-data-demo.component.scss +0 -0
  16. package/src/lib/http-request-services-demo/database-data-demo/database-data-demo.component.ts +224 -0
  17. package/src/lib/http-request-services-demo/http-request-services-demo.component.html +114 -0
  18. package/src/lib/http-request-services-demo/http-request-services-demo.component.scss +6 -0
  19. package/src/lib/http-request-services-demo/http-request-services-demo.component.ts +52 -0
  20. package/src/lib/http-request-services-demo/local-storage-demo/local-storage-demo.component.html +195 -0
  21. package/src/lib/http-request-services-demo/local-storage-demo/local-storage-demo.component.scss +17 -0
  22. package/src/lib/http-request-services-demo/local-storage-demo/local-storage-demo.component.ts +206 -0
  23. package/src/lib/http-request-services-demo/local-storage-signals-demo/local-storage-signals-demo.component.html +200 -0
  24. package/src/lib/http-request-services-demo/local-storage-signals-demo/local-storage-signals-demo.component.scss +17 -0
  25. package/src/lib/http-request-services-demo/local-storage-signals-demo/local-storage-signals-demo.component.ts +212 -0
  26. package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/download-file/download-file.component.html +53 -0
  27. package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/download-file/download-file.component.scss +60 -0
  28. package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/download-file/download-file.component.ts +72 -0
  29. package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/file-download.module.ts +28 -0
  30. package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/file-downloader.component.html +10 -0
  31. package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/file-downloader.component.scss +29 -0
  32. package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/file-downloader.component.ts +100 -0
  33. package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/models/download-labels-model.ts +22 -0
  34. package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/spinner/spinner.component.html +8 -0
  35. package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/spinner/spinner.component.scss +19 -0
  36. package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/spinner/spinner.component.ts +26 -0
  37. package/src/lib/http-request-services-demo/request-manager-demo/models/app-session.model.ts +30 -0
  38. package/src/lib/http-request-services-demo/request-manager-demo/models/app.model.ts +19 -0
  39. package/src/lib/http-request-services-demo/request-manager-demo/models/get-sample.model.ts +25 -0
  40. package/src/lib/http-request-services-demo/request-manager-demo/models/sample-ai-prompt.ts +19 -0
  41. package/src/lib/http-request-services-demo/request-manager-demo/models/sample-client-details.ts +24 -0
  42. package/src/lib/http-request-services-demo/request-manager-demo/models/sample-client-info.ts +30 -0
  43. package/src/lib/http-request-services-demo/request-manager-demo/models/sample-client.model.ts +49 -0
  44. package/src/lib/http-request-services-demo/request-manager-demo/models/sample-mapper-client-info.ts +33 -0
  45. package/src/lib/http-request-services-demo/request-manager-demo/request-manager-demo.component.html +392 -0
  46. package/src/lib/http-request-services-demo/request-manager-demo/request-manager-demo.component.scss +24 -0
  47. package/src/lib/http-request-services-demo/request-manager-demo/request-manager-demo.component.ts +461 -0
  48. package/src/lib/http-request-services-demo/request-manager-state-demo/request-manager-state-demo.component.html +393 -0
  49. package/src/lib/http-request-services-demo/request-manager-state-demo/request-manager-state-demo.component.scss +24 -0
  50. package/src/lib/http-request-services-demo/request-manager-state-demo/request-manager-state-demo.component.ts +421 -0
  51. package/src/lib/http-request-services-demo/request-manager-state-demo/services/state-manager-demo.service.ts +87 -0
  52. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/services/state-data-request.service.ts +120 -0
  53. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-ai-messaging/ws-ai-messaging.component.css +0 -0
  54. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-ai-messaging/ws-ai-messaging.component.html +3 -0
  55. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-ai-messaging/ws-ai-messaging.component.ts +16 -0
  56. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-chats/ws-chats.component.css +0 -0
  57. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-chats/ws-chats.component.html +3 -0
  58. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-chats/ws-chats.component.ts +16 -0
  59. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-data-control/ws-data-control.component.css +31 -0
  60. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-data-control/ws-data-control.component.html +72 -0
  61. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-data-control/ws-data-control.component.scss +41 -0
  62. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-data-control/ws-data-control.component.spec.ts +205 -0
  63. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-data-control/ws-data-control.component.ts +77 -0
  64. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-messaging/ws-messaging.component.css +11 -0
  65. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-messaging/ws-messaging.component.html +96 -0
  66. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-messaging/ws-messaging.component.spec.ts +31 -0
  67. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-messaging/ws-messaging.component.ts +229 -0
  68. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-notifications/ws-notifications.component.css +30 -0
  69. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-notifications/ws-notifications.component.html +172 -0
  70. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-notifications/ws-notifications.component.spec.ts +31 -0
  71. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-notifications/ws-notifications.component.ts +239 -0
  72. package/src/lib/http-request-services-demo/request-manager-ws-demo/models/oidc-client.model.ts +31 -0
  73. package/src/lib/http-request-services-demo/request-manager-ws-demo/models/user-data.model.ts +32 -0
  74. package/src/lib/http-request-services-demo/request-manager-ws-demo/request-manager-ws-demo.component.css +0 -0
  75. package/src/lib/http-request-services-demo/request-manager-ws-demo/request-manager-ws-demo.component.html +84 -0
  76. package/src/lib/http-request-services-demo/request-manager-ws-demo/request-manager-ws-demo.component.ts +41 -0
  77. package/src/lib/http-request-services-demo/request-manager-ws-demo/services/index.ts +3 -0
  78. package/src/lib/http-request-services-demo/request-manager-ws-demo/services/message-service-demo.service.ts +83 -0
  79. package/src/lib/http-request-services-demo/request-manager-ws-demo/services/notification-service-demo.service.ts +147 -0
  80. package/src/lib/http-request-services-demo/request-manager-ws-demo/services/state-service-demo.service.ts +158 -0
  81. package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/download-file/download-file.component.html +53 -0
  82. package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/download-file/download-file.component.scss +60 -0
  83. package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/download-file/download-file.component.ts +72 -0
  84. package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/file-download.module.ts +28 -0
  85. package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/file-downloader.component.html +10 -0
  86. package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/file-downloader.component.scss +29 -0
  87. package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/file-downloader.component.ts +100 -0
  88. package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/models/download-labels-model.ts +22 -0
  89. package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/spinner/spinner.component.html +8 -0
  90. package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/spinner/spinner.component.scss +19 -0
  91. package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/spinner/spinner.component.ts +26 -0
  92. package/src/lib/http-request-services-demo/request-signals-manager-demo/models/app-session.model.ts +30 -0
  93. package/src/lib/http-request-services-demo/request-signals-manager-demo/models/app.model.ts +19 -0
  94. package/src/lib/http-request-services-demo/request-signals-manager-demo/models/get-sample.model.ts +25 -0
  95. package/src/lib/http-request-services-demo/request-signals-manager-demo/models/sample-ai-prompt.ts +19 -0
  96. package/src/lib/http-request-services-demo/request-signals-manager-demo/models/sample-client-details.ts +24 -0
  97. package/src/lib/http-request-services-demo/request-signals-manager-demo/models/sample-client-info.ts +30 -0
  98. package/src/lib/http-request-services-demo/request-signals-manager-demo/models/sample-client.model.ts +49 -0
  99. package/src/lib/http-request-services-demo/request-signals-manager-demo/models/sample-mapper-client-info.ts +33 -0
  100. package/src/lib/http-request-services-demo/request-signals-manager-demo/request-signals-manager-demo.component.html +380 -0
  101. package/src/lib/http-request-services-demo/request-signals-manager-demo/request-signals-manager-demo.component.scss +24 -0
  102. package/src/lib/http-request-services-demo/request-signals-manager-demo/request-signals-manager-demo.component.ts +410 -0
  103. package/src/lib/http-request-services-demo/store-state-manager-demo/models/settings.model.ts +28 -0
  104. package/src/lib/http-request-services-demo/store-state-manager-demo/services/settings-state.service.ts +48 -0
  105. package/src/lib/http-request-services-demo/store-state-manager-demo/store-state-manager-demo.component.css +0 -0
  106. package/src/lib/http-request-services-demo/store-state-manager-demo/store-state-manager-demo.component.html +23 -0
  107. package/src/lib/http-request-services-demo/store-state-manager-demo/store-state-manager-demo.component.ts +36 -0
  108. package/src/lib/index.ts +3 -0
  109. package/src/lib/interceptors/credentials.interceptor.ts +16 -0
  110. package/src/lib/interceptors/index.ts +6 -0
  111. package/src/lib/interceptors/models/error-settings.model.ts +22 -0
  112. package/src/lib/interceptors/models/index.ts +2 -0
  113. package/src/lib/interceptors/proxy-debugger.interceptor.ts +46 -0
  114. package/src/lib/interceptors/request-error.interceptor.ts +65 -0
  115. package/src/lib/interceptors/request-header.interceptor.ts +53 -0
  116. package/src/lib/models/config-http-options.model.ts +42 -0
  117. package/src/lib/models/config-local-storage-options.model.ts +27 -0
  118. package/src/lib/models/config-options.model.ts +27 -0
  119. package/src/lib/models/config-token.model.ts +9 -0
  120. package/src/lib/models/data-type.enum.ts +5 -0
  121. package/src/lib/models/database-storage.model.ts +24 -0
  122. package/src/lib/models/index.ts +12 -0
  123. package/src/lib/models/retry-options.model.ts +22 -0
  124. package/src/lib/services/database-manager-service/database.manager.service.ts +262 -0
  125. package/src/lib/services/database-manager-service/db.storage.service.ts +207 -0
  126. package/src/lib/services/database-manager-service/index.ts +4 -0
  127. package/src/lib/services/database-manager-service/models/index.ts +2 -0
  128. package/src/lib/services/database-manager-service/models/table-schema.ts +33 -0
  129. package/src/lib/services/index.ts +12 -0
  130. package/src/lib/services/local-storage-manager-service/index.ts +4 -0
  131. package/src/lib/services/local-storage-manager-service/local-storage-manager.service.spec.ts +71 -0
  132. package/src/lib/services/local-storage-manager-service/local-storage-manager.service.ts +426 -0
  133. package/src/lib/services/local-storage-manager-service/local-storage-signals-manager.service.spec.ts +67 -0
  134. package/src/lib/services/local-storage-manager-service/local-storage-signals-manager.service.ts +345 -0
  135. package/src/lib/services/local-storage-manager-service/models/global-store-options.model.ts +30 -0
  136. package/src/lib/services/local-storage-manager-service/models/index.ts +6 -0
  137. package/src/lib/services/local-storage-manager-service/models/setting-options.model.ts +35 -0
  138. package/src/lib/services/local-storage-manager-service/models/storage-data.model.ts +24 -0
  139. package/src/lib/services/local-storage-manager-service/models/storage-option.model.ts +32 -0
  140. package/src/lib/services/local-storage-manager-service/models/storage-type.enum.ts +5 -0
  141. package/src/lib/services/request-manager-services/README.md +268 -0
  142. package/src/lib/services/request-manager-services/http-manager-signals.service.ts +246 -0
  143. package/src/lib/services/request-manager-services/http-manager.service.spec.ts +232 -0
  144. package/src/lib/services/request-manager-services/http-manager.service.ts +274 -0
  145. package/src/lib/services/request-manager-services/index.ts +8 -0
  146. package/src/lib/services/request-manager-services/request-signals.service.ts +214 -0
  147. package/src/lib/services/request-manager-services/request.service.ts +309 -0
  148. package/src/lib/services/request-manager-services/rxjs-operators/countdown.ts +17 -0
  149. package/src/lib/services/request-manager-services/rxjs-operators/delay-retry.ts +16 -0
  150. package/src/lib/services/request-manager-services/rxjs-operators/index.ts +4 -0
  151. package/src/lib/services/request-manager-services/rxjs-operators/request-polling.ts +35 -0
  152. package/src/lib/services/request-manager-services/rxjs-operators/request-streaming.ts +436 -0
  153. package/src/lib/services/request-manager-state-service/http-manager-state.store.ts +1321 -0
  154. package/src/lib/services/request-manager-state-service/index.ts +3 -0
  155. package/src/lib/services/request-manager-state-service/models/api-request.model.ts +61 -0
  156. package/src/lib/services/request-manager-state-service/models/index.ts +6 -0
  157. package/src/lib/services/request-manager-state-service/models/request-options.model.ts +22 -0
  158. package/src/lib/services/request-manager-state-service/models/stream-type.enum.ts +13 -0
  159. package/src/lib/services/request-manager-state-service/models/ws-options.model.ts +39 -0
  160. package/src/lib/services/store-state-manager-service/index.ts +3 -0
  161. package/src/lib/services/store-state-manager-service/models/index.ts +2 -0
  162. package/src/lib/services/store-state-manager-service/models/state-storage-options.model.ts +24 -0
  163. package/src/lib/services/store-state-manager-service/store-state-manager.service.ts +88 -0
  164. package/src/lib/services/utils/app.service.spec.ts +25 -0
  165. package/src/lib/services/utils/app.service.ts +21 -0
  166. package/src/lib/services/utils/encryption/README.md +79 -0
  167. package/src/lib/services/utils/encryption/asymmetrical-encryption.service.ts +282 -0
  168. package/src/lib/services/utils/encryption/encryption-test.service.ts +39 -0
  169. package/src/lib/services/utils/encryption/index.ts +5 -0
  170. package/src/lib/services/utils/encryption/random.ts +81 -0
  171. package/src/lib/services/utils/encryption/symmetrical-encryption.service.ts +93 -0
  172. package/src/lib/services/utils/headers.service.spec.ts +80 -0
  173. package/src/lib/services/utils/headers.service.ts +18 -0
  174. package/src/lib/services/utils/index.ts +7 -0
  175. package/src/lib/services/utils/object-merger.service.spec.ts +18 -0
  176. package/src/lib/services/utils/object-merger.service.ts +78 -0
  177. package/src/lib/services/utils/path-query.service.spec.ts +117 -0
  178. package/src/lib/services/utils/path-query.service.ts +69 -0
  179. package/src/lib/services/utils/random-color.utils.ts +83 -0
  180. package/src/lib/services/utils/utils.service.spec.ts +165 -0
  181. package/src/lib/services/utils/utils.service.ts +192 -0
  182. package/src/lib/services/ws-manager-service/index.ts +4 -0
  183. package/src/lib/services/ws-manager-service/models/channel-info.model.ts +24 -0
  184. package/src/lib/services/ws-manager-service/models/channel-message-data.model.ts +24 -0
  185. package/src/lib/services/ws-manager-service/models/channel-message.model.ts +24 -0
  186. package/src/lib/services/ws-manager-service/models/communication-type.enum.ts +5 -0
  187. package/src/lib/services/ws-manager-service/models/index.ts +5 -0
  188. package/src/lib/services/ws-manager-service/models/ws-user.model.ts +38 -0
  189. package/src/lib/services/ws-manager-service/services/index.ts +3 -0
  190. package/src/lib/services/ws-manager-service/services/websocket.service.ts +392 -0
  191. package/src/public-api.ts +14 -0
  192. package/tsconfig.lib.json +32 -0
  193. package/tsconfig.lib.prod.json +10 -0
  194. package/tsconfig.spec.json +14 -0
  195. package/fesm2022/http-request-manager.mjs +0 -7634
  196. package/fesm2022/http-request-manager.mjs.map +0 -1
  197. package/http-request-manager-18.7.19.tgz +0 -0
  198. package/types/http-request-manager.d.ts +0 -2278
@@ -0,0 +1,39 @@
1
+ import { Injectable } from '@angular/core';
2
+
3
+ @Injectable({
4
+ providedIn: 'root'
5
+ })
6
+ export class EncryptionTestService {
7
+
8
+ constructor() { }
9
+
10
+ private isBase64(str: string): boolean {
11
+ const base64Pattern = /^(?:[A-Z0-9+/]{4})*(?:[A-Z0-9+/]{2}==|[A-Z0-9+/]{3}=)?$/i;
12
+ return base64Pattern.test(str);
13
+ }
14
+
15
+ private isHexadecimal(str: string): boolean {
16
+ const hexPattern = /^[0-9a-fA-F]+$/;
17
+ return hexPattern.test(str) && (str.length % 2 === 0);
18
+ }
19
+
20
+ private hasHighEntropy(str: string): boolean {
21
+ const uniqueChars = new Set(str).size;
22
+ return uniqueChars > str.length * 0.6;
23
+ }
24
+
25
+ isEncrypted(str: string): boolean {
26
+
27
+ if (typeof str !== 'string') {
28
+ return false;
29
+ }
30
+
31
+ if (this.isBase64(str) || this.isHexadecimal(str)) {
32
+ return true;
33
+ }
34
+
35
+ return this.hasHighEntropy(str);
36
+
37
+ }
38
+
39
+ }
@@ -0,0 +1,5 @@
1
+ export * from "./asymmetrical-encryption.service";
2
+ export * from './symmetrical-encryption.service';
3
+
4
+ export * from './random';
5
+
@@ -0,0 +1,81 @@
1
+ export const Random = () => {
2
+ const typedArray = new Uint8Array(1)
3
+ const randomValue = crypto.getRandomValues(typedArray)[0]
4
+ const randomFloat = randomValue / Math.pow(2, 8)
5
+ return randomFloat
6
+ }
7
+
8
+ export const RandomNumber = (min: number, max: number) => {
9
+ return Math.floor(Random() * max) + min
10
+ }
11
+
12
+ export const RandomNumbers = (min: number, max: number, length: number) => {
13
+ const numbers: number[] = []
14
+ for (let i = 0; i < length; i++) numbers.push(Math.floor(Random() * max) + min)
15
+ return numbers
16
+ }
17
+
18
+ export const RandomNumbersUnique = (min: number, max: number, length: number) => {
19
+ let count = 0;
20
+
21
+ // Adjust the length if it exceeds the number of unique numbers possible in the range
22
+ if (length > (max - min + 1)) {
23
+ console.error('error encountered');
24
+ length = max - min + 1;
25
+ }
26
+
27
+ console.log('length', length);
28
+ const numbers: number[] = [];
29
+ const maxAttempts = length * 100 ; // Safeguard to prevent infinite loops
30
+
31
+ while (numbers.length < length && count < maxAttempts) {
32
+
33
+ const num = Math.floor(Random() * max) + min;
34
+
35
+ if (!numbers.includes(num)) {
36
+ numbers.push(num);
37
+ }
38
+ }
39
+
40
+ if (count >= maxAttempts) {
41
+ throw new Error('Maximum attempts exceeded while generating unique numbers');
42
+ }
43
+
44
+ return numbers;
45
+ };
46
+
47
+ export const RandomStr = () => {
48
+
49
+ const typedArray = new Uint8Array(8)
50
+ const array = new Uint32Array(1)
51
+ crypto.getRandomValues(array)
52
+ return array[0].toString(36)
53
+
54
+ }
55
+
56
+ export const RandomSignature = () => {
57
+
58
+ const typedArray = new Uint8Array(8)
59
+ const array = new Uint32Array(1)
60
+ crypto.getRandomValues(array)
61
+ return array[0]
62
+
63
+ }
64
+
65
+ export const UUID = () => {
66
+ return self.crypto.randomUUID()
67
+ }
68
+
69
+ /**
70
+ * Generate a UUID string (legacy format)
71
+ */
72
+ export const UUID_STR = (): string => {
73
+ const s4 = () => {
74
+ return Math.floor((1 + Random()) * 0x10000)
75
+ .toString(16)
76
+ .substring(1);
77
+ };
78
+ return s4() + s4() + '-' + s4() + '-' + s4() + '-' + s4() + '-' + s4() + s4() + s4();
79
+ };
80
+
81
+
@@ -0,0 +1,93 @@
1
+ import { Injectable, inject } from '@angular/core';
2
+ import * as CryptoJS from 'crypto-js';
3
+
4
+ import { RandomSignature } from './random';
5
+ import { AppService } from '../app.service';
6
+
7
+ @Injectable({
8
+ providedIn: 'root'
9
+ })
10
+ export class SymmetricalEncryptionService {
11
+
12
+ appID: string; // APP SERVICE TO MANAGER ENCRYPTION KEY
13
+
14
+ private appService = inject(AppService)
15
+
16
+ constructor() {
17
+ // TODO: The APP ID is not a string, it is a function
18
+ this.appID = (this.appService.appID) ? this.appService.appID : ''
19
+ if(this.appID === '') console.warn('No App Key has been define')
20
+ }
21
+
22
+ generateCipherKey() {
23
+ return (RandomSignature().toString() + RandomSignature().toString()).substring(0, 8)
24
+ }
25
+
26
+ encrypt(str: any, key = this.appID) {
27
+
28
+ if(!str || key === '') return ''
29
+
30
+ let _key = CryptoJS.enc.Utf8.parse(key)
31
+ let _iv = CryptoJS.enc.Utf8.parse(key)
32
+
33
+ try {
34
+
35
+ const encrypted = CryptoJS.AES.encrypt(
36
+ JSON.stringify(str), _key, {
37
+ keySize: 16,
38
+ iv: _iv,
39
+ mode: CryptoJS.mode.ECB,
40
+ padding: CryptoJS.pad.Pkcs7
41
+ });
42
+
43
+ return encrypted.toString()
44
+
45
+ } catch(error: any) {
46
+ console.log(error)
47
+ }
48
+
49
+ return
50
+ }
51
+
52
+ decrypt(str: string, key = this.appID) {
53
+
54
+ if(!str || key === '') return
55
+
56
+ let _key = CryptoJS.enc.Utf8.parse(key)
57
+ let _iv = CryptoJS.enc.Utf8.parse(key)
58
+
59
+ try {
60
+
61
+ return CryptoJS.AES.decrypt(
62
+ str, _key, {
63
+ keySize: 16,
64
+ iv: _iv,
65
+ mode: CryptoJS.mode.ECB,
66
+ padding: CryptoJS.pad.Pkcs7
67
+ }).toString(CryptoJS.enc.Utf8);
68
+
69
+ } catch(error: any) {
70
+ console.log(error)
71
+ }
72
+
73
+ return
74
+ }
75
+
76
+ createSignature(url: string, len = 16) {
77
+ const sig = CryptoJS.SHA256(url).toString(CryptoJS.enc.Hex)
78
+ return sig.substring(0, len).toUpperCase()
79
+ }
80
+
81
+ normalizeURL(url: string) {
82
+ const normalizedURL = url.replace(/(https?:\/\/)?(www\.)?/, '').replace(/\/+$/, '');
83
+ return normalizedURL;
84
+ }
85
+
86
+ generateSignature(url: string) {
87
+ const normalizedURL = this.normalizeURL(url)
88
+ const hash = CryptoJS.SHA256(normalizedURL)
89
+ const signature = hash.toString(CryptoJS.enc.Hex)
90
+ return signature;
91
+ }
92
+
93
+ }
@@ -0,0 +1,80 @@
1
+ import { TestBed } from '@angular/core/testing';
2
+ import { HttpHeaders } from '@angular/common/http';
3
+ import { HeadersService } from './headers.service';
4
+
5
+ describe('HeadersService', () => {
6
+ let service: HeadersService;
7
+
8
+ beforeEach(() => {
9
+ TestBed.configureTestingModule({
10
+ providers: [HeadersService]
11
+ });
12
+ service = TestBed.inject(HeadersService);
13
+ });
14
+
15
+ it('should be created', () => {
16
+ expect(service).toBeTruthy();
17
+ });
18
+
19
+ it('should generate headers correctly', () => {
20
+ service.headers = { 'Content-Type': 'application/json' };
21
+ const customHeaders = { 'Authorization': 'Bearer token' };
22
+ const result = service.generateHeaders(customHeaders);
23
+ expect(result.headers.get('Content-Type')).toBe('application/json');
24
+ expect(result.headers.get('Authorization')).toBe('Bearer token');
25
+ });
26
+
27
+ it('should override default headers with custom headers', () => {
28
+ service.headers = { 'Content-Type': 'application/json' };
29
+ const customHeaders = { 'Content-Type': 'text/plain' };
30
+ const result = service.generateHeaders(customHeaders);
31
+ expect(result.headers.get('Content-Type')).toBe('text/plain');
32
+ });
33
+
34
+ it('should handle empty custom headers', () => {
35
+ service.headers = { 'Content-Type': 'application/json' };
36
+ const customHeaders = {};
37
+ const result = service.generateHeaders(customHeaders);
38
+ expect(result.headers.get('Content-Type')).toBe('application/json');
39
+ });
40
+
41
+ it('should handle empty default headers', () => {
42
+ service.headers = {};
43
+ const customHeaders = { 'Content-Type': 'text/plain' };
44
+ const result = service.generateHeaders(customHeaders);
45
+ expect(result.headers.get('Content-Type')).toBe('text/plain');
46
+ });
47
+
48
+ it('should merge multiple headers correctly', () => {
49
+ service.headers = { 'Content-Type': 'application/json', 'Accept': 'application/json' };
50
+ const customHeaders = { 'Authorization': 'Bearer token', 'Accept': 'text/plain' };
51
+ const result = service.generateHeaders(customHeaders);
52
+ expect(result.headers.get('Content-Type')).toBe('application/json');
53
+ expect(result.headers.get('Authorization')).toBe('Bearer token');
54
+ expect(result.headers.get('Accept')).toBe('text/plain');
55
+ });
56
+
57
+ it('should handle no headers', () => {
58
+ service.headers = {};
59
+ const customHeaders = {};
60
+ const result = service.generateHeaders(customHeaders);
61
+ expect(result.headers.keys().length).toBe(0);
62
+ });
63
+
64
+ it('should prioritize custom headers over default headers', () => {
65
+ service.headers = { 'Content-Type': 'application/json', 'Authorization': 'Bearer defaultToken' };
66
+ const customHeaders = { 'Authorization': 'Bearer customToken' };
67
+ const result = service.generateHeaders(customHeaders);
68
+ expect(result.headers.get('Content-Type')).toBe('application/json');
69
+ expect(result.headers.get('Authorization')).toBe('Bearer customToken');
70
+ });
71
+
72
+ it('should add new custom headers to default headers', () => {
73
+ service.headers = { 'Content-Type': 'application/json' };
74
+ const customHeaders = { 'Authorization': 'Bearer token', 'Accept': 'application/xml' };
75
+ const result = service.generateHeaders(customHeaders);
76
+ expect(result.headers.get('Content-Type')).toBe('application/json');
77
+ expect(result.headers.get('Authorization')).toBe('Bearer token');
78
+ expect(result.headers.get('Accept')).toBe('application/xml');
79
+ });
80
+ });
@@ -0,0 +1,18 @@
1
+ import { HttpHeaders } from '@angular/common/http';
2
+ import { Injectable } from '@angular/core';
3
+
4
+ @Injectable({
5
+ providedIn: 'root'
6
+ })
7
+ export class HeadersService {
8
+
9
+ headers = {}
10
+
11
+ generateHeaders(headers?: Record<string, string>): { headers: HttpHeaders } {
12
+
13
+ const allHeaders = headers ? { ...this.headers, ...headers } : {}
14
+ return { headers: new HttpHeaders(allHeaders) }
15
+
16
+ }
17
+
18
+ }
@@ -0,0 +1,7 @@
1
+ export * from './app.service';
2
+ export * from './headers.service';
3
+ export * from './path-query.service';
4
+ export * from './utils.service';
5
+ export * from './random-color.utils';
6
+ export * from './encryption/index';
7
+
@@ -0,0 +1,18 @@
1
+ /* tslint:disable:no-unused-variable */
2
+
3
+ import { TestBed, inject } from '@angular/core/testing';
4
+ import { HttpClientTestingModule } from '@angular/common/http/testing';
5
+ import { ObjectMergerService } from './object-merger.service';
6
+
7
+ describe('Service: ObjectMerger', () => {
8
+ beforeEach(() => {
9
+ TestBed.configureTestingModule({
10
+ imports: [HttpClientTestingModule],
11
+ providers: [ObjectMergerService]
12
+ });
13
+ });
14
+
15
+ it('should ...', inject([ObjectMergerService], (service: ObjectMergerService) => {
16
+ expect(service).toBeTruthy();
17
+ }));
18
+ });
@@ -0,0 +1,78 @@
1
+ import { Inject, Injectable, Optional, inject } from '@angular/core';
2
+
3
+ import { ApiRequest } from '../request-manager-state-service/models';
4
+ import { SettingOptions } from '../local-storage-manager-service';
5
+ import { UtilsService } from './utils.service';
6
+
7
+ import { CONFIG_SETTINGS_TOKEN } from '../../models/config-token.model';
8
+ import { ConfigHTTPOptions, ConfigOptions, LocalStorageOptions } from '../request-manager-services';
9
+
10
+ @Injectable({
11
+ providedIn: 'root'
12
+ })
13
+ export class ObjectMergerService {
14
+
15
+ utils = inject(UtilsService);
16
+
17
+ constructor(@Inject(CONFIG_SETTINGS_TOKEN) @Optional() private configOptions?: ConfigOptions) {
18
+ if (!this.configOptions) this.configOptions = ConfigOptions.adapt()
19
+ }
20
+
21
+ mergeOptions(options = ApiRequest.adapt()) {
22
+
23
+ const configForRoot = (this.configOptions?.httpRequestOptions) ? this.configOptions.httpRequestOptions : ConfigHTTPOptions.adapt()
24
+ const mergedOptions = ApiRequest.adapt(options)
25
+
26
+ mergedOptions.server = (options && options.server === '') ? configForRoot?.server || '' : options.server
27
+
28
+ mergedOptions.path = [ ...options.path || [], ...configForRoot?.path || [] ]
29
+
30
+ mergedOptions.headers = { ...options.headers || {}, ...configForRoot?.headers || {} }
31
+
32
+ mergedOptions.retry = (options && (options?.retry?.times !== 0 || options?.retry?.delay !== 3)) ? options.retry : configForRoot?.retry || { times: 0, delay: 3 };
33
+
34
+ mergedOptions.polling = (options && options?.polling !== 0) ? options.polling : configForRoot?.polling || 0;
35
+
36
+ mergedOptions.displayError = (options && options?.displayError) ? options.displayError : configForRoot?.displayError || false;
37
+
38
+ mergedOptions.stream = (options && options?.stream) ? options.stream : configForRoot?.stream || false;
39
+
40
+ return mergedOptions;
41
+
42
+ }
43
+
44
+ mergeStorageOptions(options = SettingOptions.adapt()) {
45
+
46
+ const configForRoot = (this.configOptions?.LocalStorageOptions) ? this.configOptions.LocalStorageOptions : LocalStorageOptions.adapt()
47
+ const configForRootOptions = configForRoot.options || LocalStorageOptions.adapt().options
48
+
49
+ const mergedOptions = SettingOptions.adapt(options)
50
+
51
+ // storage type
52
+ mergedOptions.storage = (options && (typeof options.storage !== 'undefined')) ? options.storage : (configForRootOptions?.storage ?? 0)
53
+
54
+ // expires: prefer explicit numeric expires; if not provided, compute from expiresIn string; otherwise use config default
55
+ // if an explicit, non-zero numeric expires is provided, use it
56
+ if (options && (typeof options.expires !== 'undefined') && options.expires !== null && Number(options.expires) > 0) {
57
+ mergedOptions.expires = Number(options.expires);
58
+ } else if (options && options.expiresIn) {
59
+ // compute numeric epoch from expiresIn string using UtilsService if available
60
+ try {
61
+ mergedOptions.expires = this.utils ? this.utils.expires(options.expiresIn) : 0;
62
+ } catch {
63
+ mergedOptions.expires = 0;
64
+ }
65
+ } else {
66
+ mergedOptions.expires = configForRootOptions?.expires ?? 0;
67
+ }
68
+
69
+ // keep expiresIn string if explicitly provided, otherwise use config default
70
+ mergedOptions.expiresIn = (options && (typeof options.expiresIn !== 'undefined')) ? options.expiresIn : (configForRootOptions?.expiresIn || '')
71
+
72
+ mergedOptions.encrypted = (options && (typeof options.encrypted !== 'undefined')) ? options.encrypted : (configForRootOptions?.encrypted || false)
73
+
74
+ return mergedOptions;
75
+
76
+ }
77
+
78
+ }
@@ -0,0 +1,117 @@
1
+ import { TestBed } from '@angular/core/testing';
2
+ import { PathQueryService } from './path-query.service';
3
+
4
+ describe('PathQueryService', () => {
5
+ let service: PathQueryService;
6
+
7
+ beforeEach(() => {
8
+ TestBed.configureTestingModule({
9
+ providers: [PathQueryService]
10
+ });
11
+ service = TestBed.inject(PathQueryService);
12
+ });
13
+
14
+ it('should be created', () => {
15
+ expect(service).toBeTruthy();
16
+ });
17
+
18
+ it('should build API path with only server', () => {
19
+ const result = service.buildAPIPath('http://example.com');
20
+ expect(result).toBe('http://example.com');
21
+ });
22
+
23
+ it('should build API path with server and path params', () => {
24
+ const result = service.buildAPIPath('http://example.com', ['path', 'to', 'resource']);
25
+ expect(result).toBe('http://example.com/path/to/resource');
26
+ });
27
+
28
+ it('should build API path with server, path params, and query params', () => {
29
+ const result = service.buildAPIPath('http://example.com', ['path', 'to', 'resource', { query: 'value' }]);
30
+ expect(result).toBe('http://example.com/path/to/resource?query=value');
31
+ });
32
+
33
+ it('should build API path with server and query params', () => {
34
+ const result = service.buildAPIPath('http://example.com', [{ query: 'value' }]);
35
+ expect(result).toBe('http://example.com?query=value');
36
+ });
37
+
38
+ it('should handle empty query params', () => {
39
+ const result = service.buildAPIPath('http://example.com', ['path', 'to', 'resource', {}]);
40
+ expect(result).toBe('http://example.com/path/to/resource');
41
+ });
42
+
43
+ it('should remove empty query params', () => {
44
+ const result = service.buildAPIPath('http://example.com', ['path', 'to', 'resource', { query: '' }]);
45
+ expect(result).toBe('http://example.com/path/to/resource');
46
+ });
47
+
48
+ it('should clean URL path', () => {
49
+ const result = service.buildAPIPath('http://example.com', ['path', '', 'to', 'resource']);
50
+ expect(result).toBe('http://example.com/path/to/resource');
51
+ });
52
+
53
+ it('should handle null query params', () => {
54
+ const result = service.buildAPIPath('http://example.com', ['path', 'to', 'resource', null]);
55
+ expect(result).toBe('http://example.com/path/to/resource');
56
+ });
57
+
58
+ it('should handle undefined query params', () => {
59
+ const result = service.buildAPIPath('http://example.com', ['path', 'to', 'resource', undefined]);
60
+ expect(result).toBe('http://example.com/path/to/resource');
61
+ });
62
+
63
+ it('should build API path with server as string array and path params', () => {
64
+ const result = service.buildAPIPath(['http://example.com', 'api', 'v1'], ['path', 'to', 'resource']);
65
+ expect(result).toBe('http://example.com/api/v1/path/to/resource');
66
+ });
67
+
68
+ it('should build API path with server as string array, path params, and query params', () => {
69
+ const result = service.buildAPIPath(['http://example.com', 'api', 'v1'], ['path', 'to', 'resource', { query: 'value' }]);
70
+ expect(result).toBe('http://example.com/api/v1/path/to/resource?query=value');
71
+ });
72
+
73
+ it('should build API path with server as string array and query params', () => {
74
+ const result = service.buildAPIPath(['http://example.com', 'api', 'v1'], [{ query: 'value' }]);
75
+ expect(result).toBe('http://example.com/api/v1?query=value');
76
+ });
77
+
78
+ it('should handle empty query params with server as string array', () => {
79
+ const result = service.buildAPIPath(['http://example.com', 'api', 'v1'], ['path', 'to', 'resource', {}]);
80
+ expect(result).toBe('http://example.com/api/v1/path/to/resource');
81
+ });
82
+
83
+ it('should remove empty query params with server as string array', () => {
84
+ const result = service.buildAPIPath(['http://example.com', 'api', 'v1'], ['path', 'to', 'resource', { query: '' }]);
85
+ expect(result).toBe('http://example.com/api/v1/path/to/resource');
86
+ });
87
+
88
+ it('should clean URL path with server as string array', () => {
89
+ const result = service.buildAPIPath(['http://example.com', 'api', 'v1'], ['path', '', 'to', 'resource']);
90
+ expect(result).toBe('http://example.com/api/v1/path/to/resource');
91
+ });
92
+
93
+ it('should handle null query params with server as string array', () => {
94
+ const result = service.buildAPIPath(['http://example.com', 'api', 'v1'], ['path', 'to', 'resource', null]);
95
+ expect(result).toBe('http://example.com/api/v1/path/to/resource');
96
+ });
97
+
98
+ it('should handle undefined query params with server as string array', () => {
99
+ const result = service.buildAPIPath(['http://example.com', 'api', 'v1'], ['path', 'to', 'resource', undefined]);
100
+ expect(result).toBe('http://example.com/api/v1/path/to/resource');
101
+ });
102
+
103
+ it('should handle multiple query params with server as string array', () => {
104
+ const result = service.buildAPIPath(['http://example.com', 'api', 'v1'], ['path', 'to', 'resource', { query1: 'value1', query2: 'value2' }]);
105
+ expect(result).toBe('http://example.com/api/v1/path/to/resource?query1=value1&query2=value2');
106
+ });
107
+
108
+ it('should handle array query params with server as string array', () => {
109
+ const result = service.buildAPIPath(['http://example.com', 'api', 'v1'], ['path', 'to', 'resource', { query: ['value1', 'value2'] }]);
110
+ expect(result).toBe('http://example.com/api/v1/path/to/resource?query=value1%2Cvalue2');
111
+ });
112
+
113
+ it('should handle mixed path and query params with server as string array', () => {
114
+ const result = service.buildAPIPath(['http://example.com', 'api', 'v1'], ['path', { query: 'value' }, 'to', 'resource']);
115
+ expect(result).toBe('http://example.com/api/v1/path/to/resource?query=value');
116
+ });
117
+ });
@@ -0,0 +1,69 @@
1
+ import { Injectable } from '@angular/core';
2
+
3
+ @Injectable({
4
+ providedIn: 'root'
5
+ })
6
+ export class PathQueryService {
7
+
8
+ buildAPIPath(server: string|string[], params?: any[]|any) {
9
+
10
+ server = (Array.isArray(server)) ? server.join('/') : server
11
+
12
+ const pathObjects = (params) ? params.filter((path:any) => (!this.isObject(path))) : []
13
+ const queryObjects = (params) ? params.filter((path:any) => (this.isObject(path))) : []
14
+
15
+ const query = this.removeEmptyParams(queryObjects.reduce((r: any, c: any) => {
16
+ Object.entries(c).forEach(([key, value]) => {
17
+ r[key] = Array.isArray(value) ? value.join(',') : value
18
+ })
19
+ return r
20
+ }, {}))
21
+
22
+ let path = this.buildRestPath(server, pathObjects)
23
+
24
+ return(Object.keys(query).length > 0) ? path + '?' + this.buildQueryPath(query) : path
25
+
26
+ }
27
+
28
+ private buildRestPath(server: string, params: any[]): string {
29
+ server = (server) ? server : ''
30
+ server = (server.charAt(0) === '/') ? server.substring(1) : server
31
+ return this.cleanUrlPath(server +'/'+ params.join('/'))
32
+ }
33
+
34
+ private buildQueryPath(params: any): string {
35
+
36
+ const searchParams = new URLSearchParams()
37
+
38
+ for (const key in params) {
39
+
40
+ if (Array.isArray(params[key])) {
41
+ params[key].forEach((value: any) => searchParams.append(key, value));
42
+ } else {
43
+ searchParams.append(key, params[key]);
44
+ }
45
+
46
+ }
47
+
48
+ return searchParams.toString()
49
+
50
+ }
51
+
52
+ private cleanUrlPath(str: string) {
53
+ return str.replace(/([^:]\/)\/+/g, "$1").replace(/\/$/,'')
54
+ }
55
+
56
+ private isObject(val: any): boolean {
57
+ return (val === null) ? false : ( (typeof val === 'function') || (typeof val === 'object') )
58
+ }
59
+
60
+ private removeEmptyParams = (obj: any): Record<string, any> =>
61
+ Object.fromEntries(
62
+ Object.entries(obj)
63
+ .map(([key, value]) =>
64
+ [key, value && typeof value === 'object' ? this.removeEmptyParams(value) : value]
65
+ )
66
+ .filter(([_, value]) => value !== undefined && value !== "")
67
+ )
68
+
69
+ }