@sdcorejs/angular 21.1.3 → 21.1.4

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 (168) hide show
  1. package/README.md +17 -14
  2. package/fesm2022/sdcorejs-angular-components-anchor.mjs +14 -14
  3. package/fesm2022/sdcorejs-angular-components-anchor.mjs.map +1 -1
  4. package/fesm2022/sdcorejs-angular-components-audit-diff.mjs +332 -0
  5. package/fesm2022/sdcorejs-angular-components-audit-diff.mjs.map +1 -0
  6. package/fesm2022/sdcorejs-angular-components-badge.mjs +1 -0
  7. package/fesm2022/sdcorejs-angular-components-badge.mjs.map +1 -1
  8. package/fesm2022/sdcorejs-angular-components-breadcrumb.mjs +121 -0
  9. package/fesm2022/sdcorejs-angular-components-breadcrumb.mjs.map +1 -0
  10. package/fesm2022/sdcorejs-angular-components-data-state.mjs +68 -0
  11. package/fesm2022/sdcorejs-angular-components-data-state.mjs.map +1 -0
  12. package/fesm2022/sdcorejs-angular-components-document-builder.mjs +18 -23
  13. package/fesm2022/sdcorejs-angular-components-document-builder.mjs.map +1 -1
  14. package/fesm2022/sdcorejs-angular-components-editor.mjs +6 -4
  15. package/fesm2022/sdcorejs-angular-components-editor.mjs.map +1 -1
  16. package/fesm2022/sdcorejs-angular-components-form-generic.mjs +495 -838
  17. package/fesm2022/sdcorejs-angular-components-form-generic.mjs.map +1 -1
  18. package/fesm2022/sdcorejs-angular-components-import-excel.mjs +24 -34
  19. package/fesm2022/sdcorejs-angular-components-import-excel.mjs.map +1 -1
  20. package/fesm2022/sdcorejs-angular-components-job-progress.mjs +97 -0
  21. package/fesm2022/sdcorejs-angular-components-job-progress.mjs.map +1 -0
  22. package/fesm2022/sdcorejs-angular-components-mini-editor.mjs +10 -20
  23. package/fesm2022/sdcorejs-angular-components-mini-editor.mjs.map +1 -1
  24. package/fesm2022/sdcorejs-angular-components-modal.mjs +61 -4
  25. package/fesm2022/sdcorejs-angular-components-modal.mjs.map +1 -1
  26. package/fesm2022/sdcorejs-angular-components-preview.mjs +1438 -218
  27. package/fesm2022/sdcorejs-angular-components-preview.mjs.map +1 -1
  28. package/fesm2022/sdcorejs-angular-components-query-bar.mjs +4 -4
  29. package/fesm2022/sdcorejs-angular-components-query-bar.mjs.map +1 -1
  30. package/fesm2022/sdcorejs-angular-components-query-builder.mjs +1 -1
  31. package/fesm2022/sdcorejs-angular-components-query-builder.mjs.map +1 -1
  32. package/fesm2022/sdcorejs-angular-components-side-drawer.mjs +39 -2
  33. package/fesm2022/sdcorejs-angular-components-side-drawer.mjs.map +1 -1
  34. package/fesm2022/sdcorejs-angular-components-tab-router.mjs +16 -22
  35. package/fesm2022/sdcorejs-angular-components-tab-router.mjs.map +1 -1
  36. package/fesm2022/sdcorejs-angular-components-tab.mjs +48 -4
  37. package/fesm2022/sdcorejs-angular-components-tab.mjs.map +1 -1
  38. package/fesm2022/sdcorejs-angular-components-table.mjs +96 -63
  39. package/fesm2022/sdcorejs-angular-components-table.mjs.map +1 -1
  40. package/fesm2022/sdcorejs-angular-components-tree.mjs +186 -17
  41. package/fesm2022/sdcorejs-angular-components-tree.mjs.map +1 -1
  42. package/fesm2022/sdcorejs-angular-components-upload-file.mjs +15 -22
  43. package/fesm2022/sdcorejs-angular-components-upload-file.mjs.map +1 -1
  44. package/fesm2022/sdcorejs-angular-components.mjs +4 -0
  45. package/fesm2022/sdcorejs-angular-components.mjs.map +1 -1
  46. package/fesm2022/sdcorejs-angular-directives.mjs +29 -41
  47. package/fesm2022/sdcorejs-angular-directives.mjs.map +1 -1
  48. package/fesm2022/sdcorejs-angular-forms-autocomplete.mjs +7 -7
  49. package/fesm2022/sdcorejs-angular-forms-autocomplete.mjs.map +1 -1
  50. package/fesm2022/sdcorejs-angular-forms-checkbox.mjs +20 -71
  51. package/fesm2022/sdcorejs-angular-forms-checkbox.mjs.map +1 -1
  52. package/fesm2022/sdcorejs-angular-forms-chip-calendar.mjs +6 -3
  53. package/fesm2022/sdcorejs-angular-forms-chip-calendar.mjs.map +1 -1
  54. package/fesm2022/sdcorejs-angular-forms-chip.mjs +6 -3
  55. package/fesm2022/sdcorejs-angular-forms-chip.mjs.map +1 -1
  56. package/fesm2022/sdcorejs-angular-forms-date-range.mjs +16 -13
  57. package/fesm2022/sdcorejs-angular-forms-date-range.mjs.map +1 -1
  58. package/fesm2022/sdcorejs-angular-forms-date.mjs +42 -65
  59. package/fesm2022/sdcorejs-angular-forms-date.mjs.map +1 -1
  60. package/fesm2022/sdcorejs-angular-forms-datetime.mjs +51 -66
  61. package/fesm2022/sdcorejs-angular-forms-datetime.mjs.map +1 -1
  62. package/fesm2022/sdcorejs-angular-forms-entity-picker.mjs +384 -0
  63. package/fesm2022/sdcorejs-angular-forms-entity-picker.mjs.map +1 -0
  64. package/fesm2022/sdcorejs-angular-forms-input-color.mjs +1 -1
  65. package/fesm2022/sdcorejs-angular-forms-input-color.mjs.map +1 -1
  66. package/fesm2022/sdcorejs-angular-forms-input-number.mjs +7 -5
  67. package/fesm2022/sdcorejs-angular-forms-input-number.mjs.map +1 -1
  68. package/fesm2022/sdcorejs-angular-forms-input.mjs +290 -56
  69. package/fesm2022/sdcorejs-angular-forms-input.mjs.map +1 -1
  70. package/fesm2022/sdcorejs-angular-forms-models.mjs +155 -2
  71. package/fesm2022/sdcorejs-angular-forms-models.mjs.map +1 -1
  72. package/fesm2022/sdcorejs-angular-forms-radio.mjs +44 -66
  73. package/fesm2022/sdcorejs-angular-forms-radio.mjs.map +1 -1
  74. package/fesm2022/sdcorejs-angular-forms-select.mjs +6 -20
  75. package/fesm2022/sdcorejs-angular-forms-select.mjs.map +1 -1
  76. package/fesm2022/sdcorejs-angular-forms-switch.mjs +19 -64
  77. package/fesm2022/sdcorejs-angular-forms-switch.mjs.map +1 -1
  78. package/fesm2022/sdcorejs-angular-forms-textarea.mjs +6 -5
  79. package/fesm2022/sdcorejs-angular-forms-textarea.mjs.map +1 -1
  80. package/fesm2022/sdcorejs-angular-forms-time-range.mjs +277 -0
  81. package/fesm2022/sdcorejs-angular-forms-time-range.mjs.map +1 -0
  82. package/fesm2022/sdcorejs-angular-forms-time.mjs +307 -0
  83. package/fesm2022/sdcorejs-angular-forms-time.mjs.map +1 -0
  84. package/fesm2022/sdcorejs-angular-forms-tree-select.mjs +210 -0
  85. package/fesm2022/sdcorejs-angular-forms-tree-select.mjs.map +1 -0
  86. package/fesm2022/sdcorejs-angular-forms.mjs +73 -4
  87. package/fesm2022/sdcorejs-angular-forms.mjs.map +1 -1
  88. package/fesm2022/sdcorejs-angular-i18n.mjs +355 -10
  89. package/fesm2022/sdcorejs-angular-i18n.mjs.map +1 -1
  90. package/fesm2022/sdcorejs-angular-interceptors.mjs +12 -17
  91. package/fesm2022/sdcorejs-angular-interceptors.mjs.map +1 -1
  92. package/fesm2022/sdcorejs-angular-modules-layout.mjs +861 -80
  93. package/fesm2022/sdcorejs-angular-modules-layout.mjs.map +1 -1
  94. package/fesm2022/sdcorejs-angular-pipes.mjs +5 -7
  95. package/fesm2022/sdcorejs-angular-pipes.mjs.map +1 -1
  96. package/fesm2022/sdcorejs-angular-services-api.mjs +407 -137
  97. package/fesm2022/sdcorejs-angular-services-api.mjs.map +1 -1
  98. package/fesm2022/sdcorejs-angular-services-cache.mjs +515 -105
  99. package/fesm2022/sdcorejs-angular-services-cache.mjs.map +1 -1
  100. package/fesm2022/sdcorejs-angular-services-confirm.mjs +5 -7
  101. package/fesm2022/sdcorejs-angular-services-confirm.mjs.map +1 -1
  102. package/fesm2022/sdcorejs-angular-services-docx.mjs +7 -10
  103. package/fesm2022/sdcorejs-angular-services-docx.mjs.map +1 -1
  104. package/fesm2022/sdcorejs-angular-services-loading.mjs +339 -74
  105. package/fesm2022/sdcorejs-angular-services-loading.mjs.map +1 -1
  106. package/fesm2022/sdcorejs-angular-services-notify.mjs +7 -10
  107. package/fesm2022/sdcorejs-angular-services-notify.mjs.map +1 -1
  108. package/fesm2022/sdcorejs-angular-services-persistence.mjs +899 -0
  109. package/fesm2022/sdcorejs-angular-services-persistence.mjs.map +1 -0
  110. package/fesm2022/sdcorejs-angular-services-storage.mjs +324 -122
  111. package/fesm2022/sdcorejs-angular-services-storage.mjs.map +1 -1
  112. package/fesm2022/sdcorejs-angular-services-task.mjs +389 -0
  113. package/fesm2022/sdcorejs-angular-services-task.mjs.map +1 -0
  114. package/fesm2022/sdcorejs-angular-services-unsaved-changes.mjs +255 -0
  115. package/fesm2022/sdcorejs-angular-services-unsaved-changes.mjs.map +1 -0
  116. package/fesm2022/sdcorejs-angular-services-viewport.mjs +76 -0
  117. package/fesm2022/sdcorejs-angular-services-viewport.mjs.map +1 -0
  118. package/fesm2022/sdcorejs-angular-services.mjs +4 -0
  119. package/fesm2022/sdcorejs-angular-services.mjs.map +1 -1
  120. package/package.json +49 -1
  121. package/types/sdcorejs-angular-components-audit-diff.d.ts +74 -0
  122. package/types/sdcorejs-angular-components-badge.d.ts +1 -1
  123. package/types/sdcorejs-angular-components-breadcrumb.d.ts +53 -0
  124. package/types/sdcorejs-angular-components-data-state.d.ts +44 -0
  125. package/types/sdcorejs-angular-components-document-builder.d.ts +5 -5
  126. package/types/sdcorejs-angular-components-form-generic.d.ts +67 -104
  127. package/types/sdcorejs-angular-components-import-excel.d.ts +4 -14
  128. package/types/sdcorejs-angular-components-job-progress.d.ts +38 -0
  129. package/types/sdcorejs-angular-components-mini-editor.d.ts +9 -9
  130. package/types/sdcorejs-angular-components-modal.d.ts +7 -1
  131. package/types/sdcorejs-angular-components-preview.d.ts +181 -28
  132. package/types/sdcorejs-angular-components-side-drawer.d.ts +7 -1
  133. package/types/sdcorejs-angular-components-tab.d.ts +9 -2
  134. package/types/sdcorejs-angular-components-table.d.ts +8 -7
  135. package/types/sdcorejs-angular-components-tree.d.ts +24 -2
  136. package/types/sdcorejs-angular-components-upload-file.d.ts +5 -4
  137. package/types/sdcorejs-angular-components.d.ts +4 -0
  138. package/types/sdcorejs-angular-directives.d.ts +10 -8
  139. package/types/sdcorejs-angular-forms-autocomplete.d.ts +3 -4
  140. package/types/sdcorejs-angular-forms-checkbox.d.ts +4 -8
  141. package/types/sdcorejs-angular-forms-date-range.d.ts +6 -7
  142. package/types/sdcorejs-angular-forms-date.d.ts +2 -2
  143. package/types/sdcorejs-angular-forms-datetime.d.ts +2 -2
  144. package/types/sdcorejs-angular-forms-entity-picker.d.ts +128 -0
  145. package/types/sdcorejs-angular-forms-input-number.d.ts +1 -1
  146. package/types/sdcorejs-angular-forms-input.d.ts +74 -11
  147. package/types/sdcorejs-angular-forms-models.d.ts +86 -3
  148. package/types/sdcorejs-angular-forms-radio.d.ts +12 -8
  149. package/types/sdcorejs-angular-forms-switch.d.ts +4 -7
  150. package/types/sdcorejs-angular-forms-time-range.d.ts +98 -0
  151. package/types/sdcorejs-angular-forms-time.d.ts +117 -0
  152. package/types/sdcorejs-angular-forms-tree-select.d.ts +76 -0
  153. package/types/sdcorejs-angular-forms.d.ts +15 -5
  154. package/types/sdcorejs-angular-i18n.d.ts +68 -2
  155. package/types/sdcorejs-angular-interceptors.d.ts +5 -6
  156. package/types/sdcorejs-angular-modules-layout.d.ts +288 -15
  157. package/types/sdcorejs-angular-pipes.d.ts +2 -2
  158. package/types/sdcorejs-angular-services-api.d.ts +68 -24
  159. package/types/sdcorejs-angular-services-cache.d.ts +52 -16
  160. package/types/sdcorejs-angular-services-confirm.d.ts +3 -2
  161. package/types/sdcorejs-angular-services-docx.d.ts +2 -3
  162. package/types/sdcorejs-angular-services-loading.d.ts +16 -8
  163. package/types/sdcorejs-angular-services-persistence.d.ts +159 -0
  164. package/types/sdcorejs-angular-services-storage.d.ts +26 -8
  165. package/types/sdcorejs-angular-services-task.d.ts +104 -0
  166. package/types/sdcorejs-angular-services-unsaved-changes.d.ts +83 -0
  167. package/types/sdcorejs-angular-services-viewport.d.ts +42 -0
  168. package/types/sdcorejs-angular-services.d.ts +4 -0
