http-request-manager 15.0.19 → 15.0.26

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 (224) hide show
  1. package/ng-package.json +8 -0
  2. package/package.json +10 -14
  3. package/src/lib/http-request-manager.module.ts +101 -0
  4. package/src/lib/http-request-services-demo/database-data-demo/database-data-demo.component.html +3 -0
  5. package/src/lib/http-request-services-demo/database-data-demo/database-data-demo.component.scss +0 -0
  6. package/src/lib/http-request-services-demo/database-data-demo/database-data-demo.component.ts +105 -0
  7. package/src/lib/http-request-services-demo/http-request-services-demo.component.html +64 -0
  8. package/src/lib/http-request-services-demo/http-request-services-demo.component.scss +6 -0
  9. package/src/lib/http-request-services-demo/http-request-services-demo.component.ts +34 -0
  10. package/src/lib/http-request-services-demo/local-storage-demo/local-storage-demo.component.html +195 -0
  11. package/src/lib/http-request-services-demo/local-storage-demo/local-storage-demo.component.scss +17 -0
  12. package/src/lib/http-request-services-demo/local-storage-demo/local-storage-demo.component.ts +205 -0
  13. package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/download-file/download-file.component.html +59 -0
  14. package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/download-file/download-file.component.scss +60 -0
  15. package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/download-file/download-file.component.ts +71 -0
  16. package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/file-download.module.ts +28 -0
  17. package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/file-downloader.component.html +10 -0
  18. package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/file-downloader.component.scss +29 -0
  19. package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/file-downloader.component.ts +99 -0
  20. package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/models/download-labels-model.ts +22 -0
  21. package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/spinner/spinner.component.html +8 -0
  22. package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/spinner/spinner.component.scss +19 -0
  23. package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/spinner/spinner.component.ts +25 -0
  24. package/src/lib/http-request-services-demo/request-manager-demo/models/app-session.model.ts +30 -0
  25. package/src/lib/http-request-services-demo/request-manager-demo/models/app.model.ts +19 -0
  26. package/src/lib/http-request-services-demo/request-manager-demo/models/get-sample.model.ts +25 -0
  27. package/src/lib/http-request-services-demo/request-manager-demo/models/sample-ai-prompt.ts +19 -0
  28. package/src/lib/http-request-services-demo/request-manager-demo/models/sample-client-details.ts +24 -0
  29. package/src/lib/http-request-services-demo/request-manager-demo/models/sample-client-info.ts +30 -0
  30. package/src/lib/http-request-services-demo/request-manager-demo/models/sample-client.model.ts +49 -0
  31. package/src/lib/http-request-services-demo/request-manager-demo/models/sample-mapper-client-info.ts +33 -0
  32. package/src/lib/http-request-services-demo/request-manager-demo/request-manager-demo.component.html +336 -0
  33. package/src/lib/http-request-services-demo/request-manager-demo/request-manager-demo.component.scss +24 -0
  34. package/src/lib/http-request-services-demo/request-manager-demo/request-manager-demo.component.ts +403 -0
  35. package/src/lib/http-request-services-demo/request-manager-state-demo/request-manager-state-demo.component.html +328 -0
  36. package/src/lib/http-request-services-demo/request-manager-state-demo/request-manager-state-demo.component.scss +24 -0
  37. package/src/lib/http-request-services-demo/request-manager-state-demo/request-manager-state-demo.component.ts +347 -0
  38. package/src/lib/http-request-services-demo/request-manager-state-demo/services/state-manager-demo.service.ts +88 -0
  39. package/src/lib/index.ts +3 -0
  40. package/src/lib/interceptors/credentials.interceptor.ts +18 -0
  41. package/{lib/interceptors/index.d.ts → src/lib/interceptors/index.ts} +2 -0
  42. package/src/lib/interceptors/models/error-settings.model.ts +22 -0
  43. package/src/lib/interceptors/proxy-debugger.interceptor.ts +46 -0
  44. package/src/lib/interceptors/request-error.interceptor.ts +65 -0
  45. package/src/lib/interceptors/request-header.interceptor.ts +58 -0
  46. package/src/lib/models/config-http-options.model.ts +42 -0
  47. package/src/lib/models/config-local-storage-options.model.ts +27 -0
  48. package/src/lib/models/config-options.model.ts +27 -0
  49. package/{lib/models/config-token.model.d.ts → src/lib/models/config-token.model.ts} +2 -1
  50. package/src/lib/models/data-type.enum.ts +5 -0
  51. package/src/lib/models/database-storage.model.ts +24 -0
  52. package/src/lib/models/index.ts +9 -0
  53. package/src/lib/models/retry-options.model.ts +22 -0
  54. package/src/lib/services/database-manager-services/database.manager.service.ts +193 -0
  55. package/src/lib/services/database-manager-services/db.storage.service.ts +191 -0
  56. package/src/lib/services/database-manager-services/index.ts +4 -0
  57. package/src/lib/services/database-manager-services/models/table-schema.ts +35 -0
  58. package/{lib/services/index.d.ts → src/lib/services/index.ts} +4 -0
  59. package/src/lib/services/local-storage-manager-service/index.ts +2 -0
  60. package/src/lib/services/local-storage-manager-service/local-storage-manager.service.spec.ts +71 -0
  61. package/src/lib/services/local-storage-manager-service/local-storage-manager.service.ts +421 -0
  62. package/src/lib/services/local-storage-manager-service/models/global-store-options.model.ts +30 -0
  63. package/{lib/services/local-storage-manager-service/models/index.d.ts → src/lib/services/local-storage-manager-service/models/index.ts} +2 -1
  64. package/src/lib/services/local-storage-manager-service/models/setting-options.model.ts +30 -0
  65. package/src/lib/services/local-storage-manager-service/models/storage-data.model.ts +24 -0
  66. package/src/lib/services/local-storage-manager-service/models/storage-option.model.ts +29 -0
  67. package/src/lib/services/local-storage-manager-service/models/storage-type.enum.ts +5 -0
  68. package/src/lib/services/request-manager-services/README.md +268 -0
  69. package/src/lib/services/request-manager-services/http-manager.service.spec.ts +230 -0
  70. package/src/lib/services/request-manager-services/http-manager.service.ts +274 -0
  71. package/{lib/services/request-manager-services/index.d.ts → src/lib/services/request-manager-services/index.ts} +2 -0
  72. package/src/lib/services/request-manager-services/request.service.ts +261 -0
  73. package/src/lib/services/request-manager-services/rxjs-operators/countdown.ts +17 -0
  74. package/src/lib/services/request-manager-services/rxjs-operators/delay-retry.ts +16 -0
  75. package/src/lib/services/request-manager-services/rxjs-operators/request-polling.ts +21 -0
  76. package/src/lib/services/request-manager-services/rxjs-operators/request-streaming.ts +32 -0
  77. package/src/lib/services/request-manager-state-service/http-manager-state.store.ts +402 -0
  78. package/{lib/services/request-manager-state-service/index.d.ts → src/lib/services/request-manager-state-service/index.ts} +1 -0
  79. package/src/lib/services/request-manager-state-service/models/api-request.model.ts +50 -0
  80. package/{lib/services/request-manager-state-service/models/index.d.ts → src/lib/services/request-manager-state-service/models/index.ts} +1 -0
  81. package/src/lib/services/request-manager-state-service/models/request-options.model.ts +22 -0
  82. package/src/lib/services/utils/app.service.spec.ts +25 -0
  83. package/src/lib/services/utils/app.service.ts +21 -0
  84. package/src/lib/services/utils/encryption/README.md +79 -0
  85. package/src/lib/services/utils/encryption/asymmetrical-encryption.service.ts +282 -0
  86. package/src/lib/services/utils/encryption/encryption-test.service.ts +39 -0
  87. package/{lib/services/utils/encryption/index.d.ts → src/lib/services/utils/encryption/index.ts} +2 -0
  88. package/src/lib/services/utils/encryption/random.ts +69 -0
  89. package/src/lib/services/utils/encryption/symmetrical-encryption.service.ts +93 -0
  90. package/src/lib/services/utils/headers.service.spec.ts +80 -0
  91. package/src/lib/services/utils/headers.service.ts +18 -0
  92. package/{lib/services/utils/index.d.ts → src/lib/services/utils/index.ts} +2 -0
  93. package/src/lib/services/utils/object-merger.service.spec.ts +16 -0
  94. package/src/lib/services/utils/object-merger.service.ts +60 -0
  95. package/src/lib/services/utils/path-query.service.spec.ts +117 -0
  96. package/src/lib/services/utils/path-query.service.ts +69 -0
  97. package/src/lib/services/utils/utils.service.spec.ts +164 -0
  98. package/src/lib/services/utils/utils.service.ts +192 -0
  99. package/src/public-api.ts +14 -0
  100. package/tsconfig.lib.json +32 -0
  101. package/tsconfig.lib.prod.json +10 -0
  102. package/tsconfig.spec.json +14 -0
  103. package/esm2022/http-request-manager.mjs +0 -5
  104. package/esm2022/lib/http-request-manager.module.mjs +0 -146
  105. package/esm2022/lib/http-request-services-demo/http-request-services-demo.component.mjs +0 -41
  106. package/esm2022/lib/http-request-services-demo/local-storage-demo/local-storage-demo.component.mjs +0 -173
  107. package/esm2022/lib/http-request-services-demo/request-manager-demo/file-downloader/download-file/download-file.component.mjs +0 -80
  108. package/esm2022/lib/http-request-services-demo/request-manager-demo/file-downloader/file-download.module.mjs +0 -42
  109. package/esm2022/lib/http-request-services-demo/request-manager-demo/file-downloader/file-downloader.component.mjs +0 -88
  110. package/esm2022/lib/http-request-services-demo/request-manager-demo/file-downloader/models/download-labels-model.mjs +0 -11
  111. package/esm2022/lib/http-request-services-demo/request-manager-demo/file-downloader/spinner/spinner.component.mjs +0 -29
  112. package/esm2022/lib/http-request-services-demo/request-manager-demo/models/sample-ai-prompt.mjs +0 -9
  113. package/esm2022/lib/http-request-services-demo/request-manager-demo/models/sample-client-info.mjs +0 -12
  114. package/esm2022/lib/http-request-services-demo/request-manager-demo/models/sample-mapper-client-info.mjs +0 -14
  115. package/esm2022/lib/http-request-services-demo/request-manager-demo/request-manager-demo.component.mjs +0 -315
  116. package/esm2022/lib/http-request-services-demo/request-manager-state-demo/request-manager-state-demo.component.mjs +0 -270
  117. package/esm2022/lib/http-request-services-demo/request-manager-state-demo/services/state-manager-demo.service.mjs +0 -67
  118. package/esm2022/lib/index.mjs +0 -4
  119. package/esm2022/lib/interceptors/credentials.interceptor.mjs +0 -14
  120. package/esm2022/lib/interceptors/index.mjs +0 -5
  121. package/esm2022/lib/interceptors/models/error-settings.model.mjs +0 -10
  122. package/esm2022/lib/interceptors/proxy-debugger.interceptor.mjs +0 -47
  123. package/esm2022/lib/interceptors/request-error.interceptor.mjs +0 -49
  124. package/esm2022/lib/interceptors/request-header.interceptor.mjs +0 -41
  125. package/esm2022/lib/models/config-http-options.model.mjs +0 -18
  126. package/esm2022/lib/models/config-local-storage-options.model.mjs +0 -12
  127. package/esm2022/lib/models/config-options.model.mjs +0 -12
  128. package/esm2022/lib/models/config-token.model.mjs +0 -8
  129. package/esm2022/lib/models/data-type.enum.mjs +0 -7
  130. package/esm2022/lib/models/database-storage.model.mjs +0 -10
  131. package/esm2022/lib/models/index.mjs +0 -7
  132. package/esm2022/lib/models/retry-options.model.mjs +0 -10
  133. package/esm2022/lib/services/index.mjs +0 -6
  134. package/esm2022/lib/services/local-storage-manager-service/index.mjs +0 -3
  135. package/esm2022/lib/services/local-storage-manager-service/local-storage-manager.service.mjs +0 -302
  136. package/esm2022/lib/services/local-storage-manager-service/models/global-store-options.model.mjs +0 -13
  137. package/esm2022/lib/services/local-storage-manager-service/models/index.mjs +0 -6
  138. package/esm2022/lib/services/local-storage-manager-service/models/setting-options.model.mjs +0 -13
  139. package/esm2022/lib/services/local-storage-manager-service/models/storage-data.model.mjs +0 -10
  140. package/esm2022/lib/services/local-storage-manager-service/models/storage-option.model.mjs +0 -12
  141. package/esm2022/lib/services/local-storage-manager-service/models/storage-type.enum.mjs +0 -7
  142. package/esm2022/lib/services/request-manager-services/http-manager.service.mjs +0 -207
  143. package/esm2022/lib/services/request-manager-services/index.mjs +0 -5
  144. package/esm2022/lib/services/request-manager-services/request.service.mjs +0 -189
  145. package/esm2022/lib/services/request-manager-services/rxjs-operators/countdown.mjs +0 -9
  146. package/esm2022/lib/services/request-manager-services/rxjs-operators/delay-retry.mjs +0 -10
  147. package/esm2022/lib/services/request-manager-services/rxjs-operators/index.mjs +0 -5
  148. package/esm2022/lib/services/request-manager-services/rxjs-operators/request-polling.mjs +0 -14
  149. package/esm2022/lib/services/request-manager-services/rxjs-operators/request-streaming.mjs +0 -19
  150. package/esm2022/lib/services/request-manager-state-service/http-manager-state.store.mjs +0 -267
  151. package/esm2022/lib/services/request-manager-state-service/index.mjs +0 -3
  152. package/esm2022/lib/services/request-manager-state-service/models/api-request.model.mjs +0 -20
  153. package/esm2022/lib/services/request-manager-state-service/models/index.mjs +0 -3
  154. package/esm2022/lib/services/request-manager-state-service/models/request-options.model.mjs +0 -10
  155. package/esm2022/lib/services/utils/app.service.mjs +0 -26
  156. package/esm2022/lib/services/utils/encryption/asymmetrical-encryption.service.mjs +0 -186
  157. package/esm2022/lib/services/utils/encryption/encryption-test.service.mjs +0 -35
  158. package/esm2022/lib/services/utils/encryption/index.mjs +0 -4
  159. package/esm2022/lib/services/utils/encryption/random.mjs +0 -52
  160. package/esm2022/lib/services/utils/encryption/symmetrical-encryption.service.mjs +0 -77
  161. package/esm2022/lib/services/utils/headers.service.mjs +0 -21
  162. package/esm2022/lib/services/utils/index.mjs +0 -6
  163. package/esm2022/lib/services/utils/object-merger.service.mjs +0 -50
  164. package/esm2022/lib/services/utils/path-query.service.mjs +0 -54
  165. package/esm2022/lib/services/utils/utils.service.mjs +0 -155
  166. package/esm2022/public-api.mjs +0 -7
  167. package/fesm2022/http-request-manager.mjs +0 -3102
  168. package/fesm2022/http-request-manager.mjs.map +0 -1
  169. package/http-request-manager-15.0.19.tgz +0 -0
  170. package/index.d.ts +0 -5
  171. package/lib/http-request-manager.module.d.ts +0 -33
  172. package/lib/http-request-services-demo/http-request-services-demo.component.d.ts +0 -24
  173. package/lib/http-request-services-demo/local-storage-demo/local-storage-demo.component.d.ts +0 -56
  174. package/lib/http-request-services-demo/request-manager-demo/file-downloader/download-file/download-file.component.d.ts +0 -26
  175. package/lib/http-request-services-demo/request-manager-demo/file-downloader/file-download.module.d.ts +0 -13
  176. package/lib/http-request-services-demo/request-manager-demo/file-downloader/file-downloader.component.d.ts +0 -27
  177. package/lib/http-request-services-demo/request-manager-demo/file-downloader/models/download-labels-model.d.ts +0 -12
  178. package/lib/http-request-services-demo/request-manager-demo/file-downloader/spinner/spinner.component.d.ts +0 -16
  179. package/lib/http-request-services-demo/request-manager-demo/models/sample-ai-prompt.d.ts +0 -8
  180. package/lib/http-request-services-demo/request-manager-demo/models/sample-client-info.d.ts +0 -14
  181. package/lib/http-request-services-demo/request-manager-demo/models/sample-mapper-client-info.d.ts +0 -14
  182. package/lib/http-request-services-demo/request-manager-demo/request-manager-demo.component.d.ts +0 -107
  183. package/lib/http-request-services-demo/request-manager-state-demo/request-manager-state-demo.component.d.ts +0 -122
  184. package/lib/http-request-services-demo/request-manager-state-demo/services/state-manager-demo.service.d.ts +0 -15
  185. package/lib/index.d.ts +0 -3
  186. package/lib/interceptors/credentials.interceptor.d.ts +0 -8
  187. package/lib/interceptors/models/error-settings.model.d.ts +0 -10
  188. package/lib/interceptors/proxy-debugger.interceptor.d.ts +0 -12
  189. package/lib/interceptors/request-error.interceptor.d.ts +0 -10
  190. package/lib/interceptors/request-header.interceptor.d.ts +0 -15
  191. package/lib/models/config-http-options.model.d.ts +0 -21
  192. package/lib/models/config-local-storage-options.model.d.ts +0 -13
  193. package/lib/models/config-options.model.d.ts +0 -12
  194. package/lib/models/data-type.enum.d.ts +0 -5
  195. package/lib/models/database-storage.model.d.ts +0 -10
  196. package/lib/models/index.d.ts +0 -6
  197. package/lib/models/retry-options.model.d.ts +0 -10
  198. package/lib/services/local-storage-manager-service/index.d.ts +0 -2
  199. package/lib/services/local-storage-manager-service/local-storage-manager.service.d.ts +0 -86
  200. package/lib/services/local-storage-manager-service/models/global-store-options.model.d.ts +0 -15
  201. package/lib/services/local-storage-manager-service/models/setting-options.model.d.ts +0 -15
  202. package/lib/services/local-storage-manager-service/models/storage-data.model.d.ts +0 -10
  203. package/lib/services/local-storage-manager-service/models/storage-option.model.d.ts +0 -13
  204. package/lib/services/local-storage-manager-service/models/storage-type.enum.d.ts +0 -5
  205. package/lib/services/request-manager-services/http-manager.service.d.ts +0 -41
  206. package/lib/services/request-manager-services/request.service.d.ts +0 -27
  207. package/lib/services/request-manager-services/rxjs-operators/countdown.d.ts +0 -2
  208. package/lib/services/request-manager-services/rxjs-operators/delay-retry.d.ts +0 -2
  209. package/lib/services/request-manager-services/rxjs-operators/request-polling.d.ts +0 -7
  210. package/lib/services/request-manager-services/rxjs-operators/request-streaming.d.ts +0 -2
  211. package/lib/services/request-manager-state-service/http-manager-state.store.d.ts +0 -51
  212. package/lib/services/request-manager-state-service/models/api-request.model.d.ts +0 -27
  213. package/lib/services/request-manager-state-service/models/request-options.model.d.ts +0 -10
  214. package/lib/services/utils/app.service.d.ts +0 -8
  215. package/lib/services/utils/encryption/asymmetrical-encryption.service.d.ts +0 -17
  216. package/lib/services/utils/encryption/encryption-test.service.d.ts +0 -10
  217. package/lib/services/utils/encryption/random.d.ts +0 -7
  218. package/lib/services/utils/encryption/symmetrical-encryption.service.d.ts +0 -14
  219. package/lib/services/utils/headers.service.d.ts +0 -10
  220. package/lib/services/utils/object-merger.service.d.ts +0 -12
  221. package/lib/services/utils/path-query.service.d.ts +0 -11
  222. package/lib/services/utils/utils.service.d.ts +0 -24
  223. package/public-api.d.ts +0 -3
  224. /package/{lib/services/request-manager-services/rxjs-operators/index.d.ts → src/lib/services/request-manager-services/rxjs-operators/index.ts} +0 -0
