@sdcorejs/angular 20.1.6 → 20.2.1

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 (213) hide show
  1. package/README.md +10 -0
  2. package/assets/scss/core/menu.scss +18 -0
  3. package/assets/scss/core/utilities/_misc.scss +15 -0
  4. package/assets/scss/sd-core.scss +1 -0
  5. package/components/anchor/index.d.ts +3 -1
  6. package/components/api-contract-builder/index.d.ts +694 -0
  7. package/components/badge/index.d.ts +2 -0
  8. package/components/ckeditor-styles/index.d.ts +1 -1
  9. package/components/form-generic/index.d.ts +44 -33
  10. package/components/import-excel/index.d.ts +1 -0
  11. package/components/index.d.ts +7 -1
  12. package/components/mini-editor/index.d.ts +1 -1
  13. package/components/modal/index.d.ts +3 -2
  14. package/components/modal-resizable/index.d.ts +92 -0
  15. package/components/org-chart/index.d.ts +6 -0
  16. package/components/preview/index.d.ts +1 -0
  17. package/components/query-bar/index.d.ts +55 -17
  18. package/components/query-builder/index.d.ts +150 -98
  19. package/components/section/index.d.ts +5 -0
  20. package/components/tab-router/index.d.ts +19 -19
  21. package/components/table/index.d.ts +251 -109
  22. package/components/tree/index.d.ts +48 -30
  23. package/components/upload-file/index.d.ts +6 -3
  24. package/configurations/index.d.ts +1 -2
  25. package/fesm2022/sdcorejs-angular-components-anchor.mjs +37 -13
  26. package/fesm2022/sdcorejs-angular-components-anchor.mjs.map +1 -1
  27. package/fesm2022/sdcorejs-angular-components-api-contract-builder.mjs +3417 -0
  28. package/fesm2022/sdcorejs-angular-components-api-contract-builder.mjs.map +1 -0
  29. package/fesm2022/sdcorejs-angular-components-autoid-inspector.mjs +2 -2
  30. package/fesm2022/sdcorejs-angular-components-autoid-inspector.mjs.map +1 -1
  31. package/fesm2022/sdcorejs-angular-components-badge.mjs +27 -2
  32. package/fesm2022/sdcorejs-angular-components-badge.mjs.map +1 -1
  33. package/fesm2022/sdcorejs-angular-components-button.mjs +2 -2
  34. package/fesm2022/sdcorejs-angular-components-button.mjs.map +1 -1
  35. package/fesm2022/sdcorejs-angular-components-ckeditor-styles.mjs +1 -1
  36. package/fesm2022/sdcorejs-angular-components-ckeditor-styles.mjs.map +1 -1
  37. package/fesm2022/sdcorejs-angular-components-code-editor.mjs +3 -3
  38. package/fesm2022/sdcorejs-angular-components-code-editor.mjs.map +1 -1
  39. package/fesm2022/sdcorejs-angular-components-data-state.mjs +3 -3
  40. package/fesm2022/sdcorejs-angular-components-data-state.mjs.map +1 -1
  41. package/fesm2022/sdcorejs-angular-components-editor.mjs +2 -2
  42. package/fesm2022/sdcorejs-angular-components-editor.mjs.map +1 -1
  43. package/fesm2022/sdcorejs-angular-components-form-generic.mjs +324 -192
  44. package/fesm2022/sdcorejs-angular-components-form-generic.mjs.map +1 -1
  45. package/fesm2022/sdcorejs-angular-components-history.mjs +4 -4
  46. package/fesm2022/sdcorejs-angular-components-history.mjs.map +1 -1
  47. package/fesm2022/sdcorejs-angular-components-import-excel.mjs +13 -5
  48. package/fesm2022/sdcorejs-angular-components-import-excel.mjs.map +1 -1
  49. package/fesm2022/sdcorejs-angular-components-inform.mjs +3 -3
  50. package/fesm2022/sdcorejs-angular-components-inform.mjs.map +1 -1
  51. package/fesm2022/sdcorejs-angular-components-modal-resizable.mjs +164 -8
  52. package/fesm2022/sdcorejs-angular-components-modal-resizable.mjs.map +1 -1
  53. package/fesm2022/sdcorejs-angular-components-modal.mjs +30 -18
  54. package/fesm2022/sdcorejs-angular-components-modal.mjs.map +1 -1
  55. package/fesm2022/sdcorejs-angular-components-operator.mjs +2 -2
  56. package/fesm2022/sdcorejs-angular-components-operator.mjs.map +1 -1
  57. package/fesm2022/sdcorejs-angular-components-org-chart.mjs +60 -13
  58. package/fesm2022/sdcorejs-angular-components-org-chart.mjs.map +1 -1
  59. package/fesm2022/sdcorejs-angular-components-preview.mjs +27 -17
  60. package/fesm2022/sdcorejs-angular-components-preview.mjs.map +1 -1
  61. package/fesm2022/sdcorejs-angular-components-query-bar.mjs +192 -30
  62. package/fesm2022/sdcorejs-angular-components-query-bar.mjs.map +1 -1
  63. package/fesm2022/sdcorejs-angular-components-query-builder.mjs +187 -127
  64. package/fesm2022/sdcorejs-angular-components-query-builder.mjs.map +1 -1
  65. package/fesm2022/sdcorejs-angular-components-section.mjs +33 -2
  66. package/fesm2022/sdcorejs-angular-components-section.mjs.map +1 -1
  67. package/fesm2022/sdcorejs-angular-components-side-drawer.mjs +83 -24
  68. package/fesm2022/sdcorejs-angular-components-side-drawer.mjs.map +1 -1
  69. package/fesm2022/sdcorejs-angular-components-splitter.mjs +57 -21
  70. package/fesm2022/sdcorejs-angular-components-splitter.mjs.map +1 -1
  71. package/fesm2022/sdcorejs-angular-components-stepper.mjs +2 -2
  72. package/fesm2022/sdcorejs-angular-components-stepper.mjs.map +1 -1
  73. package/fesm2022/sdcorejs-angular-components-tab-router.mjs +68 -20
  74. package/fesm2022/sdcorejs-angular-components-tab-router.mjs.map +1 -1
  75. package/fesm2022/sdcorejs-angular-components-tab.mjs +3 -2
  76. package/fesm2022/sdcorejs-angular-components-tab.mjs.map +1 -1
  77. package/fesm2022/sdcorejs-angular-components-table.mjs +556 -268
  78. package/fesm2022/sdcorejs-angular-components-table.mjs.map +1 -1
  79. package/fesm2022/sdcorejs-angular-components-tree.mjs +80 -17
  80. package/fesm2022/sdcorejs-angular-components-tree.mjs.map +1 -1
  81. package/fesm2022/sdcorejs-angular-components-upload-file.mjs +48 -13
  82. package/fesm2022/sdcorejs-angular-components-upload-file.mjs.map +1 -1
  83. package/fesm2022/sdcorejs-angular-components.mjs +7 -1
  84. package/fesm2022/sdcorejs-angular-components.mjs.map +1 -1
  85. package/fesm2022/sdcorejs-angular-configurations.mjs.map +1 -1
  86. package/fesm2022/sdcorejs-angular-directives.mjs +45 -8
  87. package/fesm2022/sdcorejs-angular-directives.mjs.map +1 -1
  88. package/fesm2022/sdcorejs-angular-forms-autocomplete.mjs +40 -29
  89. package/fesm2022/sdcorejs-angular-forms-autocomplete.mjs.map +1 -1
  90. package/fesm2022/sdcorejs-angular-forms-checkbox.mjs +5 -5
  91. package/fesm2022/sdcorejs-angular-forms-checkbox.mjs.map +1 -1
  92. package/fesm2022/sdcorejs-angular-forms-chip-calendar.mjs +67 -50
  93. package/fesm2022/sdcorejs-angular-forms-chip-calendar.mjs.map +1 -1
  94. package/fesm2022/sdcorejs-angular-forms-chip.mjs +57 -43
  95. package/fesm2022/sdcorejs-angular-forms-chip.mjs.map +1 -1
  96. package/fesm2022/sdcorejs-angular-forms-date-range.mjs +232 -61
  97. package/fesm2022/sdcorejs-angular-forms-date-range.mjs.map +1 -1
  98. package/fesm2022/sdcorejs-angular-forms-date.mjs +96 -24
  99. package/fesm2022/sdcorejs-angular-forms-date.mjs.map +1 -1
  100. package/fesm2022/sdcorejs-angular-forms-datetime.mjs +131 -27
  101. package/fesm2022/sdcorejs-angular-forms-datetime.mjs.map +1 -1
  102. package/fesm2022/sdcorejs-angular-forms-entity-picker.mjs +40 -16
  103. package/fesm2022/sdcorejs-angular-forms-entity-picker.mjs.map +1 -1
  104. package/fesm2022/sdcorejs-angular-forms-input-color.mjs +16 -5
  105. package/fesm2022/sdcorejs-angular-forms-input-color.mjs.map +1 -1
  106. package/fesm2022/sdcorejs-angular-forms-input-number.mjs +24 -9
  107. package/fesm2022/sdcorejs-angular-forms-input-number.mjs.map +1 -1
  108. package/fesm2022/sdcorejs-angular-forms-input.mjs +58 -10
  109. package/fesm2022/sdcorejs-angular-forms-input.mjs.map +1 -1
  110. package/fesm2022/sdcorejs-angular-forms-models.mjs +227 -6
  111. package/fesm2022/sdcorejs-angular-forms-models.mjs.map +1 -1
  112. package/fesm2022/sdcorejs-angular-forms-radio.mjs +4 -4
  113. package/fesm2022/sdcorejs-angular-forms-radio.mjs.map +1 -1
  114. package/fesm2022/sdcorejs-angular-forms-select.mjs +136 -38
  115. package/fesm2022/sdcorejs-angular-forms-select.mjs.map +1 -1
  116. package/fesm2022/sdcorejs-angular-forms-switch.mjs +18 -3
  117. package/fesm2022/sdcorejs-angular-forms-switch.mjs.map +1 -1
  118. package/fesm2022/sdcorejs-angular-forms-textarea.mjs +51 -62
  119. package/fesm2022/sdcorejs-angular-forms-textarea.mjs.map +1 -1
  120. package/fesm2022/sdcorejs-angular-forms-time-range.mjs +57 -12
  121. package/fesm2022/sdcorejs-angular-forms-time-range.mjs.map +1 -1
  122. package/fesm2022/sdcorejs-angular-forms-time.mjs +16 -5
  123. package/fesm2022/sdcorejs-angular-forms-time.mjs.map +1 -1
  124. package/fesm2022/sdcorejs-angular-forms-tree-select.mjs +100 -9
  125. package/fesm2022/sdcorejs-angular-forms-tree-select.mjs.map +1 -1
  126. package/fesm2022/sdcorejs-angular-forms.mjs +91 -46
  127. package/fesm2022/sdcorejs-angular-forms.mjs.map +1 -1
  128. package/fesm2022/sdcorejs-angular-handlers.mjs +18 -3
  129. package/fesm2022/sdcorejs-angular-handlers.mjs.map +1 -1
  130. package/fesm2022/sdcorejs-angular-i18n.mjs +895 -68
  131. package/fesm2022/sdcorejs-angular-i18n.mjs.map +1 -1
  132. package/fesm2022/sdcorejs-angular-interceptors.mjs +87 -29
  133. package/fesm2022/sdcorejs-angular-interceptors.mjs.map +1 -1
  134. package/fesm2022/sdcorejs-angular-modules-auth.mjs +25 -15
  135. package/fesm2022/sdcorejs-angular-modules-auth.mjs.map +1 -1
  136. package/fesm2022/sdcorejs-angular-modules-icon.mjs +2 -2
  137. package/fesm2022/sdcorejs-angular-modules-icon.mjs.map +1 -1
  138. package/fesm2022/sdcorejs-angular-modules-keycloak.mjs +32 -3
  139. package/fesm2022/sdcorejs-angular-modules-keycloak.mjs.map +1 -1
  140. package/fesm2022/sdcorejs-angular-modules-layout.mjs +342 -111
  141. package/fesm2022/sdcorejs-angular-modules-layout.mjs.map +1 -1
  142. package/fesm2022/sdcorejs-angular-modules-permission.mjs +177 -40
  143. package/fesm2022/sdcorejs-angular-modules-permission.mjs.map +1 -1
  144. package/fesm2022/sdcorejs-angular-pipes.mjs +62 -28
  145. package/fesm2022/sdcorejs-angular-pipes.mjs.map +1 -1
  146. package/fesm2022/sdcorejs-angular-services-api.mjs +123 -13
  147. package/fesm2022/sdcorejs-angular-services-api.mjs.map +1 -1
  148. package/fesm2022/sdcorejs-angular-services-cache.mjs +53 -3
  149. package/fesm2022/sdcorejs-angular-services-cache.mjs.map +1 -1
  150. package/fesm2022/sdcorejs-angular-services-confirm.mjs +25 -73
  151. package/fesm2022/sdcorejs-angular-services-confirm.mjs.map +1 -1
  152. package/fesm2022/sdcorejs-angular-services-excel.mjs +12 -10
  153. package/fesm2022/sdcorejs-angular-services-excel.mjs.map +1 -1
  154. package/fesm2022/sdcorejs-angular-services-loading.mjs +75 -84
  155. package/fesm2022/sdcorejs-angular-services-loading.mjs.map +1 -1
  156. package/fesm2022/sdcorejs-angular-services-notify.mjs +46 -5
  157. package/fesm2022/sdcorejs-angular-services-notify.mjs.map +1 -1
  158. package/fesm2022/sdcorejs-angular-services-storage.mjs +4 -0
  159. package/fesm2022/sdcorejs-angular-services-storage.mjs.map +1 -1
  160. package/fesm2022/sdcorejs-angular-services.mjs +0 -1
  161. package/fesm2022/sdcorejs-angular-services.mjs.map +1 -1
  162. package/fesm2022/sdcorejs-angular-utilities-extensions.mjs +225 -80
  163. package/fesm2022/sdcorejs-angular-utilities-extensions.mjs.map +1 -1
  164. package/fesm2022/sdcorejs-angular-utilities-models.mjs +1 -63
  165. package/fesm2022/sdcorejs-angular-utilities-models.mjs.map +1 -1
  166. package/fesm2022/sdcorejs-angular.mjs +17 -10
  167. package/fesm2022/sdcorejs-angular.mjs.map +1 -1
  168. package/forms/autocomplete/index.d.ts +5 -2
  169. package/forms/chip-calendar/index.d.ts +10 -0
  170. package/forms/date/index.d.ts +13 -2
  171. package/forms/date-range/index.d.ts +14 -2
  172. package/forms/datetime/index.d.ts +13 -2
  173. package/forms/entity-picker/index.d.ts +9 -3
  174. package/forms/index.d.ts +22 -13
  175. package/forms/input/index.d.ts +3 -0
  176. package/forms/input-color/index.d.ts +4 -0
  177. package/forms/input-number/index.d.ts +3 -0
  178. package/forms/models/index.d.ts +119 -4
  179. package/forms/select/index.d.ts +27 -4
  180. package/forms/switch/index.d.ts +7 -1
  181. package/forms/textarea/index.d.ts +5 -3
  182. package/forms/time-range/index.d.ts +22 -1
  183. package/forms/tree-select/index.d.ts +36 -5
  184. package/i18n/index.d.ts +175 -16
  185. package/index.d.ts +11 -2
  186. package/interceptors/index.d.ts +13 -3
  187. package/modules/auth/index.d.ts +1 -1
  188. package/modules/keycloak/index.d.ts +1 -0
  189. package/modules/layout/index.d.ts +94 -28
  190. package/modules/permission/index.d.ts +66 -4
  191. package/package.json +36 -25
  192. package/pipes/index.d.ts +27 -5
  193. package/services/api/index.d.ts +21 -1
  194. package/services/cache/index.d.ts +11 -1
  195. package/services/index.d.ts +0 -1
  196. package/services/notify/index.d.ts +1 -1
  197. package/utilities/extensions/index.d.ts +83 -61
  198. package/utilities/models/index.d.ts +2 -76
  199. package/components/base/index.d.ts +0 -11
  200. package/components/document-builder/index.d.ts +0 -252
  201. package/fesm2022/sdcorejs-angular-components-base.mjs +0 -23
  202. package/fesm2022/sdcorejs-angular-components-base.mjs.map +0 -1
  203. package/fesm2022/sdcorejs-angular-components-document-builder.mjs +0 -5038
  204. package/fesm2022/sdcorejs-angular-components-document-builder.mjs.map +0 -1
  205. package/fesm2022/sdcorejs-angular-models.mjs +0 -6
  206. package/fesm2022/sdcorejs-angular-models.mjs.map +0 -1
  207. package/fesm2022/sdcorejs-angular-services-docx.mjs +0 -291
  208. package/fesm2022/sdcorejs-angular-services-docx.mjs.map +0 -1
  209. package/fesm2022/sdcorejs-angular-services-license.mjs +0 -97
  210. package/fesm2022/sdcorejs-angular-services-license.mjs.map +0 -1
  211. package/models/index.d.ts +0 -2
  212. package/services/docx/index.d.ts +0 -27
  213. package/services/license/index.d.ts +0 -12