@@ -0,0 +1,389 @@
1
+ import { DOCUMENT } from '@angular/common';
2
+ import * as i0 from '@angular/core';
3
+ import { InjectionToken, inject, DestroyRef, signal, computed, Injectable } from '@angular/core';
4
+
5
+ function isSdTaskTerminal(status) {
6
+ return status === 'succeeded' || status === 'failed' || status === 'cancelled';
7
+ }
8
+
9
+ const SD_TASK_EVENT_SOURCE_FACTORY = new InjectionToken('SD_TASK_EVENT_SOURCE_FACTORY', {
10
+ factory: () => {
11
+ const windowRef = inject(DOCUMENT).defaultView;
12
+ if (!windowRef?.EventSource)
13
+ return null;
14
+ return {
15
+ create: (url, init) => new windowRef.EventSource(url, init),
16
+ };
17
+ },
18
+ });
19
+ const SD_TASK_RANDOM = new InjectionToken('SD_TASK_RANDOM', {
20
+ factory: () => Math.random,
21
+ });
22
+
23
+ const DEFAULT_POLL_INTERVAL_MS = 2000;
24
+ const DEFAULT_RETRY_POLICY = {
25
+ maxAttempts: 3,
26
+ initialDelayMs: 1000,
27
+ backoff: 2,
28
+ maxDelayMs: 30_000,
29
+ jitter: 0.2,
30
+ };
31
+ const MAX_TIMER_MS = 2_147_483_647;
32
+ class SdTaskService {
33
+ #eventSourceFactory = inject(SD_TASK_EVENT_SOURCE_FACTORY);
34
+ #random = inject(SD_TASK_RANDOM);
35
+ #destroyRef = inject(DestroyRef);
36
+ #entries = signal(new Map(), ...(ngDevMode ? [{ debugName: "#entries" }] : /* istanbul ignore next */ []));
37
+ tasks = computed(() => [...this.#entries().values()].map(entry => entry.view), ...(ngDevMode ? [{ debugName: "tasks" }] : /* istanbul ignore next */ []));
38
+ constructor() {
39
+ this.#destroyRef.onDestroy(() => {
40
+ for (const entry of this.#entries().values()) {
41
+ entry.destroyed = true;
42
+ this.#stop(entry);
43
+ }
44
+ this.#entries.set(new Map());
45
+ });
46
+ }
47
+ watch(options) {
48
+ const existing = this.#entries().get(options.id);
49
+ if (existing) {
50
+ existing.subscriberCountSignal.update(count => count + 1);
51
+ return this.#createLease(existing);
52
+ }
53
+ const initialState = normalizeState(options.id, options.initialState ?? { id: options.id, status: 'queued' });
54
+ const stateSignal = signal(initialState, ...(ngDevMode ? [{ debugName: "stateSignal" }] : /* istanbul ignore next */ []));
55
+ const connectionSignal = signal(options.source.mode === 'manual' ? 'idle' : 'connecting', ...(ngDevMode ? [{ debugName: "connectionSignal" }] : /* istanbul ignore next */ []));
56
+ const errorSignal = signal(null, ...(ngDevMode ? [{ debugName: "errorSignal" }] : /* istanbul ignore next */ []));
57
+ const subscriberCountSignal = signal(1, ...(ngDevMode ? [{ debugName: "subscriberCountSignal" }] : /* istanbul ignore next */ []));
58
+ const pendingCancelSignal = signal(false, ...(ngDevMode ? [{ debugName: "pendingCancelSignal" }] : /* istanbul ignore next */ []));
59
+ const entry = {};
60
+ const view = {
61
+ id: options.id,
62
+ state: stateSignal.asReadonly(),
63
+ connection: connectionSignal.asReadonly(),
64
+ error: errorSignal.asReadonly(),
65
+ subscriberCount: subscriberCountSignal.asReadonly(),
66
+ canCancel: computed(() => {
67
+ const status = stateSignal().status;
68
+ return !pendingCancelSignal() && (status === 'queued' || status === 'running');
69
+ }),
70
+ canRetry: computed(() => {
71
+ const status = stateSignal().status;
72
+ return connectionSignal() === 'error' || status === 'failed' || status === 'cancelled';
73
+ }),
74
+ cancel: () => this.#cancel(entry),
75
+ retry: () => this.#retry(entry),
76
+ };
77
+ Object.assign(entry, {
78
+ id: options.id,
79
+ source: options.source,
80
+ stateSignal,
81
+ connectionSignal,
82
+ errorSignal,
83
+ subscriberCountSignal,
84
+ pendingCancelSignal,
85
+ view,
86
+ messageQueue: Promise.resolve(),
87
+ generation: 0,
88
+ failures: 0,
89
+ requestAttempt: 0,
90
+ destroyed: false,
91
+ });
92
+ this.#entries.update(entries => new Map(entries).set(options.id, entry));
93
+ if (!isSdTaskTerminal(initialState.status))
94
+ this.#start(entry);
95
+ else
96
+ connectionSignal.set('closed');
97
+ return this.#createLease(entry);
98
+ }
99
+ get(id) {
100
+ return this.#entries().get(id)?.view;
101
+ }
102
+ update(id, patch) {
103
+ const entry = this.#entries().get(id);
104
+ if (!entry)
105
+ return false;
106
+ this.#applyState(entry, { ...entry.stateSignal(), ...patch, id });
107
+ return true;
108
+ }
109
+ cancel(id) {
110
+ const entry = this.#entries().get(id);
111
+ return entry ? this.#cancel(entry) : Promise.resolve(false);
112
+ }
113
+ retry(id) {
114
+ const entry = this.#entries().get(id);
115
+ if (!entry)
116
+ return false;
117
+ this.#retry(entry);
118
+ return true;
119
+ }
120
+ #createLease(entry) {
121
+ const destroyed = signal(false, ...(ngDevMode ? [{ debugName: "destroyed" }] : /* istanbul ignore next */ []));
122
+ return {
123
+ ...entry.view,
124
+ destroyed: destroyed.asReadonly(),
125
+ destroy: () => {
126
+ if (destroyed())
127
+ return;
128
+ destroyed.set(true);
129
+ entry.subscriberCountSignal.update(count => Math.max(0, count - 1));
130
+ if (entry.subscriberCountSignal() > 0)
131
+ return;
132
+ entry.destroyed = true;
133
+ this.#stop(entry);
134
+ this.#entries.update(entries => {
135
+ if (entries.get(entry.id) !== entry)
136
+ return entries;
137
+ const next = new Map(entries);
138
+ next.delete(entry.id);
139
+ return next;
140
+ });
141
+ },
142
+ };
143
+ }
144
+ #start(entry) {
145
+ if (entry.destroyed || entry.subscriberCountSignal() === 0 || isSdTaskTerminal(entry.stateSignal().status))
146
+ return;
147
+ this.#stop(entry);
148
+ entry.destroyed = false;
149
+ entry.failures = 0;
150
+ entry.requestAttempt = 0;
151
+ entry.errorSignal.set(null);
152
+ const generation = entry.generation;
153
+ if (entry.source.mode === 'manual') {
154
+ entry.connectionSignal.set('idle');
155
+ return;
156
+ }
157
+ entry.connectionSignal.set('connecting');
158
+ if (entry.source.mode === 'poll')
159
+ void this.#runPoll(entry, generation);
160
+ else
161
+ this.#openSse(entry, generation);
162
+ }
163
+ #stop(entry) {
164
+ entry.generation += 1;
165
+ if (entry.timer)
166
+ clearTimeout(entry.timer);
167
+ entry.timer = undefined;
168
+ entry.controller?.abort();
169
+ entry.controller = undefined;
170
+ entry.eventSource?.close();
171
+ entry.eventSource = undefined;
172
+ }
173
+ async #runPoll(entry, generation) {
174
+ if (!this.#isCurrent(entry, generation) || entry.source.mode !== 'poll')
175
+ return;
176
+ const controller = new AbortController();
177
+ entry.controller = controller;
178
+ const attempt = ++entry.requestAttempt;
179
+ try {
180
+ const state = await Promise.resolve(entry.source.load({ id: entry.id, signal: controller.signal, attempt, state: entry.stateSignal() }));
181
+ if (!this.#isCurrent(entry, generation) || controller.signal.aborted)
182
+ return;
183
+ entry.controller = undefined;
184
+ entry.failures = 0;
185
+ entry.errorSignal.set(null);
186
+ entry.connectionSignal.set('open');
187
+ this.#applyState(entry, state);
188
+ if (!this.#isCurrent(entry, generation) || isSdTaskTerminal(entry.stateSignal().status))
189
+ return;
190
+ this.#schedule(entry, normalizeTimer(entry.source.intervalMs, DEFAULT_POLL_INTERVAL_MS), () => this.#runPoll(entry, generation));
191
+ }
192
+ catch (error) {
193
+ if (!this.#isCurrent(entry, generation) || controller.signal.aborted)
194
+ return;
195
+ entry.controller = undefined;
196
+ this.#handleConnectionFailure(entry, generation, error, entry.source.retry, () => this.#runPoll(entry, generation));
197
+ }
198
+ }
199
+ #openSse(entry, generation) {
200
+ if (!this.#isCurrent(entry, generation) || entry.source.mode !== 'sse')
201
+ return;
202
+ if (!this.#eventSourceFactory) {
203
+ entry.connectionSignal.set('error');
204
+ entry.errorSignal.set(new Error('EventSource is unavailable in this environment.'));
205
+ return;
206
+ }
207
+ let eventSource;
208
+ try {
209
+ const url = typeof entry.source.url === 'function' ? entry.source.url() : entry.source.url;
210
+ eventSource = this.#eventSourceFactory.create(url, entry.source.eventSourceInit);
211
+ }
212
+ catch (error) {
213
+ this.#handleConnectionFailure(entry, generation, error, entry.source.retry, () => this.#openSse(entry, generation));
214
+ return;
215
+ }
216
+ entry.eventSource = eventSource;
217
+ eventSource.onopen = () => {
218
+ if (!this.#isCurrentEventSource(entry, generation, eventSource))
219
+ return;
220
+ entry.failures = 0;
221
+ entry.errorSignal.set(null);
222
+ entry.connectionSignal.set('open');
223
+ };
224
+ eventSource.onmessage = event => {
225
+ entry.messageQueue = entry.messageQueue.then(() => this.#handleSseMessage(entry, generation, eventSource, event));
226
+ };
227
+ eventSource.onerror = event => {
228
+ if (!this.#isCurrentEventSource(entry, generation, eventSource))
229
+ return;
230
+ eventSource.close();
231
+ entry.eventSource = undefined;
232
+ this.#handleConnectionFailure(entry, generation, event, entry.source.mode === 'sse' ? entry.source.retry : undefined, () => this.#openSse(entry, generation));
233
+ };
234
+ }
235
+ async #handleSseMessage(entry, generation, eventSource, event) {
236
+ if (!this.#isCurrentEventSource(entry, generation, eventSource) || entry.source.mode !== 'sse')
237
+ return;
238
+ try {
239
+ const state = entry.source.parse
240
+ ? await Promise.resolve(entry.source.parse(event))
241
+ : JSON.parse(event.data);
242
+ if (!this.#isCurrentEventSource(entry, generation, eventSource))
243
+ return;
244
+ entry.errorSignal.set(null);
245
+ this.#applyState(entry, state);
246
+ }
247
+ catch (error) {
248
+ if (!this.#isCurrentEventSource(entry, generation, eventSource))
249
+ return;
250
+ eventSource.close();
251
+ entry.eventSource = undefined;
252
+ this.#handleConnectionFailure(entry, generation, error, entry.source.retry, () => this.#openSse(entry, generation));
253
+ }
254
+ }
255
+ #handleConnectionFailure(entry, generation, error, policy, retry) {
256
+ if (!this.#isCurrent(entry, generation))
257
+ return;
258
+ entry.failures += 1;
259
+ entry.errorSignal.set(error);
260
+ const normalized = normalizeRetryPolicy(policy);
261
+ if (entry.failures > normalized.maxAttempts) {
262
+ entry.connectionSignal.set('error');
263
+ return;
264
+ }
265
+ entry.connectionSignal.set('reconnecting');
266
+ this.#schedule(entry, this.#retryDelay(normalized, entry.failures), retry);
267
+ }
268
+ #retryDelay(policy, failure) {
269
+ const exponential = Math.min(policy.maxDelayMs, policy.initialDelayMs * Math.pow(policy.backoff, failure - 1));
270
+ const jitter = exponential * policy.jitter * (this.#random() * 2 - 1);
271
+ return Math.max(0, Math.min(policy.maxDelayMs, Math.round(exponential + jitter)));
272
+ }
273
+ #schedule(entry, delayMs, callback) {
274
+ if (entry.timer)
275
+ clearTimeout(entry.timer);
276
+ entry.timer = setTimeout(() => {
277
+ entry.timer = undefined;
278
+ void callback();
279
+ }, normalizeTimer(delayMs, 0));
280
+ }
281
+ #applyState(entry, state) {
282
+ const normalized = normalizeState(entry.id, state);
283
+ entry.stateSignal.set(normalized);
284
+ if (!isSdTaskTerminal(normalized.status))
285
+ return;
286
+ this.#stop(entry);
287
+ entry.connectionSignal.set('closed');
288
+ }
289
+ #cancel(entry) {
290
+ if (entry.pendingCancel)
291
+ return entry.pendingCancel;
292
+ if (entry.destroyed || entry.subscriberCountSignal() === 0 || isSdTaskTerminal(entry.stateSignal().status)) {
293
+ return Promise.resolve(false);
294
+ }
295
+ const generation = entry.generation;
296
+ entry.pendingCancelSignal.set(true);
297
+ let actionResult;
298
+ try {
299
+ actionResult = entry.source.cancel?.({ id: entry.id, state: entry.stateSignal() });
300
+ }
301
+ catch (error) {
302
+ entry.pendingCancelSignal.set(false);
303
+ entry.errorSignal.set(error);
304
+ return Promise.resolve(false);
305
+ }
306
+ const pending = Promise.resolve(actionResult)
307
+ .then(result => {
308
+ if (result === false)
309
+ return false;
310
+ if (!this.#isCurrent(entry, generation))
311
+ return true;
312
+ if (result && typeof result === 'object')
313
+ this.#applyState(entry, result);
314
+ else
315
+ this.#applyState(entry, { ...entry.stateSignal(), id: entry.id, status: 'cancelled' });
316
+ return true;
317
+ })
318
+ .catch((error) => {
319
+ if (this.#isCurrent(entry, generation))
320
+ entry.errorSignal.set(error);
321
+ return false;
322
+ })
323
+ .finally(() => {
324
+ if (entry.pendingCancel === pending) {
325
+ entry.pendingCancel = undefined;
326
+ entry.pendingCancelSignal.set(false);
327
+ }
328
+ });
329
+ entry.pendingCancel = pending;
330
+ return pending;
331
+ }
332
+ #retry(entry) {
333
+ if (entry.destroyed || entry.subscriberCountSignal() === 0 || entry.stateSignal().status === 'succeeded')
334
+ return;
335
+ const status = entry.stateSignal().status;
336
+ if (entry.connectionSignal() !== 'error' && status !== 'failed' && status !== 'cancelled')
337
+ return;
338
+ if (status === 'failed' || status === 'cancelled') {
339
+ entry.stateSignal.set({ ...entry.stateSignal(), status: 'queued', progress: undefined, error: undefined });
340
+ }
341
+ this.#start(entry);
342
+ }
343
+ #isCurrent(entry, generation) {
344
+ return !entry.destroyed && entry.subscriberCountSignal() > 0 && entry.generation === generation;
345
+ }
346
+ #isCurrentEventSource(entry, generation, eventSource) {
347
+ return this.#isCurrent(entry, generation) && entry.eventSource === eventSource;
348
+ }
349
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: SdTaskService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
350
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: SdTaskService, providedIn: 'root' });
351
+ }
352
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: SdTaskService, decorators: [{
353
+ type: Injectable,
354
+ args: [{ providedIn: 'root' }]
355
+ }], ctorParameters: () => [] });
356
+ function normalizeState(id, state) {
357
+ const progress = state.progress;
358
+ return {
359
+ ...state,
360
+ id,
361
+ progress: progress === undefined || !Number.isFinite(progress) ? undefined : Math.max(0, Math.min(100, progress)),
362
+ };
363
+ }
364
+ function normalizeRetryPolicy(policy) {
365
+ return {
366
+ maxAttempts: normalizeInteger(policy?.maxAttempts, DEFAULT_RETRY_POLICY.maxAttempts, 0, 100),
367
+ initialDelayMs: normalizeTimer(policy?.initialDelayMs, DEFAULT_RETRY_POLICY.initialDelayMs),
368
+ backoff: normalizeNumber(policy?.backoff, DEFAULT_RETRY_POLICY.backoff, 1, 100),
369
+ maxDelayMs: normalizeTimer(policy?.maxDelayMs, DEFAULT_RETRY_POLICY.maxDelayMs),
370
+ jitter: normalizeNumber(policy?.jitter, DEFAULT_RETRY_POLICY.jitter, 0, 1),
371
+ };
372
+ }
373
+ function normalizeTimer(value, fallback) {
374
+ return normalizeInteger(value, fallback, 0, MAX_TIMER_MS);
375
+ }
376
+ function normalizeInteger(value, fallback, min, max) {
377
+ return Math.round(normalizeNumber(value, fallback, min, max));
378
+ }
379
+ function normalizeNumber(value, fallback, min, max) {
380
+ const normalized = typeof value === 'number' && Number.isFinite(value) ? value : fallback;
381
+ return Math.max(min, Math.min(max, normalized));
382
+ }
383
+
384
+ /**
385
+ * Generated bundle index. Do not edit.
386
+ */
387
+
388
+ export { SD_TASK_EVENT_SOURCE_FACTORY, SD_TASK_RANDOM, SdTaskService, isSdTaskTerminal };
389
+ //# sourceMappingURL=sdcorejs-angular-services-task.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sdcorejs-angular-services-task.mjs","sources":["../../../projects/sdcorejs-angular/services/task/src/task.model.ts","../../../projects/sdcorejs-angular/services/task/src/task.tokens.ts","../../../projects/sdcorejs-angular/services/task/src/task.service.ts","../../../projects/sdcorejs-angular/services/task/sdcorejs-angular-services-task.ts"],"sourcesContent":["import { Signal } from '@angular/core';\n\nexport type SdTaskMaybeAsync<T> = T | PromiseLike<T>;\nexport type SdTaskStatus = 'idle' | 'queued' | 'running' | 'succeeded' | 'failed' | 'cancelled';\nexport type SdTaskConnectionState = 'idle' | 'connecting' | 'open' | 'reconnecting' | 'closed' | 'error';\n\nexport interface SdTaskState<TResult = unknown> {\n readonly id: string;\n readonly status: SdTaskStatus;\n readonly progress?: number;\n readonly title?: string;\n readonly message?: string;\n readonly error?: unknown;\n readonly result?: TResult;\n readonly updatedAt?: number | Date;\n}\n\nexport interface SdTaskRetryPolicy {\n readonly maxAttempts?: number;\n readonly initialDelayMs?: number;\n readonly backoff?: number;\n readonly maxDelayMs?: number;\n readonly jitter?: number;\n}\n\nexport interface SdTaskLoadContext<TResult = unknown> {\n readonly id: string;\n readonly signal: AbortSignal;\n readonly attempt: number;\n readonly state: SdTaskState<TResult>;\n}\n\nexport interface SdTaskActionContext<TResult = unknown> {\n readonly id: string;\n readonly state: SdTaskState<TResult>;\n}\n\nexport type SdTaskCancelResult<TResult = unknown> = void | boolean | SdTaskState<TResult>;\nexport type SdTaskCancelHandler<TResult = unknown> = (\n context: SdTaskActionContext<TResult>\n) => SdTaskMaybeAsync<SdTaskCancelResult<TResult>>;\n\ninterface SdTaskSourceBase<TResult> {\n readonly cancel?: SdTaskCancelHandler<TResult>;\n}\n\nexport interface SdTaskManualSource<TResult = unknown> extends SdTaskSourceBase<TResult> {\n readonly mode: 'manual';\n}\n\nexport interface SdTaskPollingSource<TResult = unknown> extends SdTaskSourceBase<TResult> {\n readonly mode: 'poll';\n readonly load: (context: SdTaskLoadContext<TResult>) => SdTaskMaybeAsync<SdTaskState<TResult>>;\n readonly intervalMs?: number;\n readonly retry?: SdTaskRetryPolicy;\n}\n\nexport interface SdTaskSseSource<TResult = unknown> extends SdTaskSourceBase<TResult> {\n readonly mode: 'sse';\n readonly url: string | (() => string);\n readonly eventSourceInit?: EventSourceInit;\n readonly parse?: (event: MessageEvent<string>) => SdTaskMaybeAsync<SdTaskState<TResult>>;\n readonly retry?: SdTaskRetryPolicy;\n}\n\nexport type SdTaskSource<TResult = unknown> = SdTaskManualSource<TResult> | SdTaskPollingSource<TResult> | SdTaskSseSource<TResult>;\n\nexport interface SdTaskWatchOptions<TResult = unknown> {\n readonly id: string;\n readonly initialState?: SdTaskState<TResult>;\n readonly source: SdTaskSource<TResult>;\n}\n\nexport interface SdTaskView<TResult = unknown> {\n readonly id: string;\n readonly state: Signal<SdTaskState<TResult>>;\n readonly connection: Signal<SdTaskConnectionState>;\n readonly error: Signal<unknown | null>;\n readonly subscriberCount: Signal<number>;\n readonly canCancel: Signal<boolean>;\n readonly canRetry: Signal<boolean>;\n cancel(): Promise<boolean>;\n retry(): void;\n}\n\nexport interface SdTaskSubscription<TResult = unknown> extends SdTaskView<TResult> {\n readonly destroyed: Signal<boolean>;\n destroy(): void;\n}\n\nexport function isSdTaskTerminal(status: SdTaskStatus): boolean {\n return status === 'succeeded' || status === 'failed' || status === 'cancelled';\n}\n","import { DOCUMENT } from '@angular/common';\nimport { InjectionToken, inject } from '@angular/core';\n\nexport interface SdTaskEventSource {\n onopen: ((event: Event) => void) | null;\n onmessage: ((event: MessageEvent<string>) => void) | null;\n onerror: ((event: Event) => void) | null;\n close(): void;\n}\n\nexport interface SdTaskEventSourceFactory {\n create(url: string, init?: EventSourceInit): SdTaskEventSource;\n}\n\nexport const SD_TASK_EVENT_SOURCE_FACTORY = new InjectionToken<SdTaskEventSourceFactory | null>('SD_TASK_EVENT_SOURCE_FACTORY', {\n factory: () => {\n const windowRef = inject(DOCUMENT).defaultView;\n if (!windowRef?.EventSource) return null;\n return {\n create: (url: string, init?: EventSourceInit): SdTaskEventSource => new windowRef.EventSource(url, init),\n };\n },\n});\n\nexport const SD_TASK_RANDOM = new InjectionToken<() => number>('SD_TASK_RANDOM', {\n factory: () => Math.random,\n});\n","import { DestroyRef, Injectable, computed, inject, signal } from '@angular/core';\nimport {\n SdTaskConnectionState,\n SdTaskRetryPolicy,\n SdTaskSource,\n SdTaskState,\n SdTaskSubscription,\n SdTaskView,\n SdTaskWatchOptions,\n isSdTaskTerminal,\n} from './task.model';\nimport { SD_TASK_EVENT_SOURCE_FACTORY, SD_TASK_RANDOM, SdTaskEventSource } from './task.tokens';\n\nconst DEFAULT_POLL_INTERVAL_MS = 2000;\nconst DEFAULT_RETRY_POLICY: Required<SdTaskRetryPolicy> = {\n maxAttempts: 3,\n initialDelayMs: 1000,\n backoff: 2,\n maxDelayMs: 30_000,\n jitter: 0.2,\n};\nconst MAX_TIMER_MS = 2_147_483_647;\n\ninterface TaskEntry<TResult = unknown> {\n readonly id: string;\n readonly source: SdTaskSource<TResult>;\n readonly stateSignal: ReturnType<typeof signal<SdTaskState<TResult>>>;\n readonly connectionSignal: ReturnType<typeof signal<SdTaskConnectionState>>;\n readonly errorSignal: ReturnType<typeof signal<unknown | null>>;\n readonly subscriberCountSignal: ReturnType<typeof signal<number>>;\n readonly view: SdTaskView<TResult>;\n timer?: ReturnType<typeof setTimeout>;\n controller?: AbortController;\n eventSource?: SdTaskEventSource;\n pendingCancel?: Promise<boolean>;\n readonly pendingCancelSignal: ReturnType<typeof signal<boolean>>;\n messageQueue: Promise<void>;\n generation: number;\n failures: number;\n requestAttempt: number;\n destroyed: boolean;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class SdTaskService {\n readonly #eventSourceFactory = inject(SD_TASK_EVENT_SOURCE_FACTORY);\n readonly #random = inject(SD_TASK_RANDOM);\n readonly #destroyRef = inject(DestroyRef);\n readonly #entries = signal<ReadonlyMap<string, TaskEntry>>(new Map());\n\n readonly tasks = computed(() => [...this.#entries().values()].map(entry => entry.view));\n\n constructor() {\n this.#destroyRef.onDestroy(() => {\n for (const entry of this.#entries().values()) {\n entry.destroyed = true;\n this.#stop(entry);\n }\n this.#entries.set(new Map());\n });\n }\n\n watch<TResult = unknown>(options: SdTaskWatchOptions<TResult>): SdTaskSubscription<TResult> {\n const existing = this.#entries().get(options.id) as TaskEntry<TResult> | undefined;\n if (existing) {\n existing.subscriberCountSignal.update(count => count + 1);\n return this.#createLease(existing);\n }\n\n const initialState = normalizeState(options.id, options.initialState ?? { id: options.id, status: 'queued' });\n const stateSignal = signal(initialState);\n const connectionSignal = signal<SdTaskConnectionState>(options.source.mode === 'manual' ? 'idle' : 'connecting');\n const errorSignal = signal<unknown | null>(null);\n const subscriberCountSignal = signal(1);\n const pendingCancelSignal = signal(false);\n const entry = {} as TaskEntry<TResult>;\n const view: SdTaskView<TResult> = {\n id: options.id,\n state: stateSignal.asReadonly(),\n connection: connectionSignal.asReadonly(),\n error: errorSignal.asReadonly(),\n subscriberCount: subscriberCountSignal.asReadonly(),\n canCancel: computed(() => {\n const status = stateSignal().status;\n return !pendingCancelSignal() && (status === 'queued' || status === 'running');\n }),\n canRetry: computed(() => {\n const status = stateSignal().status;\n return connectionSignal() === 'error' || status === 'failed' || status === 'cancelled';\n }),\n cancel: () => this.#cancel(entry),\n retry: () => this.#retry(entry),\n };\n Object.assign(entry, {\n id: options.id,\n source: options.source,\n stateSignal,\n connectionSignal,\n errorSignal,\n subscriberCountSignal,\n pendingCancelSignal,\n view,\n messageQueue: Promise.resolve(),\n generation: 0,\n failures: 0,\n requestAttempt: 0,\n destroyed: false,\n });\n this.#entries.update(entries => new Map(entries).set(options.id, entry as unknown as TaskEntry));\n\n if (!isSdTaskTerminal(initialState.status)) this.#start(entry);\n else connectionSignal.set('closed');\n return this.#createLease(entry);\n }\n\n get<TResult = unknown>(id: string): SdTaskView<TResult> | undefined {\n return this.#entries().get(id)?.view as SdTaskView<TResult> | undefined;\n }\n\n update<TResult = unknown>(id: string, patch: Partial<Omit<SdTaskState<TResult>, 'id'>>): boolean {\n const entry = this.#entries().get(id) as TaskEntry<TResult> | undefined;\n if (!entry) return false;\n this.#applyState(entry, { ...entry.stateSignal(), ...patch, id });\n return true;\n }\n\n cancel(id: string): Promise<boolean> {\n const entry = this.#entries().get(id);\n return entry ? this.#cancel(entry) : Promise.resolve(false);\n }\n\n retry(id: string): boolean {\n const entry = this.#entries().get(id);\n if (!entry) return false;\n this.#retry(entry);\n return true;\n }\n\n #createLease<TResult>(entry: TaskEntry<TResult>): SdTaskSubscription<TResult> {\n const destroyed = signal(false);\n return {\n ...entry.view,\n destroyed: destroyed.asReadonly(),\n destroy: () => {\n if (destroyed()) return;\n destroyed.set(true);\n entry.subscriberCountSignal.update(count => Math.max(0, count - 1));\n if (entry.subscriberCountSignal() > 0) return;\n entry.destroyed = true;\n this.#stop(entry);\n this.#entries.update(entries => {\n if (entries.get(entry.id) !== entry) return entries;\n const next = new Map(entries);\n next.delete(entry.id);\n return next;\n });\n },\n };\n }\n\n #start<TResult>(entry: TaskEntry<TResult>): void {\n if (entry.destroyed || entry.subscriberCountSignal() === 0 || isSdTaskTerminal(entry.stateSignal().status)) return;\n this.#stop(entry);\n entry.destroyed = false;\n entry.failures = 0;\n entry.requestAttempt = 0;\n entry.errorSignal.set(null);\n const generation = entry.generation;\n\n if (entry.source.mode === 'manual') {\n entry.connectionSignal.set('idle');\n return;\n }\n entry.connectionSignal.set('connecting');\n if (entry.source.mode === 'poll') void this.#runPoll(entry, generation);\n else this.#openSse(entry, generation);\n }\n\n #stop<TResult>(entry: TaskEntry<TResult>): void {\n entry.generation += 1;\n if (entry.timer) clearTimeout(entry.timer);\n entry.timer = undefined;\n entry.controller?.abort();\n entry.controller = undefined;\n entry.eventSource?.close();\n entry.eventSource = undefined;\n }\n\n async #runPoll<TResult>(entry: TaskEntry<TResult>, generation: number): Promise<void> {\n if (!this.#isCurrent(entry, generation) || entry.source.mode !== 'poll') return;\n const controller = new AbortController();\n entry.controller = controller;\n const attempt = ++entry.requestAttempt;\n\n try {\n const state = await Promise.resolve(\n entry.source.load({ id: entry.id, signal: controller.signal, attempt, state: entry.stateSignal() })\n );\n if (!this.#isCurrent(entry, generation) || controller.signal.aborted) return;\n entry.controller = undefined;\n entry.failures = 0;\n entry.errorSignal.set(null);\n entry.connectionSignal.set('open');\n this.#applyState(entry, state);\n if (!this.#isCurrent(entry, generation) || isSdTaskTerminal(entry.stateSignal().status)) return;\n this.#schedule(entry, normalizeTimer(entry.source.intervalMs, DEFAULT_POLL_INTERVAL_MS), () => this.#runPoll(entry, generation));\n } catch (error) {\n if (!this.#isCurrent(entry, generation) || controller.signal.aborted) return;\n entry.controller = undefined;\n this.#handleConnectionFailure(entry, generation, error, entry.source.retry, () => this.#runPoll(entry, generation));\n }\n }\n\n #openSse<TResult>(entry: TaskEntry<TResult>, generation: number): void {\n if (!this.#isCurrent(entry, generation) || entry.source.mode !== 'sse') return;\n if (!this.#eventSourceFactory) {\n entry.connectionSignal.set('error');\n entry.errorSignal.set(new Error('EventSource is unavailable in this environment.'));\n return;\n }\n\n let eventSource: SdTaskEventSource;\n try {\n const url = typeof entry.source.url === 'function' ? entry.source.url() : entry.source.url;\n eventSource = this.#eventSourceFactory.create(url, entry.source.eventSourceInit);\n } catch (error) {\n this.#handleConnectionFailure(entry, generation, error, entry.source.retry, () => this.#openSse(entry, generation));\n return;\n }\n entry.eventSource = eventSource;\n\n eventSource.onopen = () => {\n if (!this.#isCurrentEventSource(entry, generation, eventSource)) return;\n entry.failures = 0;\n entry.errorSignal.set(null);\n entry.connectionSignal.set('open');\n };\n eventSource.onmessage = event => {\n entry.messageQueue = entry.messageQueue.then(() => this.#handleSseMessage(entry, generation, eventSource, event));\n };\n eventSource.onerror = event => {\n if (!this.#isCurrentEventSource(entry, generation, eventSource)) return;\n eventSource.close();\n entry.eventSource = undefined;\n this.#handleConnectionFailure(entry, generation, event, entry.source.mode === 'sse' ? entry.source.retry : undefined, () =>\n this.#openSse(entry, generation)\n );\n };\n }\n\n async #handleSseMessage<TResult>(\n entry: TaskEntry<TResult>,\n generation: number,\n eventSource: SdTaskEventSource,\n event: MessageEvent<string>\n ): Promise<void> {\n if (!this.#isCurrentEventSource(entry, generation, eventSource) || entry.source.mode !== 'sse') return;\n try {\n const state = entry.source.parse\n ? await Promise.resolve(entry.source.parse(event))\n : (JSON.parse(event.data) as SdTaskState<TResult>);\n if (!this.#isCurrentEventSource(entry, generation, eventSource)) return;\n entry.errorSignal.set(null);\n this.#applyState(entry, state);\n } catch (error) {\n if (!this.#isCurrentEventSource(entry, generation, eventSource)) return;\n eventSource.close();\n entry.eventSource = undefined;\n this.#handleConnectionFailure(entry, generation, error, entry.source.retry, () => this.#openSse(entry, generation));\n }\n }\n\n #handleConnectionFailure<TResult>(\n entry: TaskEntry<TResult>,\n generation: number,\n error: unknown,\n policy: SdTaskRetryPolicy | undefined,\n retry: () => void | Promise<void>\n ): void {\n if (!this.#isCurrent(entry, generation)) return;\n entry.failures += 1;\n entry.errorSignal.set(error);\n const normalized = normalizeRetryPolicy(policy);\n if (entry.failures > normalized.maxAttempts) {\n entry.connectionSignal.set('error');\n return;\n }\n entry.connectionSignal.set('reconnecting');\n this.#schedule(entry, this.#retryDelay(normalized, entry.failures), retry);\n }\n\n #retryDelay(policy: Required<SdTaskRetryPolicy>, failure: number): number {\n const exponential = Math.min(policy.maxDelayMs, policy.initialDelayMs * Math.pow(policy.backoff, failure - 1));\n const jitter = exponential * policy.jitter * (this.#random() * 2 - 1);\n return Math.max(0, Math.min(policy.maxDelayMs, Math.round(exponential + jitter)));\n }\n\n #schedule<TResult>(entry: TaskEntry<TResult>, delayMs: number, callback: () => void | Promise<void>): void {\n if (entry.timer) clearTimeout(entry.timer);\n entry.timer = setTimeout(\n () => {\n entry.timer = undefined;\n void callback();\n },\n normalizeTimer(delayMs, 0)\n );\n }\n\n #applyState<TResult>(entry: TaskEntry<TResult>, state: SdTaskState<TResult>): void {\n const normalized = normalizeState(entry.id, state);\n entry.stateSignal.set(normalized);\n if (!isSdTaskTerminal(normalized.status)) return;\n this.#stop(entry);\n entry.connectionSignal.set('closed');\n }\n\n #cancel<TResult>(entry: TaskEntry<TResult>): Promise<boolean> {\n if (entry.pendingCancel) return entry.pendingCancel;\n if (entry.destroyed || entry.subscriberCountSignal() === 0 || isSdTaskTerminal(entry.stateSignal().status)) {\n return Promise.resolve(false);\n }\n\n const generation = entry.generation;\n entry.pendingCancelSignal.set(true);\n let actionResult: ReturnType<NonNullable<typeof entry.source.cancel>> | undefined;\n try {\n actionResult = entry.source.cancel?.({ id: entry.id, state: entry.stateSignal() });\n } catch (error) {\n entry.pendingCancelSignal.set(false);\n entry.errorSignal.set(error);\n return Promise.resolve(false);\n }\n\n const pending = Promise.resolve(actionResult)\n .then(result => {\n if (result === false) return false;\n if (!this.#isCurrent(entry, generation)) return true;\n if (result && typeof result === 'object') this.#applyState(entry, result);\n else this.#applyState(entry, { ...entry.stateSignal(), id: entry.id, status: 'cancelled' });\n return true;\n })\n .catch((error: unknown) => {\n if (this.#isCurrent(entry, generation)) entry.errorSignal.set(error);\n return false;\n })\n .finally(() => {\n if (entry.pendingCancel === pending) {\n entry.pendingCancel = undefined;\n entry.pendingCancelSignal.set(false);\n }\n });\n entry.pendingCancel = pending;\n return pending;\n }\n\n #retry<TResult>(entry: TaskEntry<TResult>): void {\n if (entry.destroyed || entry.subscriberCountSignal() === 0 || entry.stateSignal().status === 'succeeded') return;\n const status = entry.stateSignal().status;\n if (entry.connectionSignal() !== 'error' && status !== 'failed' && status !== 'cancelled') return;\n if (status === 'failed' || status === 'cancelled') {\n entry.stateSignal.set({ ...entry.stateSignal(), status: 'queued', progress: undefined, error: undefined });\n }\n this.#start(entry);\n }\n\n #isCurrent<TResult>(entry: TaskEntry<TResult>, generation: number): boolean {\n return !entry.destroyed && entry.subscriberCountSignal() > 0 && entry.generation === generation;\n }\n\n #isCurrentEventSource<TResult>(entry: TaskEntry<TResult>, generation: number, eventSource: SdTaskEventSource): boolean {\n return this.#isCurrent(entry, generation) && entry.eventSource === eventSource;\n }\n}\n\nfunction normalizeState<TResult>(id: string, state: SdTaskState<TResult>): SdTaskState<TResult> {\n const progress = state.progress;\n return {\n ...state,\n id,\n progress: progress === undefined || !Number.isFinite(progress) ? undefined : Math.max(0, Math.min(100, progress)),\n };\n}\n\nfunction normalizeRetryPolicy(policy: SdTaskRetryPolicy | undefined): Required<SdTaskRetryPolicy> {\n return {\n maxAttempts: normalizeInteger(policy?.maxAttempts, DEFAULT_RETRY_POLICY.maxAttempts, 0, 100),\n initialDelayMs: normalizeTimer(policy?.initialDelayMs, DEFAULT_RETRY_POLICY.initialDelayMs),\n backoff: normalizeNumber(policy?.backoff, DEFAULT_RETRY_POLICY.backoff, 1, 100),\n maxDelayMs: normalizeTimer(policy?.maxDelayMs, DEFAULT_RETRY_POLICY.maxDelayMs),\n jitter: normalizeNumber(policy?.jitter, DEFAULT_RETRY_POLICY.jitter, 0, 1),\n };\n}\n\nfunction normalizeTimer(value: number | undefined, fallback: number): number {\n return normalizeInteger(value, fallback, 0, MAX_TIMER_MS);\n}\n\nfunction normalizeInteger(value: number | undefined, fallback: number, min: number, max: number): number {\n return Math.round(normalizeNumber(value, fallback, min, max));\n}\n\nfunction normalizeNumber(value: number | undefined, fallback: number, min: number, max: number): number {\n const normalized = typeof value === 'number' && Number.isFinite(value) ? value : fallback;\n return Math.max(min, Math.min(max, normalized));\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}