@@ -0,0 +1,282 @@
1
+ import { Injectable } from '@angular/core';
2
+
3
+ import { BehaviorSubject, EMPTY, Observable, from, of } from 'rxjs';
4
+ import { map, catchError } from 'rxjs/operators';
5
+
6
+ @Injectable({
7
+ providedIn: 'root'
8
+ })
9
+ export class AsymmetricalEncryptionService {
10
+
11
+ constructor() {}
12
+
13
+ generateKeyPair(modulusLength = 2048): Observable<CryptoKeyPair> {
14
+
15
+ // modulusLength - 1024, 2048, 4096
16
+ // hash - SHA-256
17
+
18
+ return from(crypto.subtle.generateKey(
19
+ {
20
+ name: "RSA-OAEP",
21
+ modulusLength,
22
+ publicExponent: new Uint8Array([1, 0, 1]), // 65537
23
+ hash: { name: "SHA-256" }
24
+ },
25
+ true, // Extractable keys
26
+ ["encrypt", "decrypt"]
27
+ ))
28
+
29
+ }
30
+
31
+ encryptData(publicKey: CryptoKey, data: string) {
32
+
33
+ const encodedData = new TextEncoder().encode(data)
34
+
35
+ return from(crypto.subtle.encrypt(
36
+ {
37
+ name: "RSA-OAEP"
38
+ },
39
+ publicKey,
40
+ encodedData
41
+ )).pipe(
42
+ map(enc => this.arrayBufferToBase64(enc))
43
+ )
44
+
45
+ }
46
+
47
+ decryptData(privateKey: CryptoKey, encryptedData: string) {
48
+
49
+ const encStr = this.base64ToArrayBuffer(encryptedData)
50
+
51
+ return from(crypto.subtle.decrypt(
52
+ {
53
+ name: "RSA-OAEP"
54
+ },
55
+ privateKey,
56
+ encStr
57
+ ).then(decryptedData => {
58
+ return new TextDecoder().decode(decryptedData)
59
+ }))
60
+
61
+ }
62
+
63
+ pemToArrayBuffer(pem: string): ArrayBuffer {
64
+
65
+ const b64 = pem.replace(/(-----BEGIN (RSA )?(PRIVATE|PUBLIC) KEY-----|-----END (RSA )?(PRIVATE|PUBLIC) KEY-----|\n)/g, '')
66
+ const binaryString = atob(b64)
67
+ const len = binaryString.length
68
+ const buffer = new ArrayBuffer(len)
69
+ const view = new Uint8Array(buffer)
70
+
71
+ for (let i = 0; i < len; i++) {
72
+ view[i] = binaryString.charCodeAt(i)
73
+ }
74
+
75
+ return buffer
76
+
77
+ }
78
+
79
+ base64ToArrayBuffer(base64: string): ArrayBuffer {
80
+
81
+ const binaryString = atob(base64);
82
+ const len = binaryString.length;
83
+ const buffer = new ArrayBuffer(len);
84
+ const view = new Uint8Array(buffer);
85
+
86
+ for (let i = 0; i < len; i++) {
87
+ view[i] = binaryString.charCodeAt(i);
88
+ }
89
+
90
+ return buffer;
91
+ }
92
+
93
+ arrayBufferToBase64(buffer: ArrayBuffer): string {
94
+
95
+ let binary = '';
96
+ const bytes = new Uint8Array(buffer);
97
+ const len = bytes.byteLength;
98
+
99
+ for (let i = 0; i < len; i++) {
100
+ binary += String.fromCharCode(bytes[i]);
101
+ }
102
+
103
+ return window.btoa(binary)
104
+
105
+ }
106
+
107
+ base64ToPEM(base64Key: string, publicKey = true) {
108
+
109
+ const keyType = (publicKey) ? 'PUBLIC' : 'PRIVATE'
110
+
111
+ const header = `-----BEGIN ${keyType} KEY-----\n`
112
+ const footer = `\n-----END ${keyType} KEY-----`
113
+
114
+ const keyBody = base64Key.match(/.{1,64}/g)?.join("\n") || ""
115
+
116
+ return header + keyBody + footer
117
+
118
+ }
119
+
120
+ pemToCryptoKey(
121
+ pem: string,
122
+ algorithm: RsaHashedKeyGenParams,
123
+ extractable: boolean,
124
+ keyUsages: KeyUsage[],
125
+ format: any = "pkcs8" //"raw" | "pkcs8" | "spki"
126
+ ) {
127
+
128
+ const buffer = this.pemToArrayBuffer(pem);
129
+
130
+ console.log('buffer found ', buffer);
131
+
132
+ return from(crypto.subtle.importKey(
133
+ format,
134
+ buffer,
135
+ algorithm,
136
+ extractable,
137
+ keyUsages
138
+ ))
139
+
140
+ }
141
+
142
+ // TESTING
143
+
144
+ testGenerateKeys(): Observable<string> {
145
+ const testSequence: BehaviorSubject<string> = new BehaviorSubject<string>("");
146
+ const testSequence$: Observable<string> = testSequence.asObservable();
147
+ testSequence.next("Test Generating Keys");
148
+
149
+ // GENERATE KEYS
150
+ this.generateKeyPair().subscribe((data) => {
151
+
152
+ console.log("GEN-GENERATED KEYS: ", data)
153
+
154
+ crypto.subtle.exportKey('spki', data.publicKey)
155
+ .then(key => {
156
+ const publicKeyBase64 = this.arrayBufferToBase64(key);
157
+ console.log("GEN-EXPORT PUBLIC KEY: ", this.base64ToPEM(publicKeyBase64, true));
158
+ })
159
+
160
+ crypto.subtle.exportKey('pkcs8', data.privateKey)
161
+ .then(key => {
162
+ const privateKeyBase64 = this.arrayBufferToBase64(key);
163
+ console.log("GEN-EXPORT PRIVATE KEY: ", this.base64ToPEM(privateKeyBase64, false));
164
+ });
165
+
166
+ // TEST WITH GENERATED KEYS
167
+ this.encryptData(data.publicKey, "Sample Data here - Mike Bonifacio")
168
+ .subscribe((enc) => {
169
+
170
+ console.log("GEN-ENCRYPT==>: ", enc)
171
+
172
+ this.decryptData(data.privateKey, enc).subscribe((dec) => {
173
+ testSequence.next('Test Passed');
174
+ testSequence.complete();
175
+ })
176
+
177
+ })
178
+
179
+ })
180
+ return testSequence$;
181
+
182
+ }
183
+
184
+ testDecryptionWithKeys(): Observable<string> {
185
+ const testSequence: BehaviorSubject<string> = new BehaviorSubject<string>("");
186
+ const testSequence$: Observable<string> = testSequence.asObservable();
187
+ testSequence.next("Test Generating Keys");
188
+
189
+ const privateKey = `-----BEGIN PRIVATE KEY-----
190
+ MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQDKVBkCWNb9eHVF
191
+ twAA5mdAyvXFix3WavdrsoYRkvtCl8ogDBQf8f6N0bRkDF1zcVHRrNAEyozXDtuD
192
+ kFgSiivBFREI7fiS3sOvduq6FaGXzX0IY6oaVMu8oOPgDvC0yvoohR+0Qxq2d6lP
193
+ SPyHeKQaxP4KxzCJJzB1XAcbd2eFzUUDv25mNlwdVkmW8FI/sAxnJLgPTW78dzfX
194
+ Ddfk+nxdIqxVKSLATnL0kMN7aGJx24UozioAIpzvvvF5/+7HTd1gi6NeCqrAYr3g
195
+ iP364AE26CFwFvHnafO9uNQhlQ+uiNnOoInXByfFGVP+RidSpfLzaxDjs6RDwpol
196
+ h098btONAgMBAAECggEAAVhHM2OD5IkUtuowwcKNaCTKGmrClRE3gMuzJeBsSJEy
197
+ uAReUFILZylcnhegDytSti2vDA9T7xqtO6CU0p3V8LpU89JMOPRb/deirI4UXSpx
198
+ xbNyjirOO6bnrNlOWfKexdQQsikYPzF2iM1Scpr1u9ZDCHZOl1ZYSrkve5My4coP
199
+ 3Gx6tTBqL0jQBfcpf4ES8BH3JSawR/MgqzDS74+bI2VH+kvuPAC1L4fBgaV3VUv0
200
+ nFzim5A3s5VaXPgJbEIghP9BkYGFkeT9ma3nliEZWc96AzsmowFn1ayCvrNVPo9R
201
+ ECD2NnttBiCJZt3H93sR9+OTeA8Bls+aZGlKd5mLAQKBgQDpf8nIYUm/Zmls7/lQ
202
+ QBUSGHEYrbjNsEejQsPgNDtg2EVSxdUkvTn7Wb+HExTk09Z5bNvhaO2532/FH9y8
203
+ ahSXafiMXpfR2olwXdOB9yXXl4F5C0LGnmzGim4OSeWzAX0JCL470KaS0QN3EmoG
204
+ 9F0YCfMnZXNTweSSx4xvlO6ggQKBgQDd01uIolm7z1DIWCwNERAXP2GDwcvxyzYK
205
+ YqJfKDeHt2t6yIzZMMotnPDy+OlcdGspIIHkB5a+SZN5Nt7DUKg/MnyOZ3KbVq41
206
+ k7dR4Ka3LRnGkesy7lSr7ef1rfquyR75OXJQcPWvkFcLu0TMiQhvptatZ8VN+F4n
207
+ fDQELRotDQKBgQCgN+AUT7VT0QjcCBnRV/ddUEoiPenFsYSmYMSYzh5ESIHg1wB2
208
+ 0iS79Iw4Of6nOTg8X1bM57vfQ5Kk90T2P+/bKYqzfqC8DTErWiYsUpKzyTC9Bt4N
209
+ /Vz0Kr5zrX8ggg/yp/4oevYhXav8AzWfigNq4EDpMnKc8TlPAf+5/L50gQKBgQC2
210
+ mLPhPhr1gUszD3l7bA89w7uGlLFHoQoj9FtKTzWervp3QLzIT+QtNeIVb5XQuDg5
211
+ y3uAdEq+6pvNjMBEMJG+K9Xh9v+dJPYUPjsJ2A4D/MkZ7qWX8B2cxSJK1uLim8W2
212
+ S3ZxBvsGgJ9WldmlMCvUlJZkeWYtr4P5psC+q02/xQKBgQCDII/jcV2+lRM2iNTe
213
+ vBijZSaNMEWOK/Y+/HFK8GYKXnB+xNWhrm8rKgWGzpDJAUPMh9Tt+leW9LKEBuzF
214
+ Y1bGblmGm1zsPWpIx05Fdtv9eOJmFnXbGzIsYyhadZnPcQOWhqxtpVxSuul0Jc7Q
215
+ XNq4qPaPXhbQAshgtyBt75DMkw==
216
+ -----END PRIVATE KEY-----`
217
+
218
+ const pubKey = `-----BEGIN PUBLIC KEY-----
219
+ MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAylQZAljW/Xh1RbcAAOZn
220
+ QMr1xYsd1mr3a7KGEZL7QpfKIAwUH/H+jdG0ZAxdc3FR0azQBMqM1w7bg5BYEoor
221
+ wRURCO34kt7Dr3bquhWhl819CGOqGlTLvKDj4A7wtMr6KIUftEMatnepT0j8h3ik
222
+ GsT+CscwiScwdVwHG3dnhc1FA79uZjZcHVZJlvBSP7AMZyS4D01u/Hc31w3X5Pp8
223
+ XSKsVSkiwE5y9JDDe2hicduFKM4qACKc777xef/ux03dYIujXgqqwGK94Ij9+uAB
224
+ NughcBbx52nzvbjUIZUProjZzqCJ1wcnxRlT/kYnUqXy82sQ47OkQ8KaJYdPfG7T
225
+ jQIDAQAB
226
+ -----END PUBLIC KEY-----`
227
+
228
+ const algorithm: RsaHashedKeyGenParams = {
229
+ name: "RSA-OAEP",
230
+ modulusLength: 2048,
231
+ publicExponent: new Uint8Array([1, 0, 1]),
232
+ hash: "SHA-256"
233
+ };
234
+
235
+ // ENCRYPT
236
+ this.pemToCryptoKey(
237
+ pubKey,
238
+ algorithm,
239
+ true,
240
+ ["encrypt"],
241
+ "spki"
242
+ ).subscribe((keyPublic) => {
243
+
244
+ // console.log("PUBLIC KEY: ", keyPublic)
245
+
246
+ this.encryptData(keyPublic, "Sample Data here - Mike Bonifacio")
247
+ .subscribe((str) => {
248
+ console.log("ENCRYPTED STRING: ", str);
249
+ testSequence.next('encrypted string success');
250
+ })
251
+
252
+ })
253
+
254
+ const enc = "r7UOuEGBZ6jbVTOIBuv9jFOEtRiedmS27hfW40k7XKCTsQ5VhWup0qu2BA2ANZaGKii/uehJ/RSPiyfGbJ6leJrat0mA1hPqH/XodaBzLMDigvdYM1NSXFZMDa40OpLUIXbPlAvybjcGu7Bal+LMA8htHrFu/OmM/fHI66xOzzpuXSYx0OkWjtY81rUQ1FFkvrkx2jGFPZ0p+Nw/v3Q4cJnet6V63vCueFlD749VMcVXo7pvz4AIPpB+IOy3kbxaYTPakLVioJERU6GFMXWkECuRvohhS9CETcORZtRVRkvhcHk3lxgIhfqojUKYgD6K5dDELDPsWIS+iTG1XIQIlg==";
255
+
256
+ // DECRYPTION
257
+ this.pemToCryptoKey(
258
+ privateKey,
259
+ algorithm,
260
+ false,
261
+ ["decrypt"],
262
+ "pkcs8"
263
+ ).subscribe((key) => {
264
+
265
+ // console.log("DECRYPT ===", key)
266
+
267
+ this.decryptData(key, enc)
268
+ .pipe(
269
+ catchError(err => {
270
+ console.log("ERROR: ", err);
271
+ return EMPTY
272
+ })
273
+ ).subscribe((str) => {
274
+ console.log("DECRYPTED STRING: ", str);
275
+ testSequence.next('decrypted string success');
276
+ })
277
+
278
+ })
279
+
280
+ return testSequence$;
281
+ };
282
+ }
@@ -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
+ }
@@ -1,3 +1,5 @@
1
1
  export * from "./asymmetrical-encryption.service";