@@ -4,6 +4,11 @@ import { SD_PERSISTENCE_STORAGE_ADAPTER, SdGraphSerializer, SdGraphIdentityCanon
4
4
  import { Utilities } from '@sdcorejs/utils/fns';
5
5
  import { BehaviorSubject } from 'rxjs';
6
6
 
7
+ /**
8
+ * Số entry `type: 'memory'` tối đa được giữ trước khi LRU đẩy entry cũ nhất ra.
9
+ * Ghi đè bằng `maxMemoryEntries` trên `SD_CACHE_CONFIG`.
10
+ */
11
+ const SD_CACHE_DEFAULT_MAX_MEMORY_ENTRIES = 500;
7
12
  const SD_CACHE_CONFIG = new InjectionToken('sd-cache.configuration');
8
13
  /** @deprecated Prefer globally safe unknown callbacks on `ISdCacheConfiguration`. */
9
14
  function adaptLegacySdCacheCallbacks(callbacks) {
@@ -50,6 +55,11 @@ class SdCacheService {
50
55
  #memoryEntries = new Map();
51
56
  #failedOwners = new Map();
52
57
  #maxFailedOwners = 256;
58
+ // why: #memoryEntries trước đây không có trần và TTL thì opt-in, trong khi SdApiService luôn gọi
59
+ // release() (không phải destroy()) sau mỗi request — release chỉ bỏ state của handle, KHÔNG bỏ
60
+ // entry memory. Hệ quả: mỗi URL được cache để lại một entry sống hết đời app → bộ nhớ tăng đơn
61
+ // điệu. Chặn bằng LRU có trần, cấu hình qua SD_CACHE_CONFIG.maxMemoryEntries.
62
+ #maxMemoryEntries = this.#normalizeMaxMemoryEntries(this.#configuration?.maxMemoryEntries);
53
63
  #destroyed = false;
54
64
  constructor() {
55
65
  this.#destroyRef.onDestroy(() => {
@@ -313,6 +323,13 @@ class SdCacheService {
313
323
  this.#broadcast(state);
314
324
  return undefined;
315
325
  }
326
+ // why: #readEntry (đường hydrate) là nơi DUY NHẤT từng refresh recency, mà hydrate chỉ chạy
327
+ // MỘT lần cho mỗi state. Handle còn mở thì mọi get()/has()/snapshot()/load() sau đó đi thẳng
328
+ // vào nhánh `state.hydrated` này và không đụng gì tới LRU → key nóng nhất (SdApiService giữ
329
+ // handle suốt request) tụt xuống đáy và bị evict trước cả key nguội. Chạm ở đây để mọi lượt
330
+ // ĐỌC đều tính là "vừa dùng", đúng như sd-cache.md cam kết.
331
+ if (normalized.area === 'memory')
332
+ this.#refreshMemoryRecency(normalized.ownerDigest);
316
333
  return state.entry;
317
334
  }
318
335
  #isExpired(entry, ttlMs) {
@@ -353,7 +370,10 @@ class SdCacheService {
353
370
  #readEntry(normalized) {
354
371
  if (normalized.area === 'memory') {
355
372
  const entry = this.#memoryEntries.get(normalized.ownerDigest);
356
- return entry ? { status: 'found', entry: this.#cloneEntry(entry, normalized.serializer) } : { status: 'absent' };
373
+ if (!entry)
374
+ return { status: 'absent' };
375
+ this.#touchMemoryEntry(normalized.ownerDigest, entry);
376
+ return { status: 'found', entry: this.#cloneEntry(entry, normalized.serializer) };
357
377
  }
358
378
  if (this.#failedOwners.has(normalized.ownerDigest))
359
379
  return { status: 'unavailable' };
@@ -424,7 +444,8 @@ class SdCacheService {
424
444
  }
425
445
  #writePersistent(normalized, entry) {
426
446
  if (normalized.area === 'memory') {
427
- this.#memoryEntries.set(normalized.ownerDigest, this.#cloneEntry(entry, normalized.serializer));
447
+ this.#touchMemoryEntry(normalized.ownerDigest, this.#cloneEntry(entry, normalized.serializer));
448
+ this.#evictMemoryOverflow();
428
449
  return true;
429
450
  }
430
451
  try {
@@ -533,6 +554,35 @@ class SdCacheService {
533
554
  if (oldest !== undefined)
534
555
  this.#failedOwners.delete(oldest);
535
556
  }
557
+ #normalizeMaxMemoryEntries(value) {
558
+ if (value === undefined || !Number.isFinite(value) || value < 1)
559
+ return SD_CACHE_DEFAULT_MAX_MEMORY_ENTRIES;
560
+ return Math.floor(value);
561
+ }
562
+ // why: Map giữ thứ tự chèn, nên delete-rồi-set đẩy key về cuối = "vừa dùng gần nhất".
563
+ // Đây là toàn bộ cơ chế recency của LRU, không cần cấu trúc dữ liệu phụ.
564
+ #touchMemoryEntry(ownerDigest, entry) {
565
+ this.#memoryEntries.delete(ownerDigest);
566
+ this.#memoryEntries.set(ownerDigest, entry);
567
+ }
568
+ // why: bản chỉ-đọc của #touchMemoryEntry — KHÔNG ghi lại value. Handle còn mở đọc từ
569
+ // state.entry (bản clone riêng), nên nếu key đã bị evict thì đọc không được phép hồi sinh nó:
570
+ // "handle còn mở vẫn phục vụ giá trị của chính nó dù entry chung đã bị evict" là hành vi đã
571
+ // ghi trong sd-cache.md.
572
+ #refreshMemoryRecency(ownerDigest) {
573
+ const entry = this.#memoryEntries.get(ownerDigest);
574
+ if (entry === undefined)
575
+ return;
576
+ this.#touchMemoryEntry(ownerDigest, entry);
577
+ }
578
+ #evictMemoryOverflow() {
579
+ while (this.#memoryEntries.size > this.#maxMemoryEntries) {
580
+ const oldest = this.#memoryEntries.keys().next().value;
581
+ if (oldest === undefined)
582
+ return;
583
+ this.#memoryEntries.delete(oldest);
584
+ }
585
+ }
536
586
  #cloneEntry(entry, serializer) {
537
587
  return { data: serializer.clone(entry.data), createdOn: new Date(entry.createdOn) };
538
588
  }
@@ -561,5 +611,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImpo
561
611
  * Generated bundle index. Do not edit.
562
612
  */
563
613
 
564
- export { SD_CACHE_CONFIG, SdCacheService, adaptLegacySdCacheCallbacks };
614
+ export { SD_CACHE_CONFIG, SD_CACHE_DEFAULT_MAX_MEMORY_ENTRIES, SdCacheService, adaptLegacySdCacheCallbacks };
565
615
  //# sourceMappingURL=sdcorejs-angular-services-cache.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"sdcorejs-angular-services-cache.mjs","sources":["../../../projects/sdcorejs-angular/services/cache/src/cache.model.ts","../../../projects/sdcorejs-angular/services/cache/src/cache.service.ts","../../../projects/sdcorejs-angular/services/cache/sdcorejs-angular-services-cache.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\nimport { SdPersistenceIdentityCanonicalizer, SdPersistenceSerializer } from '@sdcorejs/angular/services/persistence';\nimport { Observable } from 'rxjs';\n\nexport interface SdCacheOption<T = unknown> {\n type?: 'memory' | 'session' | 'local';\n hours?: number;\n ttlMs?: number;\n default?: T;\n args?: Readonly<Record<string, unknown>>;\n namespace?: string;\n version?: string | number;\n serializer?: SdPersistenceSerializer;\n identityCanonicalizer?: SdPersistenceIdentityCanonicalizer;\n}\n\nexport interface SdCache<T = unknown> {\n get: () => T | undefined;\n snapshot: () => SdCacheSnapshot<T>;\n set: (data: T) => void;\n has: () => boolean;\n remove: () => void;\n /** Releases only this facade while preserving its backing cache entry. */\n release: () => void;\n destroy: () => void;\n observer: Observable<T | undefined>;\n load: (callback: () => Promise<T>) => Promise<T>;\n}\n\nexport type SdCacheSnapshot<T> = { present: false } | { present: true; value: T };\n\nexport interface SdCacheWithDefault<T> extends Omit<SdCache<T>, 'get' | 'observer'> {\n get: () => T;\n observer: Observable<T>;\n}\n\nexport interface SdCacheStoredValue<T = unknown> {\n data: T;\n createdOn: Date;\n}\n\nexport type SdCacheSetCallback = (key: string, value: SdCacheStoredValue<unknown>, option?: SdCacheOption<unknown>) => Promise<void> | void;\n\nexport type SdCacheGetCallback = (key: string, option?: SdCacheOption<unknown>) => Promise<SdCacheStoredValue<unknown> | undefined>;\n\nexport type SdCacheRemoveCallback = (key: string, option?: SdCacheOption<unknown>) => Promise<void> | void;\n\nexport interface ISdCacheConfiguration {\n convertKey?: (key: string) => string;\n namespace?: string;\n version?: string | number;\n serializer?: SdPersistenceSerializer;\n identityCanonicalizer?: SdPersistenceIdentityCanonicalizer;\n set?: SdCacheSetCallback;\n get?: SdCacheGetCallback;\n remove?: SdCacheRemoveCallback;\n}\n\nexport const SD_CACHE_CONFIG = new InjectionToken<ISdCacheConfiguration>('sd-cache.configuration');\n\nexport interface SdLegacyCacheCallbacks<T> {\n matches: (key: string, option?: SdCacheOption<unknown>) => boolean;\n isValue: (value: unknown) => value is T;\n set?: (key: string, value: SdCacheStoredValue<T>, option?: SdCacheOption<unknown>) => Promise<void> | void;\n get?: (key: string, option?: SdCacheOption<unknown>) => Promise<SdCacheStoredValue<T> | undefined>;\n remove?: (key: string, option?: SdCacheOption<unknown>) => Promise<void> | void;\n}\n\n/** @deprecated Prefer globally safe unknown callbacks on `ISdCacheConfiguration`. */\nexport function adaptLegacySdCacheCallbacks<T>(callbacks: SdLegacyCacheCallbacks<T>): ISdCacheConfiguration {\n return {\n set: callbacks.set\n ? (key, value, option) => {\n if (!callbacks.matches(key, option)) return;\n if (!callbacks.isValue(value.data)) throw new TypeError(`Legacy cache value did not match key ${key}`);\n return callbacks.set?.(key, { data: value.data, createdOn: new Date(value.createdOn) }, option);\n }\n : undefined,\n get: callbacks.get\n ? async (key, option) => {\n if (!callbacks.matches(key, option)) return undefined;\n const value = await callbacks.get?.(key, option);\n if (!value) return undefined;\n if (!callbacks.isValue(value.data)) throw new TypeError(`Legacy cache value did not match key ${key}`);\n return { data: value.data, createdOn: new Date(value.createdOn) };\n }\n : undefined,\n remove: callbacks.remove\n ? (key, option) => {\n if (!callbacks.matches(key, option)) return;\n return callbacks.remove?.(key, option);\n }\n : undefined,\n };\n}\n","import { DestroyRef, inject, Injectable } from '@angular/core';\nimport {\n SD_PERSISTENCE_STORAGE_ADAPTER,\n SdGraphSerializer,\n SdGraphIdentityCanonicalizer,\n SdPersistenceIdentityCanonicalizer,\n SdPersistenceSerializer,\n SdPersistenceStorageArea,\n buildSdPersistenceKey,\n canonicalizeSdPersistenceValue,\n digestSdPersistenceKey,\n parseSdPersistenceEnvelope,\n readSdPersistenceStorageItem,\n stringifySdPersistenceTombstoneEnvelope,\n stringifySdPersistenceValueEnvelope,\n} from '@sdcorejs/angular/services/persistence';\nimport { Utilities } from '@sdcorejs/utils/fns';\nimport { BehaviorSubject } from 'rxjs';\nimport { SD_CACHE_CONFIG, SdCache, SdCacheOption, SdCacheSnapshot, SdCacheStoredValue, SdCacheWithDefault } from './cache.model';\n\ninterface CacheHandleFacade {\n emit: (present: boolean, value: unknown) => void;\n complete: () => void;\n}\n\ninterface CacheState {\n entry?: SdCacheStoredValue<unknown>;\n hydrated: boolean;\n handles: Set<CacheHandleFacade>;\n generation: number;\n inFlight?: { generation: number; promise: Promise<unknown> };\n disposed: boolean;\n}\n\ntype CacheEntryRead = { status: 'found'; entry: SdCacheStoredValue<unknown> } | { status: 'absent' } | { status: 'unavailable' };\n\ninterface NormalizedCacheOption {\n publicOption: SdCacheOption<unknown>;\n area: SdPersistenceStorageArea | 'memory';\n storageKey: string;\n legacyStorageKey?: string;\n ownerDigest: string;\n identityDigest: string;\n ttlMs?: number;\n serializer: SdPersistenceSerializer;\n}\n\ninterface CacheHandleOperations<T> {\n get: () => T | undefined;\n snapshot: () => SdCacheSnapshot<T>;\n set: (data: T) => void;\n has: () => boolean;\n remove: () => void;\n release: () => void;\n destroy: () => void;\n load: (callback: () => Promise<T>) => Promise<T>;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class SdCacheService {\n readonly #configuration = inject(SD_CACHE_CONFIG, { optional: true });\n readonly #adapter = inject(SD_PERSISTENCE_STORAGE_ADAPTER);\n readonly #destroyRef = inject(DestroyRef);\n readonly #defaultSerializer = new SdGraphSerializer();\n readonly #defaultIdentityCanonicalizer = new SdGraphIdentityCanonicalizer();\n readonly #states = new Map<string, CacheState>();\n readonly #remoteQueues = new Map<string, Promise<void>>();\n readonly #memoryEntries = new Map<string, SdCacheStoredValue<unknown>>();\n readonly #failedOwners = new Map<string, true>();\n readonly #maxFailedOwners = 256;\n #destroyed = false;\n\n constructor() {\n this.#destroyRef.onDestroy(() => {\n this.#destroyed = true;\n for (const state of this.#states.values()) {\n state.disposed = true;\n state.generation += 1;\n state.entry = undefined;\n state.inFlight = undefined;\n for (const handle of state.handles) handle.complete();\n state.handles.clear();\n }\n this.#states.clear();\n this.#remoteQueues.clear();\n this.#memoryEntries.clear();\n this.#failedOwners.clear();\n });\n }\n\n create<T>(key: string | object, option: SdCacheOption<T> & { default: T }): SdCacheWithDefault<T>;\n create<T = unknown>(key: string | object, option?: SdCacheOption<unknown>): SdCache<T>;\n create<T = unknown>(key: string | object, option: SdCacheOption<T> = {}): SdCache<T> | SdCacheWithDefault<T> {\n if (this.#destroyed) throw new Error('Cache service has been destroyed');\n if (!key) throw new Error('Key is required');\n const normalized = this.#normalize(key, option);\n const state = this.#getOrCreateState(normalized);\n if (Object.prototype.hasOwnProperty.call(option, 'default')) {\n return this.#createDefaultHandle(state, normalized, this.#cloneAs<T>(normalized.serializer, option.default));\n }\n return this.#createOptionalHandle<T>(state, normalized);\n }\n\n #getOrCreateState(normalized: NormalizedCacheOption): CacheState {\n const existing = this.#states.get(normalized.ownerDigest);\n if (existing) return existing;\n const state: CacheState = {\n hydrated: false,\n handles: new Set<CacheHandleFacade>(),\n generation: 0,\n disposed: false,\n };\n this.#states.set(normalized.ownerDigest, state);\n this.#hydrateState(state, normalized);\n return state;\n }\n\n #createOptionalHandle<T>(state: CacheState, normalized: NormalizedCacheOption): SdCache<T> {\n const initial = this.#readOptional<T>(state, normalized);\n const subject = new BehaviorSubject<T | undefined>(initial);\n const facade: CacheHandleFacade = {\n emit: (present, value) => subject.next(present ? this.#cloneAs<T>(normalized.serializer, value) : undefined),\n complete: () => subject.complete(),\n };\n const operations = this.#attachHandle(state, normalized, facade, () => this.#readOptional<T>(state, normalized));\n return { ...operations, observer: subject.asObservable() };\n }\n\n #createDefaultHandle<T>(state: CacheState, normalized: NormalizedCacheOption, defaultSnapshot: T): SdCacheWithDefault<T> {\n const read = (): T => this.#readWithDefault(state, normalized, defaultSnapshot);\n const subject = new BehaviorSubject<T>(read());\n const facade: CacheHandleFacade = {\n emit: (present, value) =>\n subject.next(present ? this.#cloneAs<T>(normalized.serializer, value) : this.#cloneAs<T>(normalized.serializer, defaultSnapshot)),\n complete: () => subject.complete(),\n };\n const operations = this.#attachHandle(state, normalized, facade, read);\n return { ...operations, get: read, observer: subject.asObservable() };\n }\n\n #attachHandle<T>(\n state: CacheState,\n normalized: NormalizedCacheOption,\n facade: CacheHandleFacade,\n read: () => T | undefined\n ): CacheHandleOperations<T> {\n state.handles.add(facade);\n let active = true;\n const assertActive = (): void => {\n if (!active || state.disposed || this.#destroyed) throw new Error('Cache handle has been destroyed');\n };\n const get = (): T | undefined => {\n assertActive();\n return read();\n };\n const snapshot = (): SdCacheSnapshot<T> => {\n assertActive();\n const entry = this.#getValidEntry(state, normalized);\n return entry === undefined ? { present: false } : { present: true, value: this.#cloneAs<T>(normalized.serializer, entry.data) };\n };\n const set = (data: T): void => {\n assertActive();\n this.#setEntry(state, normalized, data, true);\n this.#broadcast(state);\n };\n const has = (): boolean => {\n assertActive();\n return this.#getValidEntry(state, normalized) !== undefined;\n };\n const remove = (): void => {\n assertActive();\n this.#removeEntry(state, normalized, true);\n this.#broadcast(state);\n };\n const releaseFacade = (): void => {\n if (!active) return;\n active = false;\n state.handles.delete(facade);\n facade.complete();\n if (state.handles.size > 0) return;\n state.disposed = true;\n state.generation += 1;\n state.entry = undefined;\n state.inFlight = undefined;\n this.#states.delete(normalized.ownerDigest);\n };\n const release = (): void => releaseFacade();\n const destroy = (): void => {\n if (!active) return;\n releaseFacade();\n if (normalized.area !== 'memory') return;\n this.#memoryEntries.delete(normalized.ownerDigest);\n if (state.disposed) return;\n state.entry = undefined;\n state.hydrated = true;\n this.#broadcast(state);\n };\n const load = (callback: () => Promise<T>): Promise<T> => {\n try {\n assertActive();\n } catch (error: unknown) {\n return Promise.reject(error);\n }\n const entry = this.#getValidEntry(state, normalized);\n if (entry) return Promise.resolve(this.#cloneAs<T>(normalized.serializer, entry.data));\n const generation = state.generation;\n if (state.inFlight?.generation === generation) {\n return state.inFlight.promise.then(value => this.#cloneAs<T>(normalized.serializer, value));\n }\n const promise = this.#loadMiss(state, normalized, callback, generation);\n state.inFlight = { generation, promise };\n void promise\n .finally(() => {\n if (state.inFlight?.promise === promise) state.inFlight = undefined;\n })\n .catch(() => undefined);\n return promise;\n };\n return { get, snapshot, set, has, remove, release, destroy, load };\n }\n\n async #loadMiss<T>(state: CacheState, normalized: NormalizedCacheOption, callback: () => Promise<T>, generation: number): Promise<T> {\n const remote = await this.#readRemote(normalized);\n if (remote) {\n if (!state.disposed && state.generation === generation) {\n state.entry = this.#cloneEntry(remote, normalized.serializer);\n state.hydrated = true;\n state.generation += 1;\n this.#writePersistent(normalized, state.entry);\n this.#broadcast(state);\n }\n return this.#cloneAs<T>(normalized.serializer, remote.data);\n }\n\n const result = await callback();\n if (result !== null && result !== undefined && !state.disposed && state.generation === generation) {\n this.#setEntry(state, normalized, result, true);\n this.#broadcast(state);\n }\n if (result === null || result === undefined) return result;\n return this.#cloneAs<T>(normalized.serializer, result);\n }\n\n #normalize<T>(key: string | object, option: SdCacheOption<T>): NormalizedCacheOption {\n const serializer = option.serializer ?? this.#configuration?.serializer ?? this.#defaultSerializer;\n const identityCanonicalizer =\n option.identityCanonicalizer ?? this.#configuration?.identityCanonicalizer ?? this.#defaultIdentityCanonicalizer;\n const canonicalKey = canonicalizeSdPersistenceValue(identityCanonicalizer, key, 'cache key');\n const legacyStorageKey = this.#legacyStorageKey(key);\n const namespace = option.namespace ?? this.#configuration?.namespace;\n const version = option.version ?? this.#configuration?.version;\n const area = option.type ?? 'memory';\n const ttlMs = this.#normalizeTtl(option);\n const serializerFormat = this.#serializerFormat(serializer);\n const hasArgs = Object.prototype.hasOwnProperty.call(option, 'args');\n const hasDefault = Object.prototype.hasOwnProperty.call(option, 'default');\n const fields = [\n { tag: 'area', value: canonicalizeSdPersistenceValue(identityCanonicalizer, area, 'cache area') },\n { tag: 'namespace', value: this.#optionalIdentity(identityCanonicalizer, namespace !== undefined, namespace, 'cache namespace') },\n { tag: 'version', value: this.#optionalIdentity(identityCanonicalizer, version !== undefined, version, 'cache version') },\n { tag: 'ttlMs', value: this.#optionalIdentity(identityCanonicalizer, ttlMs !== undefined, ttlMs, 'cache TTL') },\n { tag: 'args', value: this.#optionalIdentity(identityCanonicalizer, hasArgs, option.args, 'cache args') },\n { tag: 'default', value: this.#optionalIdentity(identityCanonicalizer, hasDefault, option.default, 'cache default') },\n { tag: 'serializer', value: serializerFormat },\n { tag: 'identityCanonicalizer', value: this.#identityCanonicalizerFormat(identityCanonicalizer) },\n ];\n const identity = buildSdPersistenceKey(canonicalKey, fields);\n const identityDigest = digestSdPersistenceKey(identity);\n const storageKey = this.#convertKey(`sdcorejs.cache@1:${identityDigest}`);\n const ownerDigest = digestSdPersistenceKey(buildSdPersistenceKey(storageKey, [{ tag: 'area', value: area }]));\n return {\n publicOption: option,\n area,\n storageKey,\n legacyStorageKey,\n ownerDigest,\n identityDigest,\n ttlMs,\n serializer,\n };\n }\n\n #convertKey(baseKey: string): string {\n try {\n return this.#configuration?.convertKey?.(baseKey) ?? baseKey;\n } catch {\n return baseKey;\n }\n }\n\n #legacyStorageKey(key: string | object): string | undefined {\n try {\n return this.#convertKey(Utilities.hash({ key }));\n } catch {\n return undefined;\n }\n }\n\n #normalizeTtl<T>(option: SdCacheOption<T>): number | undefined {\n const candidate = option.ttlMs ?? (option.hours === undefined ? undefined : option.hours * 3_600_000);\n if (candidate === undefined || !Number.isFinite(candidate) || candidate <= 0) return undefined;\n return Math.min(candidate, Number.MAX_SAFE_INTEGER);\n }\n\n #optionalIdentity(canonicalizer: SdPersistenceIdentityCanonicalizer, present: boolean, value: unknown, label: string): string {\n return present ? `1${canonicalizeSdPersistenceValue(canonicalizer, value, label)}` : '0';\n }\n\n #identityCanonicalizerFormat(canonicalizer: SdPersistenceIdentityCanonicalizer): string {\n if (typeof canonicalizer.format !== 'string' || canonicalizer.format.length === 0) {\n throw new Error('Persistence identity canonicalizer format must be a non-empty string');\n }\n return canonicalizer.format;\n }\n\n #serializerFormat(serializer: SdPersistenceSerializer): string {\n if (typeof serializer.format !== 'string' || serializer.format.length === 0) {\n throw new Error('Persistence serializer format must be a non-empty string');\n }\n return serializer.format;\n }\n\n #readOptional<T>(state: CacheState, normalized: NormalizedCacheOption): T | undefined {\n const entry = this.#getValidEntry(state, normalized);\n return entry ? this.#cloneAs<T>(normalized.serializer, entry.data) : undefined;\n }\n\n #readWithDefault<T>(state: CacheState, normalized: NormalizedCacheOption, defaultSnapshot: T): T {\n const entry = this.#getValidEntry(state, normalized);\n return entry ? this.#cloneAs<T>(normalized.serializer, entry.data) : this.#cloneAs<T>(normalized.serializer, defaultSnapshot);\n }\n\n #getValidEntry(state: CacheState, normalized: NormalizedCacheOption): SdCacheStoredValue<unknown> | undefined {\n if (!state.hydrated) {\n this.#hydrateState(state, normalized);\n }\n if (!state.entry) return undefined;\n if (this.#isExpired(state.entry, normalized.ttlMs)) {\n this.#removeEntry(state, normalized, true);\n this.#broadcast(state);\n return undefined;\n }\n return state.entry;\n }\n\n #isExpired(entry: SdCacheStoredValue<unknown>, ttlMs: number | undefined): boolean {\n return ttlMs !== undefined && entry.createdOn.getTime() + ttlMs <= Date.now();\n }\n\n #hydrateState(state: CacheState, normalized: NormalizedCacheOption): void {\n const read = this.#readEntry(normalized);\n state.entry = read.status === 'found' ? read.entry : undefined;\n state.hydrated = read.status !== 'unavailable';\n }\n\n #setEntry(state: CacheState, normalized: NormalizedCacheOption, data: unknown, notifyRemote: boolean): void {\n const entry: SdCacheStoredValue<unknown> = {\n data: normalized.serializer.clone(data),\n createdOn: new Date(),\n };\n state.entry = entry;\n state.hydrated = true;\n state.generation += 1;\n this.#writePersistent(normalized, entry);\n if (notifyRemote) this.#safeRemoteSet(normalized, entry);\n }\n\n #removeEntry(state: CacheState, normalized: NormalizedCacheOption, notifyRemote: boolean): void {\n state.entry = undefined;\n state.hydrated = true;\n state.generation += 1;\n if (normalized.area !== 'memory') this.#writeTombstone(normalized);\n if (notifyRemote) void this.#safeRemoteRemove(normalized);\n }\n\n #broadcast(state: CacheState): void {\n const present = state.entry !== undefined;\n const value = state.entry?.data;\n for (const handle of state.handles) handle.emit(present, value);\n }\n\n #readEntry(normalized: NormalizedCacheOption): CacheEntryRead {\n if (normalized.area === 'memory') {\n const entry = this.#memoryEntries.get(normalized.ownerDigest);\n return entry ? { status: 'found', entry: this.#cloneEntry(entry, normalized.serializer) } : { status: 'absent' };\n }\n if (this.#failedOwners.has(normalized.ownerDigest)) return { status: 'unavailable' };\n const primary = readSdPersistenceStorageItem(this.#adapter, normalized.area, normalized.storageKey);\n if (primary.status === 'found') {\n let envelope: ReturnType<typeof parseSdPersistenceEnvelope>;\n try {\n envelope = parseSdPersistenceEnvelope(primary.value, normalized.identityDigest, normalized.serializer.format);\n } catch {\n this.#writeTombstone(normalized);\n return { status: 'absent' };\n }\n if (envelope?.kind === 'tombstone') return { status: 'absent' };\n const entry = envelope?.kind === 'value' ? this.#parseCurrentEntry(envelope.payload, normalized.serializer) : undefined;\n if (entry) return { status: 'found', entry };\n this.#writeTombstone(normalized);\n return { status: 'absent' };\n }\n if (primary.status === 'unavailable') return { status: 'unavailable' };\n if (normalized.legacyStorageKey === undefined) return { status: 'absent' };\n const legacyRead = readSdPersistenceStorageItem(this.#adapter, normalized.area, normalized.legacyStorageKey);\n if (legacyRead.status === 'unavailable') return { status: 'unavailable' };\n if (legacyRead.status === 'absent') return { status: 'absent' };\n const legacy = this.#parseLegacy(legacyRead.value);\n if (!legacy) {\n this.#writeTombstone(normalized);\n return { status: 'absent' };\n }\n this.#writePersistent(normalized, legacy);\n return { status: 'found', entry: legacy };\n }\n\n #parseCurrentEntry(payload: string, serializer: SdPersistenceSerializer): SdCacheStoredValue<unknown> | undefined {\n try {\n return this.#validateEntry(serializer.parse<unknown>(payload));\n } catch {\n return undefined;\n }\n }\n\n #parseLegacy(raw: string): SdCacheStoredValue<unknown> | undefined {\n try {\n const parsed = JSON.parse(raw) as unknown;\n if (!this.#hasExactEntryKeys(parsed)) return undefined;\n const createdOn = this.#toValidDate(parsed['createdOn']);\n return createdOn ? { data: parsed['data'], createdOn } : undefined;\n } catch {\n return undefined;\n }\n }\n\n #validateEntry(value: unknown): SdCacheStoredValue<unknown> | undefined {\n if (!this.#hasExactEntryKeys(value)) return undefined;\n const createdOn = this.#toValidDate(value['createdOn']);\n return createdOn ? { data: value['data'], createdOn } : undefined;\n }\n\n #toValidDate(value: unknown): Date | undefined {\n const date = value instanceof Date ? value : typeof value === 'string' || typeof value === 'number' ? new Date(value) : undefined;\n return date && Number.isFinite(date.getTime()) ? date : undefined;\n }\n\n #writePersistent(normalized: NormalizedCacheOption, entry: SdCacheStoredValue<unknown>): boolean {\n if (normalized.area === 'memory') {\n this.#memoryEntries.set(normalized.ownerDigest, this.#cloneEntry(entry, normalized.serializer));\n return true;\n }\n try {\n const payload = normalized.serializer.stringify(entry);\n if (\n this.#adapter.setItem(\n normalized.area,\n normalized.storageKey,\n stringifySdPersistenceValueEnvelope(normalized.identityDigest, normalized.serializer.format, payload)\n )\n ) {\n this.#clearFailedOwner(normalized.ownerDigest);\n return true;\n }\n } catch {\n // Fall through to canonical quarantine.\n }\n this.#safeAdapterRemove(normalized.area, normalized.storageKey);\n if (this.#tryPersistTombstone(normalized)) {\n this.#clearFailedOwner(normalized.ownerDigest);\n return false;\n }\n this.#recordFailedOwner(normalized.ownerDigest);\n return false;\n }\n\n #readRemote(normalized: NormalizedCacheOption): Promise<SdCacheStoredValue<unknown> | undefined> {\n return this.#enqueueRemote(normalized, async () => {\n const get = this.#configuration?.get;\n if (!get) return undefined;\n const entry = this.#validateEntry(await get(normalized.storageKey, normalized.publicOption));\n if (!entry || !this.#isExpired(entry, normalized.ttlMs)) return entry;\n const remove = this.#configuration?.remove;\n if (remove) await remove(normalized.storageKey, normalized.publicOption);\n return undefined;\n });\n }\n\n #safeRemoteSet(normalized: NormalizedCacheOption, entry: SdCacheStoredValue<unknown>): void {\n const set = this.#configuration?.set;\n if (!set) return;\n void this.#enqueueRemote(normalized, () =>\n set(normalized.storageKey, this.#cloneEntry(entry, normalized.serializer), normalized.publicOption)\n );\n }\n\n #safeRemoteRemove(normalized: NormalizedCacheOption): Promise<void | undefined> {\n const remove = this.#configuration?.remove;\n if (!remove) return Promise.resolve();\n return this.#enqueueRemote(normalized, () => remove(normalized.storageKey, normalized.publicOption));\n }\n\n #enqueueRemote<T>(normalized: NormalizedCacheOption, operation: () => Promise<T> | T): Promise<T | undefined> {\n const previous = this.#remoteQueues.get(normalized.ownerDigest) ?? Promise.resolve();\n const result = previous.then(async () => {\n try {\n return await operation();\n } catch {\n // A failed remote operation cannot poison later work for this identity.\n return undefined;\n }\n });\n const tail = result.then(() => undefined);\n this.#remoteQueues.set(normalized.ownerDigest, tail);\n void tail.then(() => {\n if (this.#remoteQueues.get(normalized.ownerDigest) === tail) this.#remoteQueues.delete(normalized.ownerDigest);\n });\n return result;\n }\n\n #safeAdapterRemove(area: SdPersistenceStorageArea, key: string): boolean {\n try {\n return this.#adapter.removeItem(area, key);\n } catch {\n return false;\n }\n }\n\n #writeTombstone(normalized: NormalizedCacheOption): boolean {\n if (normalized.area === 'memory') {\n this.#memoryEntries.delete(normalized.ownerDigest);\n return true;\n }\n if (this.#tryPersistTombstone(normalized)) {\n this.#clearFailedOwner(normalized.ownerDigest);\n return true;\n }\n this.#safeAdapterRemove(normalized.area, normalized.storageKey);\n this.#recordFailedOwner(normalized.ownerDigest);\n return false;\n }\n\n #tryPersistTombstone(normalized: NormalizedCacheOption): boolean {\n if (normalized.area === 'memory') return false;\n try {\n return this.#adapter.setItem(\n normalized.area,\n normalized.storageKey,\n stringifySdPersistenceTombstoneEnvelope(normalized.identityDigest, normalized.serializer.format)\n );\n } catch {\n return false;\n }\n }\n\n #clearFailedOwner(ownerDigest: string): void {\n this.#failedOwners.delete(ownerDigest);\n }\n\n #recordFailedOwner(ownerDigest: string): void {\n this.#failedOwners.delete(ownerDigest);\n this.#failedOwners.set(ownerDigest, true);\n if (this.#failedOwners.size <= this.#maxFailedOwners) return;\n const oldest = this.#failedOwners.keys().next().value;\n if (oldest !== undefined) this.#failedOwners.delete(oldest);\n }\n\n #cloneEntry(entry: SdCacheStoredValue<unknown>, serializer: SdPersistenceSerializer): SdCacheStoredValue<unknown> {\n return { data: serializer.clone(entry.data), createdOn: new Date(entry.createdOn) };\n }\n\n #cloneAs<T>(serializer: SdPersistenceSerializer, value: unknown): T {\n const entry = serializer.parse<SdCacheStoredValue<T>>(serializer.stringify({ data: value, createdOn: new Date(0) }));\n return entry.data;\n }\n\n #isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n }\n\n #hasExactEntryKeys(value: unknown): value is Record<string, unknown> {\n return (\n this.#isRecord(value) &&\n Reflect.ownKeys(value).length === 2 &&\n Object.prototype.hasOwnProperty.call(value, 'data') &&\n Object.prototype.hasOwnProperty.call(value, 'createdOn')\n );\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sdcorejs-angular-services-cache.mjs","sources":["../../../projects/sdcorejs-angular/services/cache/src/cache.model.ts","../../../projects/sdcorejs-angular/services/cache/src/cache.service.ts","../../../projects/sdcorejs-angular/services/cache/sdcorejs-angular-services-cache.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\nimport { SdPersistenceIdentityCanonicalizer, SdPersistenceSerializer } from '@sdcorejs/angular/services/persistence';\nimport { Observable } from 'rxjs';\n\nexport interface SdCacheOption<T = unknown> {\n type?: 'memory' | 'session' | 'local';\n hours?: number;\n ttlMs?: number;\n default?: T;\n args?: Readonly<Record<string, unknown>>;\n namespace?: string;\n version?: string | number;\n serializer?: SdPersistenceSerializer;\n identityCanonicalizer?: SdPersistenceIdentityCanonicalizer;\n}\n\nexport interface SdCache<T = unknown> {\n get: () => T | undefined;\n snapshot: () => SdCacheSnapshot<T>;\n set: (data: T) => void;\n has: () => boolean;\n remove: () => void;\n /** Releases only this facade while preserving its backing cache entry. */\n release: () => void;\n destroy: () => void;\n observer: Observable<T | undefined>;\n load: (callback: () => Promise<T>) => Promise<T>;\n}\n\nexport type SdCacheSnapshot<T> = { present: false } | { present: true; value: T };\n\nexport interface SdCacheWithDefault<T> extends Omit<SdCache<T>, 'get' | 'observer'> {\n get: () => T;\n observer: Observable<T>;\n}\n\nexport interface SdCacheStoredValue<T = unknown> {\n data: T;\n createdOn: Date;\n}\n\nexport type SdCacheSetCallback = (key: string, value: SdCacheStoredValue<unknown>, option?: SdCacheOption<unknown>) => Promise<void> | void;\n\nexport type SdCacheGetCallback = (key: string, option?: SdCacheOption<unknown>) => Promise<SdCacheStoredValue<unknown> | undefined>;\n\nexport type SdCacheRemoveCallback = (key: string, option?: SdCacheOption<unknown>) => Promise<void> | void;\n\n/**\n * Số entry `type: 'memory'` tối đa được giữ trước khi LRU đẩy entry cũ nhất ra.\n * Ghi đè bằng `maxMemoryEntries` trên `SD_CACHE_CONFIG`.\n */\nexport const SD_CACHE_DEFAULT_MAX_MEMORY_ENTRIES = 500;\n\nexport interface ISdCacheConfiguration {\n convertKey?: (key: string) => string;\n namespace?: string;\n version?: string | number;\n serializer?: SdPersistenceSerializer;\n identityCanonicalizer?: SdPersistenceIdentityCanonicalizer;\n /**\n * Trần LRU cho cache `type: 'memory'`. Mặc định `SD_CACHE_DEFAULT_MAX_MEMORY_ENTRIES` (500).\n * Giá trị không hợp lệ (không hữu hạn, < 1) sẽ rơi về mặc định.\n */\n maxMemoryEntries?: number;\n set?: SdCacheSetCallback;\n get?: SdCacheGetCallback;\n remove?: SdCacheRemoveCallback;\n}\n\nexport const SD_CACHE_CONFIG = new InjectionToken<ISdCacheConfiguration>('sd-cache.configuration');\n\nexport interface SdLegacyCacheCallbacks<T> {\n matches: (key: string, option?: SdCacheOption<unknown>) => boolean;\n isValue: (value: unknown) => value is T;\n set?: (key: string, value: SdCacheStoredValue<T>, option?: SdCacheOption<unknown>) => Promise<void> | void;\n get?: (key: string, option?: SdCacheOption<unknown>) => Promise<SdCacheStoredValue<T> | undefined>;\n remove?: (key: string, option?: SdCacheOption<unknown>) => Promise<void> | void;\n}\n\n/** @deprecated Prefer globally safe unknown callbacks on `ISdCacheConfiguration`. */\nexport function adaptLegacySdCacheCallbacks<T>(callbacks: SdLegacyCacheCallbacks<T>): ISdCacheConfiguration {\n return {\n set: callbacks.set\n ? (key, value, option) => {\n if (!callbacks.matches(key, option)) return;\n if (!callbacks.isValue(value.data)) throw new TypeError(`Legacy cache value did not match key ${key}`);\n return callbacks.set?.(key, { data: value.data, createdOn: new Date(value.createdOn) }, option);\n }\n : undefined,\n get: callbacks.get\n ? async (key, option) => {\n if (!callbacks.matches(key, option)) return undefined;\n const value = await callbacks.get?.(key, option);\n if (!value) return undefined;\n if (!callbacks.isValue(value.data)) throw new TypeError(`Legacy cache value did not match key ${key}`);\n return { data: value.data, createdOn: new Date(value.createdOn) };\n }\n : undefined,\n remove: callbacks.remove\n ? (key, option) => {\n if (!callbacks.matches(key, option)) return;\n return callbacks.remove?.(key, option);\n }\n : undefined,\n };\n}\n","import { DestroyRef, inject, Injectable } from '@angular/core';\nimport {\n SD_PERSISTENCE_STORAGE_ADAPTER,\n SdGraphSerializer,\n SdGraphIdentityCanonicalizer,\n SdPersistenceIdentityCanonicalizer,\n SdPersistenceSerializer,\n SdPersistenceStorageArea,\n buildSdPersistenceKey,\n canonicalizeSdPersistenceValue,\n digestSdPersistenceKey,\n parseSdPersistenceEnvelope,\n readSdPersistenceStorageItem,\n stringifySdPersistenceTombstoneEnvelope,\n stringifySdPersistenceValueEnvelope,\n} from '@sdcorejs/angular/services/persistence';\nimport { Utilities } from '@sdcorejs/utils/fns';\nimport { BehaviorSubject } from 'rxjs';\nimport {\n SD_CACHE_CONFIG,\n SD_CACHE_DEFAULT_MAX_MEMORY_ENTRIES,\n SdCache,\n SdCacheOption,\n SdCacheSnapshot,\n SdCacheStoredValue,\n SdCacheWithDefault,\n} from './cache.model';\n\ninterface CacheHandleFacade {\n emit: (present: boolean, value: unknown) => void;\n complete: () => void;\n}\n\ninterface CacheState {\n entry?: SdCacheStoredValue<unknown>;\n hydrated: boolean;\n handles: Set<CacheHandleFacade>;\n generation: number;\n inFlight?: { generation: number; promise: Promise<unknown> };\n disposed: boolean;\n}\n\ntype CacheEntryRead = { status: 'found'; entry: SdCacheStoredValue<unknown> } | { status: 'absent' } | { status: 'unavailable' };\n\ninterface NormalizedCacheOption {\n publicOption: SdCacheOption<unknown>;\n area: SdPersistenceStorageArea | 'memory';\n storageKey: string;\n legacyStorageKey?: string;\n ownerDigest: string;\n identityDigest: string;\n ttlMs?: number;\n serializer: SdPersistenceSerializer;\n}\n\ninterface CacheHandleOperations<T> {\n get: () => T | undefined;\n snapshot: () => SdCacheSnapshot<T>;\n set: (data: T) => void;\n has: () => boolean;\n remove: () => void;\n release: () => void;\n destroy: () => void;\n load: (callback: () => Promise<T>) => Promise<T>;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class SdCacheService {\n readonly #configuration = inject(SD_CACHE_CONFIG, { optional: true });\n readonly #adapter = inject(SD_PERSISTENCE_STORAGE_ADAPTER);\n readonly #destroyRef = inject(DestroyRef);\n readonly #defaultSerializer = new SdGraphSerializer();\n readonly #defaultIdentityCanonicalizer = new SdGraphIdentityCanonicalizer();\n readonly #states = new Map<string, CacheState>();\n readonly #remoteQueues = new Map<string, Promise<void>>();\n readonly #memoryEntries = new Map<string, SdCacheStoredValue<unknown>>();\n readonly #failedOwners = new Map<string, true>();\n readonly #maxFailedOwners = 256;\n // why: #memoryEntries trước đây không có trần và TTL thì opt-in, trong khi SdApiService luôn gọi\n // release() (không phải destroy()) sau mỗi request — release chỉ bỏ state của handle, KHÔNG bỏ\n // entry memory. Hệ quả: mỗi URL được cache để lại một entry sống hết đời app → bộ nhớ tăng đơn\n // điệu. Chặn bằng LRU có trần, cấu hình qua SD_CACHE_CONFIG.maxMemoryEntries.\n readonly #maxMemoryEntries = this.#normalizeMaxMemoryEntries(this.#configuration?.maxMemoryEntries);\n #destroyed = false;\n\n constructor() {\n this.#destroyRef.onDestroy(() => {\n this.#destroyed = true;\n for (const state of this.#states.values()) {\n state.disposed = true;\n state.generation += 1;\n state.entry = undefined;\n state.inFlight = undefined;\n for (const handle of state.handles) handle.complete();\n state.handles.clear();\n }\n this.#states.clear();\n this.#remoteQueues.clear();\n this.#memoryEntries.clear();\n this.#failedOwners.clear();\n });\n }\n\n create<T>(key: string | object, option: SdCacheOption<T> & { default: T }): SdCacheWithDefault<T>;\n create<T = unknown>(key: string | object, option?: SdCacheOption<unknown>): SdCache<T>;\n create<T = unknown>(key: string | object, option: SdCacheOption<T> = {}): SdCache<T> | SdCacheWithDefault<T> {\n if (this.#destroyed) throw new Error('Cache service has been destroyed');\n if (!key) throw new Error('Key is required');\n const normalized = this.#normalize(key, option);\n const state = this.#getOrCreateState(normalized);\n if (Object.prototype.hasOwnProperty.call(option, 'default')) {\n return this.#createDefaultHandle(state, normalized, this.#cloneAs<T>(normalized.serializer, option.default));\n }\n return this.#createOptionalHandle<T>(state, normalized);\n }\n\n #getOrCreateState(normalized: NormalizedCacheOption): CacheState {\n const existing = this.#states.get(normalized.ownerDigest);\n if (existing) return existing;\n const state: CacheState = {\n hydrated: false,\n handles: new Set<CacheHandleFacade>(),\n generation: 0,\n disposed: false,\n };\n this.#states.set(normalized.ownerDigest, state);\n this.#hydrateState(state, normalized);\n return state;\n }\n\n #createOptionalHandle<T>(state: CacheState, normalized: NormalizedCacheOption): SdCache<T> {\n const initial = this.#readOptional<T>(state, normalized);\n const subject = new BehaviorSubject<T | undefined>(initial);\n const facade: CacheHandleFacade = {\n emit: (present, value) => subject.next(present ? this.#cloneAs<T>(normalized.serializer, value) : undefined),\n complete: () => subject.complete(),\n };\n const operations = this.#attachHandle(state, normalized, facade, () => this.#readOptional<T>(state, normalized));\n return { ...operations, observer: subject.asObservable() };\n }\n\n #createDefaultHandle<T>(state: CacheState, normalized: NormalizedCacheOption, defaultSnapshot: T): SdCacheWithDefault<T> {\n const read = (): T => this.#readWithDefault(state, normalized, defaultSnapshot);\n const subject = new BehaviorSubject<T>(read());\n const facade: CacheHandleFacade = {\n emit: (present, value) =>\n subject.next(present ? this.#cloneAs<T>(normalized.serializer, value) : this.#cloneAs<T>(normalized.serializer, defaultSnapshot)),\n complete: () => subject.complete(),\n };\n const operations = this.#attachHandle(state, normalized, facade, read);\n return { ...operations, get: read, observer: subject.asObservable() };\n }\n\n #attachHandle<T>(\n state: CacheState,\n normalized: NormalizedCacheOption,\n facade: CacheHandleFacade,\n read: () => T | undefined\n ): CacheHandleOperations<T> {\n state.handles.add(facade);\n let active = true;\n const assertActive = (): void => {\n if (!active || state.disposed || this.#destroyed) throw new Error('Cache handle has been destroyed');\n };\n const get = (): T | undefined => {\n assertActive();\n return read();\n };\n const snapshot = (): SdCacheSnapshot<T> => {\n assertActive();\n const entry = this.#getValidEntry(state, normalized);\n return entry === undefined ? { present: false } : { present: true, value: this.#cloneAs<T>(normalized.serializer, entry.data) };\n };\n const set = (data: T): void => {\n assertActive();\n this.#setEntry(state, normalized, data, true);\n this.#broadcast(state);\n };\n const has = (): boolean => {\n assertActive();\n return this.#getValidEntry(state, normalized) !== undefined;\n };\n const remove = (): void => {\n assertActive();\n this.#removeEntry(state, normalized, true);\n this.#broadcast(state);\n };\n const releaseFacade = (): void => {\n if (!active) return;\n active = false;\n state.handles.delete(facade);\n facade.complete();\n if (state.handles.size > 0) return;\n state.disposed = true;\n state.generation += 1;\n state.entry = undefined;\n state.inFlight = undefined;\n this.#states.delete(normalized.ownerDigest);\n };\n const release = (): void => releaseFacade();\n const destroy = (): void => {\n if (!active) return;\n releaseFacade();\n if (normalized.area !== 'memory') return;\n this.#memoryEntries.delete(normalized.ownerDigest);\n if (state.disposed) return;\n state.entry = undefined;\n state.hydrated = true;\n this.#broadcast(state);\n };\n const load = (callback: () => Promise<T>): Promise<T> => {\n try {\n assertActive();\n } catch (error: unknown) {\n return Promise.reject(error);\n }\n const entry = this.#getValidEntry(state, normalized);\n if (entry) return Promise.resolve(this.#cloneAs<T>(normalized.serializer, entry.data));\n const generation = state.generation;\n if (state.inFlight?.generation === generation) {\n return state.inFlight.promise.then(value => this.#cloneAs<T>(normalized.serializer, value));\n }\n const promise = this.#loadMiss(state, normalized, callback, generation);\n state.inFlight = { generation, promise };\n void promise\n .finally(() => {\n if (state.inFlight?.promise === promise) state.inFlight = undefined;\n })\n .catch(() => undefined);\n return promise;\n };\n return { get, snapshot, set, has, remove, release, destroy, load };\n }\n\n async #loadMiss<T>(state: CacheState, normalized: NormalizedCacheOption, callback: () => Promise<T>, generation: number): Promise<T> {\n const remote = await this.#readRemote(normalized);\n if (remote) {\n if (!state.disposed && state.generation === generation) {\n state.entry = this.#cloneEntry(remote, normalized.serializer);\n state.hydrated = true;\n state.generation += 1;\n this.#writePersistent(normalized, state.entry);\n this.#broadcast(state);\n }\n return this.#cloneAs<T>(normalized.serializer, remote.data);\n }\n\n const result = await callback();\n if (result !== null && result !== undefined && !state.disposed && state.generation === generation) {\n this.#setEntry(state, normalized, result, true);\n this.#broadcast(state);\n }\n if (result === null || result === undefined) return result;\n return this.#cloneAs<T>(normalized.serializer, result);\n }\n\n #normalize<T>(key: string | object, option: SdCacheOption<T>): NormalizedCacheOption {\n const serializer = option.serializer ?? this.#configuration?.serializer ?? this.#defaultSerializer;\n const identityCanonicalizer =\n option.identityCanonicalizer ?? this.#configuration?.identityCanonicalizer ?? this.#defaultIdentityCanonicalizer;\n const canonicalKey = canonicalizeSdPersistenceValue(identityCanonicalizer, key, 'cache key');\n const legacyStorageKey = this.#legacyStorageKey(key);\n const namespace = option.namespace ?? this.#configuration?.namespace;\n const version = option.version ?? this.#configuration?.version;\n const area = option.type ?? 'memory';\n const ttlMs = this.#normalizeTtl(option);\n const serializerFormat = this.#serializerFormat(serializer);\n const hasArgs = Object.prototype.hasOwnProperty.call(option, 'args');\n const hasDefault = Object.prototype.hasOwnProperty.call(option, 'default');\n const fields = [\n { tag: 'area', value: canonicalizeSdPersistenceValue(identityCanonicalizer, area, 'cache area') },\n { tag: 'namespace', value: this.#optionalIdentity(identityCanonicalizer, namespace !== undefined, namespace, 'cache namespace') },\n { tag: 'version', value: this.#optionalIdentity(identityCanonicalizer, version !== undefined, version, 'cache version') },\n { tag: 'ttlMs', value: this.#optionalIdentity(identityCanonicalizer, ttlMs !== undefined, ttlMs, 'cache TTL') },\n { tag: 'args', value: this.#optionalIdentity(identityCanonicalizer, hasArgs, option.args, 'cache args') },\n { tag: 'default', value: this.#optionalIdentity(identityCanonicalizer, hasDefault, option.default, 'cache default') },\n { tag: 'serializer', value: serializerFormat },\n { tag: 'identityCanonicalizer', value: this.#identityCanonicalizerFormat(identityCanonicalizer) },\n ];\n const identity = buildSdPersistenceKey(canonicalKey, fields);\n const identityDigest = digestSdPersistenceKey(identity);\n const storageKey = this.#convertKey(`sdcorejs.cache@1:${identityDigest}`);\n const ownerDigest = digestSdPersistenceKey(buildSdPersistenceKey(storageKey, [{ tag: 'area', value: area }]));\n return {\n publicOption: option,\n area,\n storageKey,\n legacyStorageKey,\n ownerDigest,\n identityDigest,\n ttlMs,\n serializer,\n };\n }\n\n #convertKey(baseKey: string): string {\n try {\n return this.#configuration?.convertKey?.(baseKey) ?? baseKey;\n } catch {\n return baseKey;\n }\n }\n\n #legacyStorageKey(key: string | object): string | undefined {\n try {\n return this.#convertKey(Utilities.hash({ key }));\n } catch {\n return undefined;\n }\n }\n\n #normalizeTtl<T>(option: SdCacheOption<T>): number | undefined {\n const candidate = option.ttlMs ?? (option.hours === undefined ? undefined : option.hours * 3_600_000);\n if (candidate === undefined || !Number.isFinite(candidate) || candidate <= 0) return undefined;\n return Math.min(candidate, Number.MAX_SAFE_INTEGER);\n }\n\n #optionalIdentity(canonicalizer: SdPersistenceIdentityCanonicalizer, present: boolean, value: unknown, label: string): string {\n return present ? `1${canonicalizeSdPersistenceValue(canonicalizer, value, label)}` : '0';\n }\n\n #identityCanonicalizerFormat(canonicalizer: SdPersistenceIdentityCanonicalizer): string {\n if (typeof canonicalizer.format !== 'string' || canonicalizer.format.length === 0) {\n throw new Error('Persistence identity canonicalizer format must be a non-empty string');\n }\n return canonicalizer.format;\n }\n\n #serializerFormat(serializer: SdPersistenceSerializer): string {\n if (typeof serializer.format !== 'string' || serializer.format.length === 0) {\n throw new Error('Persistence serializer format must be a non-empty string');\n }\n return serializer.format;\n }\n\n #readOptional<T>(state: CacheState, normalized: NormalizedCacheOption): T | undefined {\n const entry = this.#getValidEntry(state, normalized);\n return entry ? this.#cloneAs<T>(normalized.serializer, entry.data) : undefined;\n }\n\n #readWithDefault<T>(state: CacheState, normalized: NormalizedCacheOption, defaultSnapshot: T): T {\n const entry = this.#getValidEntry(state, normalized);\n return entry ? this.#cloneAs<T>(normalized.serializer, entry.data) : this.#cloneAs<T>(normalized.serializer, defaultSnapshot);\n }\n\n #getValidEntry(state: CacheState, normalized: NormalizedCacheOption): SdCacheStoredValue<unknown> | undefined {\n if (!state.hydrated) {\n this.#hydrateState(state, normalized);\n }\n if (!state.entry) return undefined;\n if (this.#isExpired(state.entry, normalized.ttlMs)) {\n this.#removeEntry(state, normalized, true);\n this.#broadcast(state);\n return undefined;\n }\n // why: #readEntry (đường hydrate) là nơi DUY NHẤT từng refresh recency, mà hydrate chỉ chạy\n // MỘT lần cho mỗi state. Handle còn mở thì mọi get()/has()/snapshot()/load() sau đó đi thẳng\n // vào nhánh `state.hydrated` này và không đụng gì tới LRU → key nóng nhất (SdApiService giữ\n // handle suốt request) tụt xuống đáy và bị evict trước cả key nguội. Chạm ở đây để mọi lượt\n // ĐỌC đều tính là \"vừa dùng\", đúng như sd-cache.md cam kết.\n if (normalized.area === 'memory') this.#refreshMemoryRecency(normalized.ownerDigest);\n return state.entry;\n }\n\n #isExpired(entry: SdCacheStoredValue<unknown>, ttlMs: number | undefined): boolean {\n return ttlMs !== undefined && entry.createdOn.getTime() + ttlMs <= Date.now();\n }\n\n #hydrateState(state: CacheState, normalized: NormalizedCacheOption): void {\n const read = this.#readEntry(normalized);\n state.entry = read.status === 'found' ? read.entry : undefined;\n state.hydrated = read.status !== 'unavailable';\n }\n\n #setEntry(state: CacheState, normalized: NormalizedCacheOption, data: unknown, notifyRemote: boolean): void {\n const entry: SdCacheStoredValue<unknown> = {\n data: normalized.serializer.clone(data),\n createdOn: new Date(),\n };\n state.entry = entry;\n state.hydrated = true;\n state.generation += 1;\n this.#writePersistent(normalized, entry);\n if (notifyRemote) this.#safeRemoteSet(normalized, entry);\n }\n\n #removeEntry(state: CacheState, normalized: NormalizedCacheOption, notifyRemote: boolean): void {\n state.entry = undefined;\n state.hydrated = true;\n state.generation += 1;\n if (normalized.area !== 'memory') this.#writeTombstone(normalized);\n if (notifyRemote) void this.#safeRemoteRemove(normalized);\n }\n\n #broadcast(state: CacheState): void {\n const present = state.entry !== undefined;\n const value = state.entry?.data;\n for (const handle of state.handles) handle.emit(present, value);\n }\n\n #readEntry(normalized: NormalizedCacheOption): CacheEntryRead {\n if (normalized.area === 'memory') {\n const entry = this.#memoryEntries.get(normalized.ownerDigest);\n if (!entry) return { status: 'absent' };\n this.#touchMemoryEntry(normalized.ownerDigest, entry);\n return { status: 'found', entry: this.#cloneEntry(entry, normalized.serializer) };\n }\n if (this.#failedOwners.has(normalized.ownerDigest)) return { status: 'unavailable' };\n const primary = readSdPersistenceStorageItem(this.#adapter, normalized.area, normalized.storageKey);\n if (primary.status === 'found') {\n let envelope: ReturnType<typeof parseSdPersistenceEnvelope>;\n try {\n envelope = parseSdPersistenceEnvelope(primary.value, normalized.identityDigest, normalized.serializer.format);\n } catch {\n this.#writeTombstone(normalized);\n return { status: 'absent' };\n }\n if (envelope?.kind === 'tombstone') return { status: 'absent' };\n const entry = envelope?.kind === 'value' ? this.#parseCurrentEntry(envelope.payload, normalized.serializer) : undefined;\n if (entry) return { status: 'found', entry };\n this.#writeTombstone(normalized);\n return { status: 'absent' };\n }\n if (primary.status === 'unavailable') return { status: 'unavailable' };\n if (normalized.legacyStorageKey === undefined) return { status: 'absent' };\n const legacyRead = readSdPersistenceStorageItem(this.#adapter, normalized.area, normalized.legacyStorageKey);\n if (legacyRead.status === 'unavailable') return { status: 'unavailable' };\n if (legacyRead.status === 'absent') return { status: 'absent' };\n const legacy = this.#parseLegacy(legacyRead.value);\n if (!legacy) {\n this.#writeTombstone(normalized);\n return { status: 'absent' };\n }\n this.#writePersistent(normalized, legacy);\n return { status: 'found', entry: legacy };\n }\n\n #parseCurrentEntry(payload: string, serializer: SdPersistenceSerializer): SdCacheStoredValue<unknown> | undefined {\n try {\n return this.#validateEntry(serializer.parse<unknown>(payload));\n } catch {\n return undefined;\n }\n }\n\n #parseLegacy(raw: string): SdCacheStoredValue<unknown> | undefined {\n try {\n const parsed = JSON.parse(raw) as unknown;\n if (!this.#hasExactEntryKeys(parsed)) return undefined;\n const createdOn = this.#toValidDate(parsed['createdOn']);\n return createdOn ? { data: parsed['data'], createdOn } : undefined;\n } catch {\n return undefined;\n }\n }\n\n #validateEntry(value: unknown): SdCacheStoredValue<unknown> | undefined {\n if (!this.#hasExactEntryKeys(value)) return undefined;\n const createdOn = this.#toValidDate(value['createdOn']);\n return createdOn ? { data: value['data'], createdOn } : undefined;\n }\n\n #toValidDate(value: unknown): Date | undefined {\n const date = value instanceof Date ? value : typeof value === 'string' || typeof value === 'number' ? new Date(value) : undefined;\n return date && Number.isFinite(date.getTime()) ? date : undefined;\n }\n\n #writePersistent(normalized: NormalizedCacheOption, entry: SdCacheStoredValue<unknown>): boolean {\n if (normalized.area === 'memory') {\n this.#touchMemoryEntry(normalized.ownerDigest, this.#cloneEntry(entry, normalized.serializer));\n this.#evictMemoryOverflow();\n return true;\n }\n try {\n const payload = normalized.serializer.stringify(entry);\n if (\n this.#adapter.setItem(\n normalized.area,\n normalized.storageKey,\n stringifySdPersistenceValueEnvelope(normalized.identityDigest, normalized.serializer.format, payload)\n )\n ) {\n this.#clearFailedOwner(normalized.ownerDigest);\n return true;\n }\n } catch {\n // Fall through to canonical quarantine.\n }\n this.#safeAdapterRemove(normalized.area, normalized.storageKey);\n if (this.#tryPersistTombstone(normalized)) {\n this.#clearFailedOwner(normalized.ownerDigest);\n return false;\n }\n this.#recordFailedOwner(normalized.ownerDigest);\n return false;\n }\n\n #readRemote(normalized: NormalizedCacheOption): Promise<SdCacheStoredValue<unknown> | undefined> {\n return this.#enqueueRemote(normalized, async () => {\n const get = this.#configuration?.get;\n if (!get) return undefined;\n const entry = this.#validateEntry(await get(normalized.storageKey, normalized.publicOption));\n if (!entry || !this.#isExpired(entry, normalized.ttlMs)) return entry;\n const remove = this.#configuration?.remove;\n if (remove) await remove(normalized.storageKey, normalized.publicOption);\n return undefined;\n });\n }\n\n #safeRemoteSet(normalized: NormalizedCacheOption, entry: SdCacheStoredValue<unknown>): void {\n const set = this.#configuration?.set;\n if (!set) return;\n void this.#enqueueRemote(normalized, () =>\n set(normalized.storageKey, this.#cloneEntry(entry, normalized.serializer), normalized.publicOption)\n );\n }\n\n #safeRemoteRemove(normalized: NormalizedCacheOption): Promise<void | undefined> {\n const remove = this.#configuration?.remove;\n if (!remove) return Promise.resolve();\n return this.#enqueueRemote(normalized, () => remove(normalized.storageKey, normalized.publicOption));\n }\n\n #enqueueRemote<T>(normalized: NormalizedCacheOption, operation: () => Promise<T> | T): Promise<T | undefined> {\n const previous = this.#remoteQueues.get(normalized.ownerDigest) ?? Promise.resolve();\n const result = previous.then(async () => {\n try {\n return await operation();\n } catch {\n // A failed remote operation cannot poison later work for this identity.\n return undefined;\n }\n });\n const tail = result.then(() => undefined);\n this.#remoteQueues.set(normalized.ownerDigest, tail);\n void tail.then(() => {\n if (this.#remoteQueues.get(normalized.ownerDigest) === tail) this.#remoteQueues.delete(normalized.ownerDigest);\n });\n return result;\n }\n\n #safeAdapterRemove(area: SdPersistenceStorageArea, key: string): boolean {\n try {\n return this.#adapter.removeItem(area, key);\n } catch {\n return false;\n }\n }\n\n #writeTombstone(normalized: NormalizedCacheOption): boolean {\n if (normalized.area === 'memory') {\n this.#memoryEntries.delete(normalized.ownerDigest);\n return true;\n }\n if (this.#tryPersistTombstone(normalized)) {\n this.#clearFailedOwner(normalized.ownerDigest);\n return true;\n }\n this.#safeAdapterRemove(normalized.area, normalized.storageKey);\n this.#recordFailedOwner(normalized.ownerDigest);\n return false;\n }\n\n #tryPersistTombstone(normalized: NormalizedCacheOption): boolean {\n if (normalized.area === 'memory') return false;\n try {\n return this.#adapter.setItem(\n normalized.area,\n normalized.storageKey,\n stringifySdPersistenceTombstoneEnvelope(normalized.identityDigest, normalized.serializer.format)\n );\n } catch {\n return false;\n }\n }\n\n #clearFailedOwner(ownerDigest: string): void {\n this.#failedOwners.delete(ownerDigest);\n }\n\n #recordFailedOwner(ownerDigest: string): void {\n this.#failedOwners.delete(ownerDigest);\n this.#failedOwners.set(ownerDigest, true);\n if (this.#failedOwners.size <= this.#maxFailedOwners) return;\n const oldest = this.#failedOwners.keys().next().value;\n if (oldest !== undefined) this.#failedOwners.delete(oldest);\n }\n\n #normalizeMaxMemoryEntries(value: number | undefined): number {\n if (value === undefined || !Number.isFinite(value) || value < 1) return SD_CACHE_DEFAULT_MAX_MEMORY_ENTRIES;\n return Math.floor(value);\n }\n\n // why: Map giữ thứ tự chèn, nên delete-rồi-set đẩy key về cuối = \"vừa dùng gần nhất\".\n // Đây là toàn bộ cơ chế recency của LRU, không cần cấu trúc dữ liệu phụ.\n #touchMemoryEntry(ownerDigest: string, entry: SdCacheStoredValue<unknown>): void {\n this.#memoryEntries.delete(ownerDigest);\n this.#memoryEntries.set(ownerDigest, entry);\n }\n\n // why: bản chỉ-đọc của #touchMemoryEntry — KHÔNG ghi lại value. Handle còn mở đọc từ\n // state.entry (bản clone riêng), nên nếu key đã bị evict thì đọc không được phép hồi sinh nó:\n // \"handle còn mở vẫn phục vụ giá trị của chính nó dù entry chung đã bị evict\" là hành vi đã\n // ghi trong sd-cache.md.\n #refreshMemoryRecency(ownerDigest: string): void {\n const entry = this.#memoryEntries.get(ownerDigest);\n if (entry === undefined) return;\n this.#touchMemoryEntry(ownerDigest, entry);\n }\n\n #evictMemoryOverflow(): void {\n while (this.#memoryEntries.size > this.#maxMemoryEntries) {\n const oldest = this.#memoryEntries.keys().next().value;\n if (oldest === undefined) return;\n this.#memoryEntries.delete(oldest);\n }\n }\n\n #cloneEntry(entry: SdCacheStoredValue<unknown>, serializer: SdPersistenceSerializer): SdCacheStoredValue<unknown> {\n return { data: serializer.clone(entry.data), createdOn: new Date(entry.createdOn) };\n }\n\n #cloneAs<T>(serializer: SdPersistenceSerializer, value: unknown): T {\n const entry = serializer.parse<SdCacheStoredValue<T>>(serializer.stringify({ data: value, createdOn: new Date(0) }));\n return entry.data;\n }\n\n #isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n }\n\n #hasExactEntryKeys(value: unknown): value is Record<string, unknown> {\n return (\n this.#isRecord(value) &&\n Reflect.ownKeys(value).length === 2 &&\n Object.prototype.hasOwnProperty.call(value, 'data') &&\n Object.prototype.hasOwnProperty.call(value, 'createdOn')\n );\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -55,7 +55,7 @@ class DialogConfirmComponent {
55
55
  }
56
56
  };
57
57
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: DialogConfirmComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
58
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.25", type: DialogConfirmComponent, isStandalone: true, selector: "sd-dialog-confirm", ngImport: i0, template: "<div mat-dialog-title class=\"\">\n @if (data.icon) {\n <sd-icon [name]=\"data.icon\"></sd-icon>\n }\n <span class=\"T24M\" [innerHtml]=\"data.title || 'Confirm'\"></span>\n</div>\n<div mat-dialog-content class=\"sd-dialog-confirm__content\" [class.sd-dialog-confirm__content--radio]=\"data.radio\">\n <div class=\"T14R mb-4\" [innerHtml]=\"data.message\"></div>\n @if (data.input) {\n <sd-textarea [placeholder]=\"data.input.placeholder\" [(model)]=\"value\" [rows]=\"5\" [maxlength]=\"data.input.maxlength!\" />\n }\n @if (data.select) {\n <sd-select\n [placeholder]=\"data.select.placeholder\"\n [items]=\"data.select.items\"\n [valueField]=\"data.select.valueField\"\n [displayField]=\"data.select.displayField\"\n [multiple]=\"data.select.multiple\"\n [(model)]=\"value\"\n [required]=\"data.select.required\">\n </sd-select>\n }\n @if (data.date) {\n <sd-date\n [placeholder]=\"data.date.placeholder\"\n [(model)]=\"value\"\n type=\"date\"\n [min]=\"data.date.min!\"\n [max]=\"data.date.max!\"\n [required]=\"data.date.required\">\n </sd-date>\n }\n @if (data.datetime) {\n <sd-datetime\n [placeholder]=\"data.datetime.placeholder\"\n [(model)]=\"value\"\n [min]=\"data.datetime.min!\"\n [max]=\"data.datetime.max!\"\n [showSeconds]=\"data.datetime.showSeconds\"\n [required]=\"data.datetime.required\">\n </sd-datetime>\n }\n @if (data.radio) {\n <sd-radio\n [items]=\"data.radio.items\"\n [valueField]=\"data.radio.valueField\"\n [displayField]=\"data.radio.displayField\"\n [display]=\"data.radio.display || 'column'\"\n [(model)]=\"value\"\n [required]=\"data.radio.required\">\n </sd-radio>\n }\n</div>\n<div mat-dialog-actions align=\"end\">\n @if (data.noTitle) {\n <sd-button type=\"text\" [color]=\"data.noButtonColor || 'secondary'\" [title]=\"data.noTitle\" (click)=\"onCancel()\"></sd-button>\n }\n @if (data.yesTitle) {\n <sd-button\n class=\"ml-8\"\n type=\"fill\"\n [color]=\"data.yesButtonColor || 'primary'\"\n [disabled]=\"required && (value === undefined || value === null || value === '' || (value.length !== undefined && value.length === 0))\"\n cdkFocusInitial\n [title]=\"data.yesTitle\"\n (click)=\"onAccept()\"></sd-button>\n }\n</div>\n", styles: [".text-primary{color:var(--sd-primary)!important}.bg-primary{background:var(--sd-primary)!important}.border-primary{border-color:var(--sd-primary)!important}.text-primary-light{color:var(--sd-primary-light)!important}.bg-primary-light{background:var(--sd-primary-light)!important}.border-primary-light{border-color:var(--sd-primary-light)!important}.text-primary-dark{color:var(--sd-primary-dark)!important}.bg-primary-dark{background:var(--sd-primary-dark)!important}.border-primary-dark{border-color:var(--sd-primary-dark)!important}.text-primary-contrast{color:var(--sd-primary-contrast)!important}.bg-primary-contrast{background:var(--sd-primary-contrast)!important}.border-primary-contrast{border-color:var(--sd-primary-contrast)!important}.text-secondary{color:var(--sd-secondary)!important}.bg-secondary{background:var(--sd-secondary)!important}.border-secondary{border-color:var(--sd-secondary)!important}.text-secondary-light{color:var(--sd-secondary-light)!important}.bg-secondary-light{background:var(--sd-secondary-light)!important}.border-secondary-light{border-color:var(--sd-secondary-light)!important}.text-secondary-dark{color:var(--sd-secondary-dark)!important}.bg-secondary-dark{background:var(--sd-secondary-dark)!important}.border-secondary-dark{border-color:var(--sd-secondary-dark)!important}.text-secondary-contrast{color:var(--sd-secondary-contrast)!important}.bg-secondary-contrast{background:var(--sd-secondary-contrast)!important}.border-secondary-contrast{border-color:var(--sd-secondary-contrast)!important}.text-info{color:var(--sd-info)!important}.bg-info{background:var(--sd-info)!important}.border-info{border-color:var(--sd-info)!important}.text-info-light{color:var(--sd-info-light)!important}.bg-info-light{background:var(--sd-info-light)!important}.border-info-light{border-color:var(--sd-info-light)!important}.text-info-dark{color:var(--sd-info-dark)!important}.bg-info-dark{background:var(--sd-info-dark)!important}.border-info-dark{border-color:var(--sd-info-dark)!important}.text-info-contrast{color:var(--sd-info-contrast)!important}.bg-info-contrast{background:var(--sd-info-contrast)!important}.border-info-contrast{border-color:var(--sd-info-contrast)!important}.text-success{color:var(--sd-success)!important}.bg-success{background:var(--sd-success)!important}.border-success{border-color:var(--sd-success)!important}.text-success-light{color:var(--sd-success-light)!important}.bg-success-light{background:var(--sd-success-light)!important}.border-success-light{border-color:var(--sd-success-light)!important}.text-success-dark{color:var(--sd-success-dark)!important}.bg-success-dark{background:var(--sd-success-dark)!important}.border-success-dark{border-color:var(--sd-success-dark)!important}.text-success-contrast{color:var(--sd-success-contrast)!important}.bg-success-contrast{background:var(--sd-success-contrast)!important}.border-success-contrast{border-color:var(--sd-success-contrast)!important}.text-warning{color:var(--sd-warning)!important}.bg-warning{background:var(--sd-warning)!important}.border-warning{border-color:var(--sd-warning)!important}.text-warning-light{color:var(--sd-warning-light)!important}.bg-warning-light{background:var(--sd-warning-light)!important}.border-warning-light{border-color:var(--sd-warning-light)!important}.text-warning-dark{color:var(--sd-warning-dark)!important}.bg-warning-dark{background:var(--sd-warning-dark)!important}.border-warning-dark{border-color:var(--sd-warning-dark)!important}.text-warning-contrast{color:var(--sd-warning-contrast)!important}.bg-warning-contrast{background:var(--sd-warning-contrast)!important}.border-warning-contrast{border-color:var(--sd-warning-contrast)!important}.text-error{color:var(--sd-error)!important}.bg-error{background:var(--sd-error)!important}.border-error{border-color:var(--sd-error)!important}.text-error-light{color:var(--sd-error-light)!important}.bg-error-light{background:var(--sd-error-light)!important}.border-error-light{border-color:var(--sd-error-light)!important}.text-error-dark{color:var(--sd-error-dark)!important}.bg-error-dark{background:var(--sd-error-dark)!important}.border-error-dark{border-color:var(--sd-error-dark)!important}.text-error-contrast{color:var(--sd-error-contrast)!important}.bg-error-contrast{background:var(--sd-error-contrast)!important}.border-error-contrast{border-color:var(--sd-error-contrast)!important}.text-surface{color:var(--sd-surface)!important}.bg-surface{background:var(--sd-surface)!important}.border-surface{border-color:var(--sd-surface)!important}.text-surface-muted{color:var(--sd-surface-muted)!important}.bg-surface-muted{background:var(--sd-surface-muted)!important}.border-surface-muted{border-color:var(--sd-surface-muted)!important}.text-text{color:var(--sd-text)!important}.bg-text{background:var(--sd-text)!important}.border-text{border-color:var(--sd-text)!important}.text-text-secondary{color:var(--sd-text-secondary)!important}.bg-text-secondary{background:var(--sd-text-secondary)!important}.border-text-secondary{border-color:var(--sd-text-secondary)!important}.text-text-muted{color:var(--sd-text-muted)!important}.bg-text-muted{background:var(--sd-text-muted)!important}.border-text-muted{border-color:var(--sd-text-muted)!important}.text-border{color:var(--sd-border)!important}.bg-border{background:var(--sd-border)!important}.border-border{border-color:var(--sd-border)!important}.text-border-strong{color:var(--sd-border-strong)!important}.bg-border-strong{background:var(--sd-border-strong)!important}.border-border-strong{border-color:var(--sd-border-strong)!important}.text-disabled-bg{color:var(--sd-disabled-bg)!important}.bg-disabled-bg{background:var(--sd-disabled-bg)!important}.border-disabled-bg{border-color:var(--sd-disabled-bg)!important}.text-disabled-text{color:var(--sd-disabled-text)!important}.bg-disabled-text{background:var(--sd-disabled-text)!important}.border-disabled-text{border-color:var(--sd-disabled-text)!important}.text-white{color:#fff!important}.bg-white{background:#fff!important}.border-white{border-color:#fff!important}.text-black{color:#000!important}.bg-black{background:#000!important}.border-black{border-color:#000!important}.text-secondary{color:var(--sd-text-secondary)!important}.text-muted{color:var(--sd-text-muted)!important}.text-body{color:var(--sd-text)!important}.bg-muted{background:var(--sd-surface-muted)!important}:host .sd-dialog-confirm__content--radio{max-height:none;overflow:visible}:host .sd-dialog-confirm__content--radio sd-radio{height:auto}:host .mat-button{background-color:#f5f5f5}:host ::ng-deep .mat-dialog-title{display:flex;align-items:center;justify-content:flex-start}:host ::ng-deep .mat-dialog-title sd-icon{margin-right:5px}:host{display:block}:host ::ng-deep .mat-dialog-title sd-icon.info{color:var(--sd-info)}:host ::ng-deep .mat-dialog-title sd-icon.warning{color:var(--sd-warning)}:host ::ng-deep .mat-dialog-title sd-icon.success{color:var(--sd-success)}:host ::ng-deep .mat-dialog-title sd-icon.error{color:var(--sd-error)}\n"], dependencies: [{ kind: "component", type: SdIcon, selector: "sd-icon", inputs: ["name", "fontIcon", "color", "set", "fontSet", "size", "strokeWidth", "absoluteStrokeWidth", "ariaLabel"] }, { kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: MatDialogModule }, { kind: "directive", type: i1.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "directive", type: i1.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "directive", type: i1.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "component", type: SdButton, selector: "sd-button", inputs: ["autoId", "type", "color", "size", "fontSet", "title", "width", "tooltip", "prefixIcon", "suffixIcon", "disabled", "loading", "block", "htmlType"], outputs: ["click"] }, { kind: "component", type: SdDate, selector: "sd-date", inputs: ["autoId", "name", "size", "form", "label", "helperText", "placeholder", "hideInlineError", "required", "disabled", "viewed", "clearable", "inlineError", "hyperlink", "appearance", "floatLabel", "min", "minDate", "max", "maxDate", "model"], outputs: ["modelChange", "sdChange", "sdFocus"] }, { kind: "component", type: SdDatetime, selector: "sd-datetime", inputs: ["autoId", "name", "size", "form", "label", "helperText", "placeholder", "hideInlineError", "required", "disabled", "viewed", "showSeconds", "clearable", "inlineError", "hyperlink", "appearance", "floatLabel", "min", "minDate", "max", "maxDate", "model"], outputs: ["modelChange", "sdChange", "sdFocus"] }, { kind: "component", type: SdRadio, selector: "sd-radio", inputs: ["autoId", "name", "form", "label", "placeholder", "display", "items", "valueField", "displayField", "required", "inlineError", "disabled", "viewed", "color", "hyperlink", "model"], outputs: ["modelChange", "sdChange", "sdSelection"] }, { kind: "component", type: SdSelect, selector: "sd-select", inputs: ["autoId", "name", "size", "form", "label", "helperText", "placeholder", "valueField", "displayField", "disabledField", "cacheChecksum", "limit", "hyperlink", "minWidthPanel", "hideInlineError", "required", "disabled", "viewed", "multiple", "clearable", "validator", "inlineError", "appearance", "floatLabel", "items", "model"], outputs: ["modelChange", "sdChange", "sdSelection"] }, { kind: "component", type: SdTextarea, selector: "sd-textarea", inputs: ["autoId", "name", "size", "form", "label", "helperText", "placeholder", "rows", "hideInlineError", "required", "disabled", "viewed", "autoHeight", "maxlength", "pattern", "validator", "inlineError", "appearance", "floatLabel", "model"], outputs: ["modelChange", "sdChange"] }] });
58
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.25", type: DialogConfirmComponent, isStandalone: true, selector: "sd-dialog-confirm", ngImport: i0, template: "<div mat-dialog-title class=\"\">\n @if (data.icon) {\n <sd-icon [name]=\"data.icon\"></sd-icon>\n }\n <span class=\"T24M\" [innerHtml]=\"data.title || 'Confirm'\"></span>\n</div>\n<div mat-dialog-content class=\"sd-dialog-confirm__content\" [class.sd-dialog-confirm__content--radio]=\"data.radio\">\n <div class=\"T14R mb-4\" [innerHtml]=\"data.message\"></div>\n @if (data.input) {\n <sd-textarea [placeholder]=\"data.input.placeholder\" [(model)]=\"value\" [rows]=\"5\" [maxlength]=\"data.input.maxlength!\" />\n }\n @if (data.select) {\n <sd-select\n [placeholder]=\"data.select.placeholder\"\n [items]=\"data.select.items\"\n [valueField]=\"data.select.valueField\"\n [displayField]=\"data.select.displayField\"\n [multiple]=\"data.select.multiple\"\n [(model)]=\"value\"\n [required]=\"data.select.required\">\n </sd-select>\n }\n @if (data.date) {\n <sd-date\n [placeholder]=\"data.date.placeholder\"\n [(model)]=\"value\"\n type=\"date\"\n [min]=\"data.date.min!\"\n [max]=\"data.date.max!\"\n [required]=\"data.date.required\">\n </sd-date>\n }\n @if (data.datetime) {\n <sd-datetime\n [placeholder]=\"data.datetime.placeholder\"\n [(model)]=\"value\"\n [min]=\"data.datetime.min!\"\n [max]=\"data.datetime.max!\"\n [showSeconds]=\"data.datetime.showSeconds\"\n [required]=\"data.datetime.required\">\n </sd-datetime>\n }\n @if (data.radio) {\n <sd-radio\n [items]=\"data.radio.items\"\n [valueField]=\"data.radio.valueField\"\n [displayField]=\"data.radio.displayField\"\n [display]=\"data.radio.display || 'column'\"\n [(model)]=\"value\"\n [required]=\"data.radio.required\">\n </sd-radio>\n }\n</div>\n<div mat-dialog-actions align=\"end\">\n @if (data.noTitle) {\n <sd-button type=\"text\" [color]=\"data.noButtonColor || 'secondary'\" [title]=\"data.noTitle\" (click)=\"onCancel()\"></sd-button>\n }\n @if (data.yesTitle) {\n <sd-button\n class=\"ml-8\"\n type=\"fill\"\n [color]=\"data.yesButtonColor || 'primary'\"\n [disabled]=\"required && (value === undefined || value === null || value === '' || (value.length !== undefined && value.length === 0))\"\n cdkFocusInitial\n [title]=\"data.yesTitle\"\n (click)=\"onAccept()\"></sd-button>\n }\n</div>\n", styles: [".text-primary{color:var(--sd-primary)!important}.bg-primary{background:var(--sd-primary)!important}.border-primary{border-color:var(--sd-primary)!important}.text-primary-light{color:var(--sd-primary-light)!important}.bg-primary-light{background:var(--sd-primary-light)!important}.border-primary-light{border-color:var(--sd-primary-light)!important}.text-primary-dark{color:var(--sd-primary-dark)!important}.bg-primary-dark{background:var(--sd-primary-dark)!important}.border-primary-dark{border-color:var(--sd-primary-dark)!important}.text-primary-contrast{color:var(--sd-primary-contrast)!important}.bg-primary-contrast{background:var(--sd-primary-contrast)!important}.border-primary-contrast{border-color:var(--sd-primary-contrast)!important}.text-secondary{color:var(--sd-secondary)!important}.bg-secondary{background:var(--sd-secondary)!important}.border-secondary{border-color:var(--sd-secondary)!important}.text-secondary-light{color:var(--sd-secondary-light)!important}.bg-secondary-light{background:var(--sd-secondary-light)!important}.border-secondary-light{border-color:var(--sd-secondary-light)!important}.text-secondary-dark{color:var(--sd-secondary-dark)!important}.bg-secondary-dark{background:var(--sd-secondary-dark)!important}.border-secondary-dark{border-color:var(--sd-secondary-dark)!important}.text-secondary-contrast{color:var(--sd-secondary-contrast)!important}.bg-secondary-contrast{background:var(--sd-secondary-contrast)!important}.border-secondary-contrast{border-color:var(--sd-secondary-contrast)!important}.text-info{color:var(--sd-info)!important}.bg-info{background:var(--sd-info)!important}.border-info{border-color:var(--sd-info)!important}.text-info-light{color:var(--sd-info-light)!important}.bg-info-light{background:var(--sd-info-light)!important}.border-info-light{border-color:var(--sd-info-light)!important}.text-info-dark{color:var(--sd-info-dark)!important}.bg-info-dark{background:var(--sd-info-dark)!important}.border-info-dark{border-color:var(--sd-info-dark)!important}.text-info-contrast{color:var(--sd-info-contrast)!important}.bg-info-contrast{background:var(--sd-info-contrast)!important}.border-info-contrast{border-color:var(--sd-info-contrast)!important}.text-success{color:var(--sd-success)!important}.bg-success{background:var(--sd-success)!important}.border-success{border-color:var(--sd-success)!important}.text-success-light{color:var(--sd-success-light)!important}.bg-success-light{background:var(--sd-success-light)!important}.border-success-light{border-color:var(--sd-success-light)!important}.text-success-dark{color:var(--sd-success-dark)!important}.bg-success-dark{background:var(--sd-success-dark)!important}.border-success-dark{border-color:var(--sd-success-dark)!important}.text-success-contrast{color:var(--sd-success-contrast)!important}.bg-success-contrast{background:var(--sd-success-contrast)!important}.border-success-contrast{border-color:var(--sd-success-contrast)!important}.text-warning{color:var(--sd-warning)!important}.bg-warning{background:var(--sd-warning)!important}.border-warning{border-color:var(--sd-warning)!important}.text-warning-light{color:var(--sd-warning-light)!important}.bg-warning-light{background:var(--sd-warning-light)!important}.border-warning-light{border-color:var(--sd-warning-light)!important}.text-warning-dark{color:var(--sd-warning-dark)!important}.bg-warning-dark{background:var(--sd-warning-dark)!important}.border-warning-dark{border-color:var(--sd-warning-dark)!important}.text-warning-contrast{color:var(--sd-warning-contrast)!important}.bg-warning-contrast{background:var(--sd-warning-contrast)!important}.border-warning-contrast{border-color:var(--sd-warning-contrast)!important}.text-error{color:var(--sd-error)!important}.bg-error{background:var(--sd-error)!important}.border-error{border-color:var(--sd-error)!important}.text-error-light{color:var(--sd-error-light)!important}.bg-error-light{background:var(--sd-error-light)!important}.border-error-light{border-color:var(--sd-error-light)!important}.text-error-dark{color:var(--sd-error-dark)!important}.bg-error-dark{background:var(--sd-error-dark)!important}.border-error-dark{border-color:var(--sd-error-dark)!important}.text-error-contrast{color:var(--sd-error-contrast)!important}.bg-error-contrast{background:var(--sd-error-contrast)!important}.border-error-contrast{border-color:var(--sd-error-contrast)!important}.text-surface{color:var(--sd-surface)!important}.bg-surface{background:var(--sd-surface)!important}.border-surface{border-color:var(--sd-surface)!important}.text-surface-muted{color:var(--sd-surface-muted)!important}.bg-surface-muted{background:var(--sd-surface-muted)!important}.border-surface-muted{border-color:var(--sd-surface-muted)!important}.text-text{color:var(--sd-text)!important}.bg-text{background:var(--sd-text)!important}.border-text{border-color:var(--sd-text)!important}.text-text-secondary{color:var(--sd-text-secondary)!important}.bg-text-secondary{background:var(--sd-text-secondary)!important}.border-text-secondary{border-color:var(--sd-text-secondary)!important}.text-text-muted{color:var(--sd-text-muted)!important}.bg-text-muted{background:var(--sd-text-muted)!important}.border-text-muted{border-color:var(--sd-text-muted)!important}.text-border{color:var(--sd-border)!important}.bg-border{background:var(--sd-border)!important}.border-border{border-color:var(--sd-border)!important}.text-border-strong{color:var(--sd-border-strong)!important}.bg-border-strong{background:var(--sd-border-strong)!important}.border-border-strong{border-color:var(--sd-border-strong)!important}.text-disabled-bg{color:var(--sd-disabled-bg)!important}.bg-disabled-bg{background:var(--sd-disabled-bg)!important}.border-disabled-bg{border-color:var(--sd-disabled-bg)!important}.text-disabled-text{color:var(--sd-disabled-text)!important}.bg-disabled-text{background:var(--sd-disabled-text)!important}.border-disabled-text{border-color:var(--sd-disabled-text)!important}.text-white{color:#fff!important}.bg-white{background:#fff!important}.border-white{border-color:#fff!important}.text-black{color:#000!important}.bg-black{background:#000!important}.border-black{border-color:#000!important}.text-secondary{color:var(--sd-text-secondary)!important}.text-muted{color:var(--sd-text-muted)!important}.text-body{color:var(--sd-text)!important}.bg-muted{background:var(--sd-surface-muted)!important}:host .sd-dialog-confirm__content--radio{max-height:none;overflow:visible}:host .sd-dialog-confirm__content--radio sd-radio{height:auto}:host .mat-button{background-color:#f5f5f5}:host ::ng-deep .mat-dialog-title{display:flex;align-items:center;justify-content:flex-start}:host ::ng-deep .mat-dialog-title sd-icon{margin-right:5px}:host{display:block}:host ::ng-deep .mat-dialog-title sd-icon.info{color:var(--sd-info)}:host ::ng-deep .mat-dialog-title sd-icon.warning{color:var(--sd-warning)}:host ::ng-deep .mat-dialog-title sd-icon.success{color:var(--sd-success)}:host ::ng-deep .mat-dialog-title sd-icon.error{color:var(--sd-error)}\n"], dependencies: [{ kind: "component", type: SdIcon, selector: "sd-icon", inputs: ["name", "fontIcon", "color", "set", "fontSet", "size", "strokeWidth", "absoluteStrokeWidth", "ariaLabel"] }, { kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: MatDialogModule }, { kind: "directive", type: i1.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "directive", type: i1.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "directive", type: i1.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "component", type: SdButton, selector: "sd-button", inputs: ["autoId", "type", "color", "size", "fontSet", "title", "width", "tooltip", "prefixIcon", "suffixIcon", "disabled", "loading", "block", "htmlType"], outputs: ["click"] }, { kind: "component", type: SdDate, selector: "sd-date", inputs: ["autoId", "name", "size", "form", "label", "helperText", "placeholder", "hideInlineError", "required", "disabled", "viewed", "clearable", "inlineError", "hyperlink", "appearance", "floatLabel", "min", "minDate", "max", "maxDate", "transform", "model"], outputs: ["modelChange", "sdChange", "sdFocus"] }, { kind: "component", type: SdDatetime, selector: "sd-datetime", inputs: ["autoId", "name", "size", "form", "label", "helperText", "placeholder", "hideInlineError", "required", "disabled", "viewed", "showSeconds", "clearable", "inlineError", "hyperlink", "appearance", "floatLabel", "min", "minDate", "max", "maxDate", "transform", "model"], outputs: ["modelChange", "sdChange", "sdFocus"] }, { kind: "component", type: SdRadio, selector: "sd-radio", inputs: ["autoId", "name", "form", "label", "placeholder", "display", "items", "valueField", "displayField", "required", "inlineError", "disabled", "viewed", "color", "hyperlink", "model"], outputs: ["modelChange", "sdChange", "sdSelection"] }, { kind: "component", type: SdSelect, selector: "sd-select", inputs: ["autoId", "name", "size", "form", "label", "helperText", "placeholder", "valueField", "displayField", "disabledField", "cacheChecksum", "limit", "hyperlink", "minWidthPanel", "hideInlineError", "required", "disabled", "viewed", "multiple", "showSelectAll", "clearable", "validator", "inlineError", "appearance", "floatLabel", "items", "model"], outputs: ["modelChange", "sdChange", "sdSelection"] }, { kind: "component", type: SdTextarea, selector: "sd-textarea", inputs: ["autoId", "name", "size", "form", "label", "helperText", "placeholder", "rows", "hideInlineError", "required", "disabled", "viewed", "autoHeight", "maxlength", "pattern", "validator", "inlineError", "appearance", "floatLabel", "model"], outputs: ["modelChange", "sdChange"] }] });
59
59
  }
