@darajs/core 1.29.6 → 1.29.8

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 (38) hide show
  1. package/dist/api/http.d.ts.map +1 -1
  2. package/dist/api/http.js +14 -0
  3. package/dist/api/http.js.map +1 -1
  4. package/dist/{dara_core-1.29.6-py3-none-any.whl → dara_core-1.29.8-py3-none-any.whl} +0 -0
  5. package/dist/router/fetching.d.ts.map +1 -1
  6. package/dist/router/fetching.js +57 -32
  7. package/dist/router/fetching.js.map +1 -1
  8. package/dist/shared/context/variable-context.d.ts +5 -0
  9. package/dist/shared/context/variable-context.d.ts.map +1 -1
  10. package/dist/shared/context/variable-context.js.map +1 -1
  11. package/dist/shared/dynamic-component/dynamic-component.d.ts.map +1 -1
  12. package/dist/shared/dynamic-component/dynamic-component.js +10 -5
  13. package/dist/shared/dynamic-component/dynamic-component.js.map +1 -1
  14. package/dist/shared/interactivity/derived-variable.d.ts +14 -8
  15. package/dist/shared/interactivity/derived-variable.d.ts.map +1 -1
  16. package/dist/shared/interactivity/derived-variable.js +175 -126
  17. package/dist/shared/interactivity/derived-variable.js.map +1 -1
  18. package/dist/shared/interactivity/polling.d.ts +116 -0
  19. package/dist/shared/interactivity/polling.d.ts.map +1 -0
  20. package/dist/shared/interactivity/polling.js +723 -0
  21. package/dist/shared/interactivity/polling.js.map +1 -0
  22. package/dist/shared/interactivity/store.d.ts +6 -0
  23. package/dist/shared/interactivity/store.d.ts.map +1 -1
  24. package/dist/shared/interactivity/store.js +21 -1
  25. package/dist/shared/interactivity/store.js.map +1 -1
  26. package/dist/shared/interactivity/stream-variable.d.ts +1 -1
  27. package/dist/shared/interactivity/stream-variable.d.ts.map +1 -1
  28. package/dist/shared/interactivity/stream-variable.js +106 -41
  29. package/dist/shared/interactivity/stream-variable.js.map +1 -1
  30. package/dist/shared/interactivity/use-server-component.d.ts +9 -0
  31. package/dist/shared/interactivity/use-server-component.d.ts.map +1 -1
  32. package/dist/shared/interactivity/use-server-component.js +130 -77
  33. package/dist/shared/interactivity/use-server-component.js.map +1 -1
  34. package/dist/shared/interactivity/use-variable.d.ts.map +1 -1
  35. package/dist/shared/interactivity/use-variable.js +2 -2
  36. package/dist/shared/interactivity/use-variable.js.map +1 -1
  37. package/dist/umd/dara.core.umd.cjs +1064 -387
  38. package/package.json +9 -9