2
2
  export * from './symmetrical-encryption.service';
3
+
3
4
  export * from './random';
5
+
@@ -0,0 +1,69 @@
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
+
@@ -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
+ }
@@ -2,4 +2,6 @@ export * from './app.service';
2
2
  export * from './headers.service';
3
3
  export * from './path-query.service';
4
4
  export * from './utils.service';
5
+
5
6
  export * from './encryption/index';
7
+
@@ -0,0 +1,16 @@
1
+ /* tslint:disable:no-unused-variable */
2
+
3
+ import { TestBed, async, inject } from '@angular/core/testing';
4
+ import { ObjectMergerService } from './object-merger.service';
5
+
6
+ describe('Service: ObjectMerger', () => {
7
+ beforeEach(() => {
8
+ TestBed.configureTestingModule({
9
+ providers: [ObjectMergerService]
10
+ });
11
+ });
12
+
13
+ it('should ...', inject([ObjectMergerService], (service: ObjectMergerService) => {
14
+ expect(service).toBeTruthy();
15
+ }));
16
+ });
@@ -0,0 +1,60 @@
1
+ import { Inject, Injectable, Optional } from '@angular/core';
2
+
3
+ import { ApiRequest } from '../request-manager-state-service/models';
4
+ import { SettingOptions } from '../local-storage-manager-service';
5
+
6
+ import { CONFIG_SETTINGS_TOKEN } from '../../models/config-token.model';
7
+ import { ConfigHTTPOptions, ConfigOptions, LocalStorageOptions } from '../request-manager-services';
8
+
9
+ @Injectable({
10
+ providedIn: 'root'
11
+ })
12
+ export class ObjectMergerService {
13
+
14
+ constructor(@Inject(CONFIG_SETTINGS_TOKEN) @Optional() private configOptions?: ConfigOptions) {
15
+ if (!this.configOptions) this.configOptions = ConfigOptions.adapt()
16
+ }
17
+
18
+ mergeOptions(options = ApiRequest.adapt()) {
19
+
20
+ const configForRoot = (this.configOptions?.httpRequestOptions) ? this.configOptions.httpRequestOptions : ConfigHTTPOptions.adapt()
21
+ const mergedOptions = ApiRequest.adapt(options)
22
+
23
+ mergedOptions.server = (options && options.server === '') ? configForRoot?.server || '' : options.server
24
+
25
+ mergedOptions.path = [ ...options.path || [], ...configForRoot?.path || [] ]
26
+
27
+ mergedOptions.headers = { ...options.headers || {}, ...configForRoot?.headers || {} }
28
+
29
+ mergedOptions.retry = (options && (options?.retry?.times !== 0 || options?.retry?.delay !== 3)) ? options.retry : configForRoot?.retry || { times: 0, delay: 3 };
30
+
31
+ mergedOptions.polling = (options && options?.polling !== 0) ? options.polling : configForRoot?.polling || 0;
32
+
33
+ mergedOptions.displayError = (options && options?.displayError) ? options.displayError : configForRoot?.displayError || false;
34
+
35
+ mergedOptions.stream = (options && options?.stream) ? options.stream : configForRoot?.stream || false;
36
+
37
+ return mergedOptions;
38
+
39
+ }
40
+
41
+ mergeStorageOptions(options = SettingOptions.adapt()) {
42
+
43
+ const configForRoot = (this.configOptions?.LocalStorageOptions) ? this.configOptions.LocalStorageOptions : LocalStorageOptions.adapt()
44
+ const configForRootOptions = configForRoot.options || LocalStorageOptions.adapt().options
45
+
46
+ const mergedOptions = SettingOptions.adapt(options)
47
+
48
+ mergedOptions.storage = (options && options.storage === 0) ? configForRootOptions?.storage || 0 : options.storage
49
+
50
+ mergedOptions.expires = (options && options.expires === 0) ? configForRootOptions?.expires || 0 : options.expires
51
+
52
+ mergedOptions.expiresIn = (options && options.expiresIn === '') ? configForRootOptions?.expiresIn || '' : options.expiresIn
53
+
54
+ mergedOptions.encrypted = (options && !options.encrypted) ? configForRootOptions?.encrypted || false : options.encrypted
55
+
56
+ return mergedOptions;
57
+
58
+ }
59
+
60
+ }