60
60
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: DialogConfirmComponent, decorators: [{
61
61
  type: Component,
@@ -66,6 +66,24 @@ class SdConfirmService {
66
66
  dialog = inject(MatDialog);
67
67
  #i18n = inject(I18nService);
68
68
  constructor() { }
69
+ /**
70
+ * Biến `afterClosed()` của dialog thành một Promise LUÔN settle.
71
+ *
72
+ * why: cả 6 API trước đây đều viết `if (result) { ...ACCEPT/CANCEL... }`, nên MỌI đường đóng
73
+ * dialog không đi qua hai nút — phím ESC, click backdrop (khi `disableBackdropClose: false`),
74
+ * hoặc `dialogRef.close()` gọi từ code — cho `result` là `undefined` và promise KHÔNG BAO GIỜ
75
+ * settle. Closure của caller (cùng mọi thứ nó giữ) bị ghim lại đến hết phiên, và `await` đứng im
76
+ * mãi mãi. Đóng-không-chọn về ngữ nghĩa chính là huỷ, nên nó reject `'CANCEL'` — đúng nhánh mà
77
+ * consumer vốn đã bắt.
78
+ */
79
+ #settleOnClose = (afterClosed) => new Promise((resolve, reject) => {
80
+ afterClosed.subscribe(result => {
81
+ if (result?.action === 'ACCEPT')
82
+ resolve(result.value);
83
+ else
84
+ reject(result?.action ?? 'CANCEL');
85
+ });
86
+ });
69
87
  confirm = (message, option = {}) => {
70
88
  const dialogRef = this.dialog.open(DialogConfirmComponent, {
71
89
  width: option?.width || '400px',
@@ -79,18 +97,7 @@ class SdConfirmService {
79
97
  yesButtonColor: option?.yesButtonColor || 'primary',
80
98
  },
81
99
  });
82
- return new Promise((resolve, reject) => {
83
- dialogRef.afterClosed().subscribe(result => {
84
- if (result) {
85
- if (result.action === 'CANCEL') {
86
- reject(result.action);
87
- }
88
- else if (result.action === 'ACCEPT') {
89
- resolve(result.value);
90
- }
91
- }
92
- });
93
- });
100
+ return this.#settleOnClose(dialogRef.afterClosed());
94
101
  };
95
102
  withInput = (message, option) => {
96
103
  const dialogRef = this.dialog.open(DialogConfirmComponent, {
@@ -110,18 +117,7 @@ class SdConfirmService {
110
117
  },
111
118
  },
112
119
  });
113
- return new Promise((resolve, reject) => {
114
- dialogRef.afterClosed().subscribe(result => {
115
- if (result) {
116
- if (result.action === 'CANCEL') {
117
- reject(result.action);
118
- }
119
- else if (result.action === 'ACCEPT') {
120
- resolve(result.value);
121
- }
122
- }
123
- });
124
- });
120
+ return this.#settleOnClose(dialogRef.afterClosed());
125
121
  };