@@ -0,0 +1,723 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
11
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
12
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
13
+ return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
14
+ };
15
+ var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
16
+ if (kind === "m") throw new TypeError("Private method is not writable");
17
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
18
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
19
+ return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
20
+ };
21
+ var _Poller_instances, _Poller_clearTimeout, _Poller_entries, _Poller_getVisibilityState, _Poller_jitterRatio, _Poller_now, _Poller_random, _Poller_setTimeout, _Poller_visibilityTarget, _Poller_owners, _Poller_listeningForVisibility, _Poller_start, _Poller_createRunHandle, _Poller_runWork, _Poller_finishRun, _Poller_waitForNewer, _Poller_getIntervalMs, _Poller_getOrCreateEntry, _Poller_getSubscriber, _Poller_getOrCreateOwner, _Poller_dropOwnedKey, _Poller_dropOwner, _Poller_hasClaimForKey, _Poller_hasHookForKey, _Poller_ownerHasKey, _Poller_schedulePoll, _Poller_schedule, _Poller_clearTimer, _Poller_withJitter, _Poller_handleVisibilityChange, _Poller_startVisibilityListener, _Poller_stopVisibilityListenerIfIdle;
22
+ import { useEffect, useId, useLayoutEffect } from 'react';
23
+ import { useLatestRef } from '@darajs/ui-utils';
24
+ const DEFAULT_JITTER_RATIO = 0.1;
25
+ const MAX_BACKOFF_MS = 60000;
26
+ const POLL_FORCE_KEY_PREFIX = '__dara_poll__:';
27
+ const retryAfterByError = new WeakMap();
28
+ /** Throw an AbortError when an old run attempts to publish a result. */
29
+ function assertCurrentRun(handle) {
30
+ if (!handle.isCurrent() || handle.signal.aborted) {
31
+ throw new DOMException('The request was superseded', 'AbortError');
32
+ }
33
+ }
34
+ /** Check whether an error represents intentional request cancellation. */
35
+ export function isAbortError(error) {
36
+ return ((error instanceof DOMException && error.name === 'AbortError') ||
37
+ (typeof error === 'object' && error !== null && 'name' in error && error.name === 'AbortError'));
38
+ }
39
+ /** Read Retry-After saved at the HTTP response seam. */
40
+ function getRetryAfterMs(error) {
41
+ return typeof error === 'object' && error !== null ? retryAfterByError.get(error) : undefined;
42
+ }
43
+ /**
44
+ * Coordinates non-overlapping, fixed-delay polling for request identities.
45
+ *
46
+ * A request identity includes the rendered variable/component identity and its
47
+ * serialized request extras. Multiple React consumers of the same identity
48
+ * share one timer and one active request generation.
49
+ */
50
+ export class Poller {
51
+ constructor(options = {}) {
52
+ var _a, _b, _c, _d, _e, _f, _g;
53
+ _Poller_instances.add(this);
54
+ _Poller_clearTimeout.set(this, void 0);
55
+ _Poller_entries.set(this, new Map());
56
+ _Poller_getVisibilityState.set(this, void 0);
57
+ _Poller_jitterRatio.set(this, void 0);
58
+ _Poller_now.set(this, void 0);
59
+ _Poller_random.set(this, void 0);
60
+ _Poller_setTimeout.set(this, void 0);
61
+ _Poller_visibilityTarget.set(this, void 0);
62
+ _Poller_owners.set(this, new Map());
63
+ _Poller_listeningForVisibility.set(this, false);
64
+ _Poller_handleVisibilityChange.set(this, () => {
65
+ var _a;
66
+ const hidden = __classPrivateFieldGet(this, _Poller_getVisibilityState, "f").call(this) === 'hidden';
67
+ for (const [key, entry] of __classPrivateFieldGet(this, _Poller_entries, "f")) {
68
+ if (hidden) {
69
+ entry.runOnShow = entry.subscribers.size > 0;
70
+ if (entry.timer !== undefined) {
71
+ __classPrivateFieldGet(this, _Poller_instances, "m", _Poller_clearTimer).call(this, entry, entry.failureCount === 0);
72
+ }
73
+ continue;
74
+ }
75
+ if (!entry.runOnShow || entry.subscribers.size === 0) {
76
+ continue;
77
+ }
78
+ entry.runOnShow = false;
79
+ const delay = Math.max(0, ((_a = entry.nextRunAt) !== null && _a !== void 0 ? _a : __classPrivateFieldGet(this, _Poller_now, "f").call(this)) - __classPrivateFieldGet(this, _Poller_now, "f").call(this));
80
+ if (delay > 0) {
81
+ __classPrivateFieldGet(this, _Poller_instances, "m", _Poller_schedule).call(this, key, entry, delay);
82
+ }
83
+ else {
84
+ this.runNow(key);
85
+ }
86
+ }
87
+ });
88
+ __classPrivateFieldSet(this, _Poller_clearTimeout, (_a = options.clearTimeout) !== null && _a !== void 0 ? _a : ((timer) => clearTimeout(timer)), "f");
89
+ __classPrivateFieldSet(this, _Poller_getVisibilityState, (_b = options.getVisibilityState) !== null && _b !== void 0 ? _b : (() => (typeof document === 'undefined' ? 'visible' : document.visibilityState)), "f");
90
+ __classPrivateFieldSet(this, _Poller_jitterRatio, (_c = options.jitterRatio) !== null && _c !== void 0 ? _c : DEFAULT_JITTER_RATIO, "f");
91
+ __classPrivateFieldSet(this, _Poller_now, (_d = options.now) !== null && _d !== void 0 ? _d : (() => Date.now()), "f");
92
+ __classPrivateFieldSet(this, _Poller_random, (_e = options.random) !== null && _e !== void 0 ? _e : (() => Math.random()), "f");
93
+ __classPrivateFieldSet(this, _Poller_setTimeout, (_f = options.setTimeout) !== null && _f !== void 0 ? _f : ((callback, delay) => setTimeout(callback, delay)), "f");
94
+ __classPrivateFieldSet(this, _Poller_visibilityTarget, (_g = options.visibilityTarget) !== null && _g !== void 0 ? _g : (typeof document === 'undefined' ? undefined : document), "f");
95
+ }
96
+ /**
97
+ * Register one rendered polling consumer.
98
+ *
99
+ * The returned cleanup releases the consumer. The final cleanup aborts the
100
+ * owned request on the next macrotask so React StrictMode can immediately
101
+ * reacquire the same identity without cancelling useful work.
102
+ */
103
+ subscribe(key, intervalSeconds, refresh) {
104
+ var _a;
105
+ const intervalMs = (intervalSeconds !== null && intervalSeconds !== void 0 ? intervalSeconds : 0) * 1000;
106
+ if (!Number.isFinite(intervalMs) || !(intervalMs > 0)) {
107
+ return () => { };
108
+ }
109
+ const entry = __classPrivateFieldGet(this, _Poller_instances, "m", _Poller_getOrCreateEntry).call(this, key);
110
+ const oldIntervalMs = entry.subscribers.size > 0 ? __classPrivateFieldGet(this, _Poller_instances, "m", _Poller_getIntervalMs).call(this, entry) : undefined;
111
+ if (entry.disposeTimer !== undefined) {
112
+ __classPrivateFieldGet(this, _Poller_clearTimeout, "f").call(this, entry.disposeTimer);
113
+ entry.disposeTimer = undefined;
114
+ }
115
+ const subscriberId = Symbol(key);
116
+ entry.subscribers.set(subscriberId, { intervalMs, refresh });
117
+ __classPrivateFieldGet(this, _Poller_instances, "m", _Poller_startVisibilityListener).call(this);
118
+ if (entry.subscribers.size === 1 && entry.state.kind === 'idle' && entry.timer === undefined) {
119
+ __classPrivateFieldGet(this, _Poller_instances, "m", _Poller_schedulePoll).call(this, key, entry);
120
+ }
121
+ else if (entry.timer !== undefined &&
122
+ entry.failureCount === 0 &&
123
+ oldIntervalMs !== undefined &&
124
+ intervalMs < oldIntervalMs) {
125
+ const remaining = Math.max(0, ((_a = entry.nextRunAt) !== null && _a !== void 0 ? _a : __classPrivateFieldGet(this, _Poller_now, "f").call(this)) - __classPrivateFieldGet(this, _Poller_now, "f").call(this));
126
+ __classPrivateFieldGet(this, _Poller_instances, "m", _Poller_schedule).call(this, key, entry, Math.min(remaining, __classPrivateFieldGet(this, _Poller_instances, "m", _Poller_withJitter).call(this, intervalMs)));
127
+ }
128
+ return () => {
129
+ const removedIntervalMs = __classPrivateFieldGet(this, _Poller_instances, "m", _Poller_getIntervalMs).call(this, entry);
130
+ entry.subscribers.delete(subscriberId);
131
+ if (entry.subscribers.size > 0) {
132
+ if (entry.timer !== undefined &&
133
+ entry.failureCount === 0 &&
134
+ __classPrivateFieldGet(this, _Poller_instances, "m", _Poller_getIntervalMs).call(this, entry) > removedIntervalMs) {
135
+ __classPrivateFieldGet(this, _Poller_instances, "m", _Poller_schedulePoll).call(this, key, entry);
136
+ }
137
+ return;
138
+ }
139
+ __classPrivateFieldGet(this, _Poller_instances, "m", _Poller_clearTimer).call(this, entry);
140
+ entry.disposeTimer = __classPrivateFieldGet(this, _Poller_setTimeout, "f").call(this, () => {
141
+ var _a, _b;
142
+ entry.disposeTimer = undefined;
143
+ if (entry.subscribers.size > 0) {
144
+ return;
145
+ }
146
+ if (entry.owners.size > 0) {
147
+ return;
148
+ }
149
+ if (__classPrivateFieldGet(this, _Poller_entries, "f").get(key) !== entry) {
150
+ return;
151
+ }
152
+ if (entry.state.kind === 'running') {
153
+ entry.state.run.controller.abort();
154
+ (_b = (_a = entry.state.run).detachExternalSignal) === null || _b === void 0 ? void 0 : _b.call(_a);
155
+ entry.state.run.end();
156
+ }
157
+ __classPrivateFieldGet(this, _Poller_entries, "f").delete(key);
158
+ __classPrivateFieldGet(this, _Poller_instances, "m", _Poller_stopVisibilityListenerIfIdle).call(this);
159
+ }, 0);
160
+ };
161
+ }
162
+ /**
163
+ * Claim a key during render so Suspense cannot skip its ownership effect.
164
+ *
165
+ * A later owner commit prunes claims left by an abandoned render.
166
+ */
167
+ claimKey(ownerId, hookId, key) {
168
+ const owner = __classPrivateFieldGet(this, _Poller_instances, "m", _Poller_getOrCreateOwner).call(this, ownerId);
169
+ if (owner.hooks.get(hookId) === key) {
170
+ return;
171
+ }
172
+ const oldKey = owner.claims.get(hookId);
173
+ owner.claims.set(hookId, key);
174
+ __classPrivateFieldGet(this, _Poller_instances, "m", _Poller_getOrCreateEntry).call(this, key).owners.add(ownerId);
175
+ if (oldKey !== undefined && oldKey !== key && !__classPrivateFieldGet(this, _Poller_instances, "m", _Poller_ownerHasKey).call(this, owner, oldKey)) {
176
+ __classPrivateFieldGet(this, _Poller_instances, "m", _Poller_dropOwnedKey).call(this, ownerId, oldKey);
177
+ }
178
+ }
179
+ /** Apply the hook claims collected by one committed owner render. */
180
+ commitOwner(ownerId, claims) {
181
+ const owner = __classPrivateFieldGet(this, _Poller_instances, "m", _Poller_getOrCreateOwner).call(this, ownerId);
182
+ if (owner.disposeTimer !== undefined) {
183
+ __classPrivateFieldGet(this, _Poller_clearTimeout, "f").call(this, owner.disposeTimer);
184
+ owner.disposeTimer = undefined;
185
+ }
186
+ const droppedClaims = new Set();
187
+ for (const [hookId, key] of owner.claims) {
188
+ if (claims.get(hookId) !== key) {
189
+ owner.claims.delete(hookId);
190
+ droppedClaims.add(key);
191
+ }
192
+ }
193
+ // Add the new render before dropping the old one. A rerender must not
194
+ // leave a live request without an owner between layout effects.
195
+ const nextRenderKeys = new Set();
196
+ for (const key of new Set(claims.values())) {
197
+ __classPrivateFieldGet(this, _Poller_instances, "m", _Poller_getOrCreateEntry).call(this, key).owners.add(ownerId);
198
+ if (!__classPrivateFieldGet(this, _Poller_instances, "m", _Poller_hasHookForKey).call(this, owner, key) && !__classPrivateFieldGet(this, _Poller_instances, "m", _Poller_hasClaimForKey).call(this, owner, key)) {
199
+ nextRenderKeys.add(key);
200
+ }
201
+ }
202
+ const oldRenderKeys = owner.renderKeys;
203
+ owner.renderKeys = nextRenderKeys;
204
+ for (const key of oldRenderKeys) {
205
+ if (!nextRenderKeys.has(key) && !__classPrivateFieldGet(this, _Poller_instances, "m", _Poller_hasHookForKey).call(this, owner, key)) {
206
+ __classPrivateFieldGet(this, _Poller_instances, "m", _Poller_dropOwnedKey).call(this, ownerId, key);
207
+ }
208
+ }
209
+ for (const key of droppedClaims) {
210
+ if (!__classPrivateFieldGet(this, _Poller_instances, "m", _Poller_ownerHasKey).call(this, owner, key)) {
211
+ __classPrivateFieldGet(this, _Poller_instances, "m", _Poller_dropOwnedKey).call(this, ownerId, key);
212
+ }
213
+ }
214
+ }
215
+ /** Keep one key after its hook commits. */
216
+ mountKey(ownerId, hookId, key) {
217
+ const owner = __classPrivateFieldGet(this, _Poller_instances, "m", _Poller_getOrCreateOwner).call(this, ownerId);
218
+ if (owner.disposeTimer !== undefined) {
219
+ __classPrivateFieldGet(this, _Poller_clearTimeout, "f").call(this, owner.disposeTimer);
220
+ owner.disposeTimer = undefined;
221
+ }
222
+ const timer = owner.timers.get(hookId);
223
+ if (timer !== undefined) {
224
+ __classPrivateFieldGet(this, _Poller_clearTimeout, "f").call(this, timer);
225
+ owner.timers.delete(hookId);
226
+ }
227
+ const oldKey = owner.hooks.get(hookId);
228
+ owner.hooks.set(hookId, key);
229
+ owner.claims.delete(hookId);
230
+ owner.renderKeys.delete(key);
231
+ __classPrivateFieldGet(this, _Poller_instances, "m", _Poller_getOrCreateEntry).call(this, key).owners.add(ownerId);
232
+ if (oldKey !== undefined && oldKey !== key && !__classPrivateFieldGet(this, _Poller_instances, "m", _Poller_ownerHasKey).call(this, owner, oldKey)) {
233
+ __classPrivateFieldGet(this, _Poller_instances, "m", _Poller_dropOwnedKey).call(this, ownerId, oldKey);
234
+ }
235
+ }
236
+ /** Drop a committed hook key after the StrictMode remount window. */
237
+ unmountKey(ownerId, hookId, key) {
238
+ const owner = __classPrivateFieldGet(this, _Poller_owners, "f").get(ownerId);
239
+ if (!owner || owner.timers.has(hookId)) {
240
+ return;
241
+ }
242
+ const timer = __classPrivateFieldGet(this, _Poller_setTimeout, "f").call(this, () => {
243
+ owner.timers.delete(hookId);
244
+ if (owner.hooks.get(hookId) !== key) {
245
+ return;
246
+ }
247
+ owner.hooks.delete(hookId);
248
+ if (!__classPrivateFieldGet(this, _Poller_instances, "m", _Poller_ownerHasKey).call(this, owner, key)) {
249
+ __classPrivateFieldGet(this, _Poller_instances, "m", _Poller_dropOwnedKey).call(this, ownerId, key);
250
+ }
251
+ __classPrivateFieldGet(this, _Poller_instances, "m", _Poller_stopVisibilityListenerIfIdle).call(this);
252
+ }, 0);
253
+ owner.timers.set(hookId, timer);
254
+ }
255
+ /** Release a rendered owner after the StrictMode remount window. */
256
+ releaseOwner(ownerId) {
257
+ const owner = __classPrivateFieldGet(this, _Poller_owners, "f").get(ownerId);
258
+ if (!owner || owner.disposeTimer !== undefined) {
259
+ return;
260
+ }
261
+ owner.disposeTimer = __classPrivateFieldGet(this, _Poller_setTimeout, "f").call(this, () => __classPrivateFieldGet(this, _Poller_instances, "m", _Poller_dropOwner).call(this, ownerId, owner), 0);
262
+ }
263
+ /**
264
+ * Run one request for a polling identity.
265
+ *
266
+ * Matching callers share one promise. Dependency runs replace older work,
267
+ * while a poll that arrives during a run leaves one follow-up refresh.
268
+ */
269
+ run({ cause, inputKey, key, read, signal, work, write }) {
270
+ var _a;
271
+ const entry = __classPrivateFieldGet(this, _Poller_entries, "f").get(key);
272
+ const running = (entry === null || entry === void 0 ? void 0 : entry.state.kind) === 'running' ? entry.state.run : undefined;
273
+ if ((running === null || running === void 0 ? void 0 : running.cause) === cause && running.inputKey === inputKey && running.result) {
274
+ return running.result;
275
+ }
276
+ const handle = __classPrivateFieldGet(this, _Poller_instances, "m", _Poller_start).call(this, key, cause, signal, inputKey);
277
+ const result = __classPrivateFieldGet(this, _Poller_instances, "m", _Poller_runWork).call(this, { cause, handle, read, work, write });
278
+ const state = (_a = __classPrivateFieldGet(this, _Poller_entries, "f").get(key)) === null || _a === void 0 ? void 0 : _a.state;
279
+ if ((state === null || state === void 0 ? void 0 : state.kind) === 'running' && handle.isCurrent()) {
280
+ state.run.result = result;
281
+ }
282
+ return result;
283
+ }
284
+ /** Refresh now, or keep one refresh while busy. */
285
+ runNow(key) {
286
+ var _a;
287
+ const entry = __classPrivateFieldGet(this, _Poller_entries, "f").get(key);
288
+ if (!entry || entry.subscribers.size === 0) {
289
+ return;
290
+ }
291
+ if (__classPrivateFieldGet(this, _Poller_getVisibilityState, "f").call(this) === 'hidden') {
292
+ entry.runOnShow = true;
293
+ return;
294
+ }
295
+ if (entry.state.kind !== 'idle') {
296
+ entry.runAgain = true;
297
+ return;
298
+ }
299
+ __classPrivateFieldGet(this, _Poller_instances, "m", _Poller_clearTimer).call(this, entry);
300
+ entry.state = { kind: 'starting' };
301
+ (_a = __classPrivateFieldGet(this, _Poller_instances, "m", _Poller_getSubscriber).call(this, entry)) === null || _a === void 0 ? void 0 : _a.refresh();
302
+ }
303
+ /** Abort and remove every polling identity. Intended for test isolation. */
304
+ clear() {
305
+ var _a, _b;
306
+ for (const entry of __classPrivateFieldGet(this, _Poller_entries, "f").values()) {
307
+ __classPrivateFieldGet(this, _Poller_instances, "m", _Poller_clearTimer).call(this, entry);
308
+ if (entry.disposeTimer !== undefined) {
309
+ __classPrivateFieldGet(this, _Poller_clearTimeout, "f").call(this, entry.disposeTimer);
310
+ }
311
+ if (entry.state.kind === 'running') {
312
+ entry.state.run.controller.abort();
313
+ (_b = (_a = entry.state.run).detachExternalSignal) === null || _b === void 0 ? void 0 : _b.call(_a);
314
+ entry.state.run.end();
315
+ }
316
+ }
317
+ for (const owner of __classPrivateFieldGet(this, _Poller_owners, "f").values()) {
318
+ if (owner.disposeTimer !== undefined) {
319
+ __classPrivateFieldGet(this, _Poller_clearTimeout, "f").call(this, owner.disposeTimer);
320
+ }
321
+ for (const timer of owner.timers.values()) {
322
+ __classPrivateFieldGet(this, _Poller_clearTimeout, "f").call(this, timer);
323
+ }
324
+ }
325
+ __classPrivateFieldGet(this, _Poller_owners, "f").clear();
326
+ __classPrivateFieldGet(this, _Poller_entries, "f").clear();
327
+ __classPrivateFieldGet(this, _Poller_instances, "m", _Poller_stopVisibilityListenerIfIdle).call(this);
328
+ }
329
+ /** Current time according to the injected clock. */
330
+ now() {
331
+ return __classPrivateFieldGet(this, _Poller_now, "f").call(this);
332
+ }
333
+ }
334
+ _Poller_clearTimeout = new WeakMap(), _Poller_entries = new WeakMap(), _Poller_getVisibilityState = new WeakMap(), _Poller_jitterRatio = new WeakMap(), _Poller_now = new WeakMap(), _Poller_random = new WeakMap(), _Poller_setTimeout = new WeakMap(), _Poller_visibilityTarget = new WeakMap(), _Poller_owners = new WeakMap(), _Poller_listeningForVisibility = new WeakMap(), _Poller_handleVisibilityChange = new WeakMap(), _Poller_instances = new WeakSet(), _Poller_start = function _Poller_start(key, cause, externalSignal, inputKey) {
335
+ var _a;
336
+ const entry = __classPrivateFieldGet(this, _Poller_instances, "m", _Poller_getOrCreateEntry).call(this, key);
337
+ if (entry.state.kind === 'running') {
338
+ const running = entry.state.run;
339
+ if (cause === 'poll') {
340
+ // A slow poll must finish. Keep one later run instead of
341
+ // stopping work on every tick.
342
+ entry.runAgain = true;
343
+ const abortedController = new AbortController();
344
+ abortedController.abort();
345
+ return {
346
+ signal: abortedController.signal,
347
+ finish: () => { },
348
+ isCurrent: () => false,
349
+ waitForNewer: () => __classPrivateFieldGet(this, _Poller_instances, "m", _Poller_waitForNewer).call(this, key, entry.generation),
350
+ };
351
+ }
352
+ running.controller.abort();
353
+ (_a = running.detachExternalSignal) === null || _a === void 0 ? void 0 : _a.call(running);
354
+ running.end();
355
+ }
356
+ __classPrivateFieldGet(this, _Poller_instances, "m", _Poller_clearTimer).call(this, entry);
357
+ const generation = ++entry.generation;
358
+ const controller = new AbortController();
359
+ let end = () => { };
360
+ const done = new Promise((resolve) => {
361
+ end = resolve;
362
+ });
363
+ const activeRun = {
364
+ cause,
365
+ controller,
366
+ done,
367
+ end,
368
+ generation,
369
+ inputKey,
370
+ };
371
+ entry.state = { kind: 'running', run: activeRun };
372
+ if (externalSignal && typeof externalSignal.addEventListener === 'function') {
373
+ if (externalSignal.aborted) {
374
+ controller.abort(externalSignal.reason);
375
+ }
376
+ else {
377
+ const abortFromExternalSignal = () => controller.abort(externalSignal.reason);
378
+ externalSignal.addEventListener('abort', abortFromExternalSignal, { once: true });
379
+ activeRun.detachExternalSignal = () => externalSignal.removeEventListener('abort', abortFromExternalSignal);
380
+ }
381
+ }
382
+ return __classPrivateFieldGet(this, _Poller_instances, "m", _Poller_createRunHandle).call(this, key, activeRun);
383
+ }, _Poller_createRunHandle = function _Poller_createRunHandle(key, activeRun) {
384
+ let finished = false;
385
+ return {
386
+ signal: activeRun.controller.signal,
387
+ finish: (outcome) => {
388
+ if (finished) {
389
+ return;
390
+ }
391
+ finished = true;
392
+ __classPrivateFieldGet(this, _Poller_instances, "m", _Poller_finishRun).call(this, key, activeRun.generation, outcome);
393
+ },
394
+ isCurrent: () => {
395
+ var _a;
396
+ const state = (_a = __classPrivateFieldGet(this, _Poller_entries, "f").get(key)) === null || _a === void 0 ? void 0 : _a.state;
397
+ return (state === null || state === void 0 ? void 0 : state.kind) === 'running' && state.run.generation === activeRun.generation;
398
+ },
399
+ waitForNewer: () => __classPrivateFieldGet(this, _Poller_instances, "m", _Poller_waitForNewer).call(this, key, activeRun.generation),
400
+ };
401
+ }, _Poller_runWork = function _Poller_runWork(_a) {
402
+ return __awaiter(this, arguments, void 0, function* ({ cause, handle, read, work, write, }) {
403
+ let outcome = { status: 'success' };
404
+ try {
405
+ assertCurrentRun(handle);
406
+ const value = yield work(handle.signal);
407
+ assertCurrentRun(handle);
408
+ write(value);
409
+ return value;
410
+ }
411
+ catch (error) {
412
+ outcome = isAbortError(error)
413
+ ? { status: 'aborted' }
414
+ : { status: 'error', retryAfterMs: getRetryAfterMs(error) };
415
+ const previous = read === null || read === void 0 ? void 0 : read();
416
+ if (isAbortError(error) && (previous === null || previous === void 0 ? void 0 : previous.found)) {
417
+ // A replaced selector still owns a Recoil promise. Wait until
418
+ // every newer run publishes before returning its value.
419
+ yield handle.waitForNewer();
420
+ const latest = read === null || read === void 0 ? void 0 : read();
421
+ return (latest === null || latest === void 0 ? void 0 : latest.found) ? latest.value : previous.value;
422
+ }
423
+ if (cause === 'poll' && (previous === null || previous === void 0 ? void 0 : previous.found)) {
424
+ return previous.value;
425
+ }
426
+ throw error;
427
+ }
428
+ finally {
429
+ handle.finish(outcome);
430
+ }
431
+ });
432
+ }, _Poller_finishRun = function _Poller_finishRun(key, generation, outcome) {
433
+ var _a, _b;
434
+ var _c;
435
+ const entry = __classPrivateFieldGet(this, _Poller_entries, "f").get(key);
436
+ if (!entry || entry.state.kind !== 'running' || entry.state.run.generation !== generation) {
437
+ return;
438
+ }
439
+ (_b = (_a = entry.state.run).detachExternalSignal) === null || _b === void 0 ? void 0 : _b.call(_a);
440
+ entry.state.run.end();
441
+ entry.state = { kind: 'idle' };
442
+ if (entry.subscribers.size === 0) {
443
+ if (entry.owners.size === 0) {
444
+ __classPrivateFieldGet(this, _Poller_entries, "f").delete(key);
445
+ __classPrivateFieldGet(this, _Poller_instances, "m", _Poller_stopVisibilityListenerIfIdle).call(this);
446
+ }
447
+ return;
448
+ }
449
+ if (outcome.status === 'success') {
450
+ entry.failureCount = 0;
451
+ entry.nextRunAt = undefined;
452
+ }
453
+ else if (outcome.status === 'error') {
454
+ entry.failureCount += 1;
455
+ entry.runAgain = false;
456
+ const baseDelay = __classPrivateFieldGet(this, _Poller_instances, "m", _Poller_getIntervalMs).call(this, entry);
457
+ const exponentialDelay = Math.min(baseDelay * Math.pow(2, (entry.failureCount - 1)), MAX_BACKOFF_MS);
458
+ const jitteredDelay = Math.min(__classPrivateFieldGet(this, _Poller_instances, "m", _Poller_withJitter).call(this, exponentialDelay), MAX_BACKOFF_MS);
459
+ const backoffDelay = Math.max(jitteredDelay, (_c = outcome.retryAfterMs) !== null && _c !== void 0 ? _c : 0);
460
+ __classPrivateFieldGet(this, _Poller_instances, "m", _Poller_schedule).call(this, key, entry, backoffDelay);
461
+ }
462
+ if (__classPrivateFieldGet(this, _Poller_getVisibilityState, "f").call(this) === 'hidden') {
463
+ // Keep the due time so Retry-After and backoff still hold when the
464
+ // tab becomes visible.
465
+ entry.runOnShow = true;
466
+ return;
467
+ }
468
+ if (outcome.status === 'success') {
469
+ if (entry.runAgain || entry.runOnShow) {
470
+ entry.runAgain = false;
471
+ entry.runOnShow = false;
472
+ this.runNow(key);
473
+ return;
474
+ }
475
+ __classPrivateFieldGet(this, _Poller_instances, "m", _Poller_schedulePoll).call(this, key, entry);
476
+ return;
477
+ }
478
+ if (outcome.status === 'aborted') {
479
+ if (entry.runAgain) {
480
+ entry.runAgain = false;
481
+ this.runNow(key);
482
+ }
483
+ else {
484
+ __classPrivateFieldGet(this, _Poller_instances, "m", _Poller_schedulePoll).call(this, key, entry);
485
+ }
486
+ }
487
+ }, _Poller_waitForNewer = function _Poller_waitForNewer(key, generation) {
488
+ return __awaiter(this, void 0, void 0, function* () {
489
+ var _a;
490
+ let seenGeneration = generation;
491
+ while (true) {
492
+ const state = (_a = __classPrivateFieldGet(this, _Poller_entries, "f").get(key)) === null || _a === void 0 ? void 0 : _a.state;
493
+ const activeRun = (state === null || state === void 0 ? void 0 : state.kind) === 'running' ? state.run : undefined;
494
+ if (!activeRun || activeRun.generation <= seenGeneration) {
495
+ return;
496
+ }
497
+ seenGeneration = activeRun.generation;
498
+ yield activeRun.done;
499
+ }
500
+ });
501
+ }, _Poller_getIntervalMs = function _Poller_getIntervalMs(entry) {
502
+ return Math.min(...Array.from(entry.subscribers.values(), (subscriber) => subscriber.intervalMs));
503
+ }, _Poller_getOrCreateEntry = function _Poller_getOrCreateEntry(key) {
504
+ let entry = __classPrivateFieldGet(this, _Poller_entries, "f").get(key);
505
+ if (!entry) {
506
+ entry = {
507
+ failureCount: 0,
508
+ generation: 0,
509
+ owners: new Set(),
510
+ runAgain: false,
511
+ runOnShow: false,
512
+ state: { kind: 'idle' },
513
+ subscribers: new Map(),
514
+ };
515
+ __classPrivateFieldGet(this, _Poller_entries, "f").set(key, entry);
516
+ }
517
+ return entry;
518
+ }, _Poller_getSubscriber = function _Poller_getSubscriber(entry) {
519
+ return Array.from(entry.subscribers.values()).sort((a, b) => a.intervalMs - b.intervalMs)[0];
520
+ }, _Poller_getOrCreateOwner = function _Poller_getOrCreateOwner(ownerId) {
521
+ let owner = __classPrivateFieldGet(this, _Poller_owners, "f").get(ownerId);
522
+ if (!owner) {
523
+ const newOwner = {
524
+ claims: new Map(),
525
+ hooks: new Map(),
526
+ renderKeys: new Set(),
527
+ timers: new Map(),
528
+ };
529
+ owner = newOwner;
530
+ __classPrivateFieldGet(this, _Poller_owners, "f").set(ownerId, newOwner);
531
+ }
532
+ return owner;
533
+ }, _Poller_dropOwnedKey = function _Poller_dropOwnedKey(ownerId, key) {
534
+ var _a, _b;
535
+ const entry = __classPrivateFieldGet(this, _Poller_entries, "f").get(key);
536
+ if (!entry) {
537
+ return;
538
+ }
539
+ entry.owners.delete(ownerId);
540
+ if (entry.owners.size > 0 || entry.subscribers.size > 0) {
541
+ return;
542
+ }
543
+ __classPrivateFieldGet(this, _Poller_instances, "m", _Poller_clearTimer).call(this, entry);
544
+ if (entry.state.kind === 'running') {
545
+ entry.state.run.controller.abort();
546
+ (_b = (_a = entry.state.run).detachExternalSignal) === null || _b === void 0 ? void 0 : _b.call(_a);
547
+ entry.state.run.end();
548
+ }
549
+ __classPrivateFieldGet(this, _Poller_entries, "f").delete(key);
550
+ }, _Poller_dropOwner = function _Poller_dropOwner(ownerId, owner) {
551
+ if (__classPrivateFieldGet(this, _Poller_owners, "f").get(ownerId) !== owner) {
552
+ return;
553
+ }
554
+ __classPrivateFieldGet(this, _Poller_owners, "f").delete(ownerId);
555
+ for (const timer of owner.timers.values()) {
556
+ __classPrivateFieldGet(this, _Poller_clearTimeout, "f").call(this, timer);
557
+ }
558
+ const keys = new Set([...owner.claims.values(), ...owner.renderKeys, ...owner.hooks.values()]);
559
+ for (const key of keys) {
560
+ __classPrivateFieldGet(this, _Poller_instances, "m", _Poller_dropOwnedKey).call(this, ownerId, key);
561
+ }
562
+ __classPrivateFieldGet(this, _Poller_instances, "m", _Poller_stopVisibilityListenerIfIdle).call(this);
563
+ }, _Poller_hasClaimForKey = function _Poller_hasClaimForKey(owner, key) {
564
+ return Array.from(owner.claims.values()).some((claimKey) => claimKey === key);
565
+ }, _Poller_hasHookForKey = function _Poller_hasHookForKey(owner, key) {
566
+ return Array.from(owner.hooks.values()).some((hookKey) => hookKey === key);
567
+ }, _Poller_ownerHasKey = function _Poller_ownerHasKey(owner, key) {
568
+ return owner.renderKeys.has(key) || __classPrivateFieldGet(this, _Poller_instances, "m", _Poller_hasHookForKey).call(this, owner, key) || __classPrivateFieldGet(this, _Poller_instances, "m", _Poller_hasClaimForKey).call(this, owner, key);
569
+ }, _Poller_schedulePoll = function _Poller_schedulePoll(key, entry) {
570
+ __classPrivateFieldGet(this, _Poller_instances, "m", _Poller_schedule).call(this, key, entry, __classPrivateFieldGet(this, _Poller_instances, "m", _Poller_withJitter).call(this, __classPrivateFieldGet(this, _Poller_instances, "m", _Poller_getIntervalMs).call(this, entry)));
571
+ }, _Poller_schedule = function _Poller_schedule(key, entry, delay) {
572
+ __classPrivateFieldGet(this, _Poller_instances, "m", _Poller_clearTimer).call(this, entry);
573
+ entry.nextRunAt = __classPrivateFieldGet(this, _Poller_now, "f").call(this) + delay;
574
+ if (__classPrivateFieldGet(this, _Poller_getVisibilityState, "f").call(this) === 'hidden') {
575
+ entry.runOnShow = true;
576
+ return;
577
+ }
578
+ entry.timer = __classPrivateFieldGet(this, _Poller_setTimeout, "f").call(this, () => {
579
+ entry.timer = undefined;
580
+ entry.nextRunAt = undefined;
581
+ this.runNow(key);
582
+ }, delay);
583
+ }, _Poller_clearTimer = function _Poller_clearTimer(entry, clearNextRun = true) {
584
+ if (entry.timer !== undefined) {
585
+ __classPrivateFieldGet(this, _Poller_clearTimeout, "f").call(this, entry.timer);
586
+ entry.timer = undefined;
587
+ }
588
+ if (clearNextRun) {
589
+ entry.nextRunAt = undefined;
590
+ }
591
+ }, _Poller_withJitter = function _Poller_withJitter(delay) {
592
+ const multiplier = 1 - __classPrivateFieldGet(this, _Poller_jitterRatio, "f") + __classPrivateFieldGet(this, _Poller_random, "f").call(this) * __classPrivateFieldGet(this, _Poller_jitterRatio, "f") * 2;
593
+ return Math.max(0, delay * multiplier);
594
+ }, _Poller_startVisibilityListener = function _Poller_startVisibilityListener() {
595
+ if (__classPrivateFieldGet(this, _Poller_listeningForVisibility, "f") || !__classPrivateFieldGet(this, _Poller_visibilityTarget, "f")) {
596
+ return;
597
+ }
598
+ __classPrivateFieldGet(this, _Poller_visibilityTarget, "f").addEventListener('visibilitychange', __classPrivateFieldGet(this, _Poller_handleVisibilityChange, "f"));
599
+ __classPrivateFieldSet(this, _Poller_listeningForVisibility, true, "f");
600
+ }, _Poller_stopVisibilityListenerIfIdle = function _Poller_stopVisibilityListenerIfIdle() {
601
+ if (!__classPrivateFieldGet(this, _Poller_listeningForVisibility, "f") || __classPrivateFieldGet(this, _Poller_entries, "f").size > 0 || !__classPrivateFieldGet(this, _Poller_visibilityTarget, "f")) {
602
+ return;
603
+ }
604
+ __classPrivateFieldGet(this, _Poller_visibilityTarget, "f").removeEventListener('visibilitychange', __classPrivateFieldGet(this, _Poller_handleVisibilityChange, "f"));
605
+ __classPrivateFieldSet(this, _Poller_listeningForVisibility, false, "f");
606
+ };
607
+ const poller = new Poller();
608
+ /**
609
+ * Register fixed-delay polling for a request identity.
610
+ *
611
+ * `refresh` only invalidates the corresponding selector. Request lifecycle,
612
+ * backpressure, retries, and cancellation remain owned by the poller.
613
+ */
614
+ export function usePolling(key, intervalSeconds, refresh) {
615
+ const refreshRef = useLatestRef(refresh);
616
+ useEffect(() => poller.subscribe(key, intervalSeconds, () => refreshRef.current()), [intervalSeconds, key, refreshRef]);
617
+ }
618
+ /**
619
+ * Create a render-local map of hooks to polling keys.
620
+ *
621
+ * The commit drops claims left by hooks that did not render.
622
+ */
623
+ export function usePollScope() {
624
+ const id = useId();
625
+ const claims = new Map();
626
+ useLayoutEffect(() => {
627
+ poller.commitOwner(id, claims);
628
+ });
629
+ useLayoutEffect(() => () => poller.releaseOwner(id), [id]);
630
+ return { claims, id };
631
+ }
632
+ /**
633
+ * Keep one request key for a rendered hook.
634
+ *
635
+ * The hook must claim the key during render because an initial suspended render
636
+ * runs no effect. The claim only marks ownership; it starts no work. The passive
637
+ * effect keeps the claim after commit and stays mounted when Suspense hides an
638
+ * existing tree.
639
+ */
640
+ export function usePollKey(scope, key) {
641
+ const hookId = useId();
642
+ scope === null || scope === void 0 ? void 0 : scope.claims.set(hookId, key);
643
+ const ownerId = scope === null || scope === void 0 ? void 0 : scope.id;
644
+ if (ownerId) {
645
+ poller.claimKey(ownerId, hookId, key);
646
+ }
647
+ useEffect(() => {
648
+ if (!ownerId) {
649
+ return;
650
+ }
651
+ poller.mountKey(ownerId, hookId, key);
652
+ return () => poller.unmountKey(ownerId, hookId, key);
653
+ }, [hookId, key, ownerId]);
654
+ }
655
+ /** Run one request using the production poller. */
656
+ export function runPoll(run) {
657
+ return poller.run(run);
658
+ }
659
+ /** Create a force key that identifies a poller-owned refresh. */
660
+ export function createPollForceKey() {
661
+ var _a, _b;
662
+ var _c;
663
+ return `${POLL_FORCE_KEY_PREFIX}${(_c = (_b = (_a = globalThis.crypto) === null || _a === void 0 ? void 0 : _a.randomUUID) === null || _b === void 0 ? void 0 : _b.call(_a)) !== null && _c !== void 0 ? _c : String(Math.random())}`;
664
+ }
665
+ /** Check whether a selector force key originated from the poller. */
666
+ export function isPollForceKey(forceKey) {
667
+ var _a;
668
+ return (_a = forceKey === null || forceKey === void 0 ? void 0 : forceKey.startsWith(POLL_FORCE_KEY_PREFIX)) !== null && _a !== void 0 ? _a : false;
669
+ }
670
+ /** Extract Retry-After as a non-negative delay in milliseconds. */
671
+ export function parseRetryAfter(response, now = poller.now()) {
672
+ const value = response.headers.get('Retry-After');
673
+ if (!value) {
674
+ return undefined;
675
+ }
676
+ const seconds = Number(value);
677
+ if (Number.isFinite(seconds) && seconds >= 0) {
678
+ return seconds * 1000;
679
+ }
680
+ const retryAt = Date.parse(value);
681
+ if (Number.isNaN(retryAt)) {
682
+ return undefined;
683
+ }
684
+ return Math.max(0, retryAt - now);
685
+ }
686
+ /** Keep Retry-After beside an error without changing the error object. */
687
+ export function markRetryAfter(error, response) {
688
+ const delay = parseRetryAfter(response);
689
+ if (delay !== undefined && typeof error === 'object' && error !== null) {
690
+ retryAfterByError.set(error, delay);
691
+ }
692
+ return error;
693
+ }
694
+ /** Await a promise while preserving ownership of request cancellation. */
695
+ export function waitOrAbort(promise, signal) {
696
+ return __awaiter(this, void 0, void 0, function* () {
697
+ if (!signal) {
698
+ return promise;
699
+ }
700
+ if (signal.aborted) {
701
+ throw new DOMException('The request was aborted', 'AbortError');
702
+ }
703
+ return new Promise((resolve, reject) => {
704
+ const abort = () => {
705
+ signal.removeEventListener('abort', abort);
706
+ reject(new DOMException('The request was aborted', 'AbortError'));
707
+ };
708
+ signal.addEventListener('abort', abort, { once: true });
709
+ promise.then((value) => {
710
+ signal.removeEventListener('abort', abort);
711
+ resolve(value);
712
+ }, (error) => {
713
+ signal.removeEventListener('abort', abort);
714
+ reject(error);
715
+ });
716
+ });
717
+ });
718
+ }
719
+ /** Clear production polling state. Intended for test isolation. */
720
+ export function clearPolling_TEST() {
721
+ poller.clear();
722
+ }
723
+ //# sourceMappingURL=polling.js.map