126
122
  withRadio = (message, option) => {
127
123
  const dialogRef = this.dialog.open(DialogConfirmComponent, {
@@ -144,18 +140,7 @@ class SdConfirmService {
144
140
  },
145
141
  },
146
142
  });
147
- return new Promise((resolve, reject) => {
148
- dialogRef.afterClosed().subscribe(result => {
149
- if (result) {
150
- if (result.action === 'CANCEL') {
151
- reject(result.action);
152
- }
153
- else if (result.action === 'ACCEPT') {
154
- resolve(result.value);
155
- }
156
- }
157
- });
158
- });
143
+ return this.#settleOnClose(dialogRef.afterClosed());
159
144
  };
160
145
  withSelect = (message, option) => {
161
146
  const dialogRef = this.dialog.open(DialogConfirmComponent, {
@@ -179,18 +164,7 @@ class SdConfirmService {
179
164
  },
180
165
  },
181
166
  });
182
- return new Promise((resolve, reject) => {
183
- dialogRef.afterClosed().subscribe(result => {
184
- if (result) {
185
- if (result.action === 'CANCEL') {
186
- reject(result.action);
187
- }
188
- else if (result.action === 'ACCEPT') {
189
- resolve(result.value);
190
- }
191
- }
192
- });
193
- });
167
+ return this.#settleOnClose(dialogRef.afterClosed());
194
168
  };
195
169
  withDate = (message, option) => {
196
170
  const dialogRef = this.dialog.open(DialogConfirmComponent, {
@@ -212,18 +186,7 @@ class SdConfirmService {
212
186
  },
213
187
  },
214
188
  });
215
- return new Promise((resolve, reject) => {
216
- dialogRef.afterClosed().subscribe(result => {
217
- if (result) {
218
- if (result.action === 'CANCEL') {
219
- reject(result.action);
220
- }
221
- else if (result.action === 'ACCEPT') {
222
- resolve(result.value);
223
- }
224
- }
225
- });
226
- });
189
+ return this.#settleOnClose(dialogRef.afterClosed());
227
190
  };
228
191
  withDatetime = (message, option) => {
229
192
  const dialogRef = this.dialog.open(DialogConfirmComponent, {
@@ -246,18 +209,7 @@ class SdConfirmService {
246
209
  },
247
210
  },
248
211
  });
249
- return new Promise((resolve, reject) => {
250
- dialogRef.afterClosed().subscribe(result => {
251
- if (result) {
252
- if (result.action === 'CANCEL') {
253
- reject(result.action);
254
- }
255
- else if (result.action === 'ACCEPT') {
256
- resolve(result.value);
257
- }
258
- }
259
- });
260
- });
212
+ return this.#settleOnClose(dialogRef.afterClosed());
261
213
  };
262
214
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: SdConfirmService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
263
215
  static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: SdConfirmService, providedIn: 'root' });