@askrjs/askr 0.0.4 → 0.0.6
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.
- package/dist/{index.d.cts → component-BBGWJdqJ.d.ts} +42 -33
- package/dist/foundations/index.d.ts +32 -0
- package/dist/{chunk-WTFWRSHB.js → foundations/index.js} +76 -28
- package/dist/foundations/index.js.map +1 -0
- package/dist/fx/index.js +295 -77
- package/dist/fx/index.js.map +1 -1
- package/dist/index.d.ts +4 -134
- package/dist/index.js +3709 -42
- package/dist/index.js.map +1 -1
- package/dist/{jsx/jsx-dev-runtime.d.ts → jsx-dev-runtime.d.ts} +3 -3
- package/dist/jsx-dev-runtime.js +17 -0
- package/dist/jsx-dev-runtime.js.map +1 -0
- package/dist/jsx-runtime.d.ts +14 -0
- package/dist/{chunk-SALJX5PZ.js → jsx-runtime.js} +6 -9
- package/dist/jsx-runtime.js.map +1 -0
- package/dist/layout-D5MqtW_q.d.ts +14 -0
- package/dist/resources/index.d.ts +3 -0
- package/dist/resources/index.js +753 -239
- package/dist/resources/index.js.map +1 -1
- package/dist/router/index.d.ts +2 -14
- package/dist/router/index.js +3115 -19
- package/dist/router/index.js.map +1 -1
- package/dist/ssr/index.js +3363 -103
- package/dist/ssr/index.js.map +1 -1
- package/dist/{types-CZHOAiC1.d.ts → types-uOPfcrdz.d.ts} +3 -1
- package/dist/vite/index.d.ts +17 -0
- package/dist/vite/index.js +2306 -0
- package/dist/vite/index.js.map +1 -0
- package/package.json +21 -23
- package/dist/chunk-64C7W2AE.js +0 -43
- package/dist/chunk-64C7W2AE.js.map +0 -1
- package/dist/chunk-6FLMH4EL.js +0 -124
- package/dist/chunk-6FLMH4EL.js.map +0 -1
- package/dist/chunk-FJUXFA72.js +0 -16
- package/dist/chunk-FJUXFA72.js.map +0 -1
- package/dist/chunk-SALJX5PZ.js.map +0 -1
- package/dist/chunk-VRAEBIJ3.js +0 -82
- package/dist/chunk-VRAEBIJ3.js.map +0 -1
- package/dist/chunk-WTFWRSHB.js.map +0 -1
- package/dist/chunk-XHKZGJE3.js +0 -2907
- package/dist/chunk-XHKZGJE3.js.map +0 -1
- package/dist/chunk-Z5ZSTLYF.js +0 -420
- package/dist/chunk-Z5ZSTLYF.js.map +0 -1
- package/dist/fx/index.cjs +0 -1193
- package/dist/fx/index.cjs.map +0 -1
- package/dist/fx/index.d.cts +0 -186
- package/dist/index.cjs +0 -4035
- package/dist/index.cjs.map +0 -1
- package/dist/jsx/jsx-dev-runtime.cjs +0 -46
- package/dist/jsx/jsx-dev-runtime.cjs.map +0 -1
- package/dist/jsx/jsx-dev-runtime.d.cts +0 -12
- package/dist/jsx/jsx-dev-runtime.js +0 -19
- package/dist/jsx/jsx-dev-runtime.js.map +0 -1
- package/dist/jsx/jsx-runtime.cjs +0 -54
- package/dist/jsx/jsx-runtime.cjs.map +0 -1
- package/dist/jsx/jsx-runtime.d.cts +0 -21
- package/dist/jsx/jsx-runtime.d.ts +0 -21
- package/dist/jsx/jsx-runtime.js +0 -16
- package/dist/jsx/jsx-runtime.js.map +0 -1
- package/dist/jsx-AzPM8gMS.d.cts +0 -35
- package/dist/navigate-LUVYHYZZ.js +0 -17
- package/dist/navigate-LUVYHYZZ.js.map +0 -1
- package/dist/resources/index.cjs +0 -1200
- package/dist/resources/index.cjs.map +0 -1
- package/dist/resources/index.d.cts +0 -21
- package/dist/route-BCND6MPK.js +0 -32
- package/dist/route-BCND6MPK.js.map +0 -1
- package/dist/router/index.cjs +0 -3247
- package/dist/router/index.cjs.map +0 -1
- package/dist/router/index.d.cts +0 -64
- package/dist/router-DaGtH1Sq.d.cts +0 -36
- package/dist/ssr/index.cjs +0 -4059
- package/dist/ssr/index.cjs.map +0 -1
- package/dist/ssr/index.d.cts +0 -123
- package/dist/types-CZ5sWur5.d.cts +0 -23
- package/src/jsx/index.ts +0 -4
- package/src/jsx/jsx-dev-runtime.ts +0 -23
- package/src/jsx/jsx-runtime.ts +0 -48
- package/src/jsx/types.ts +0 -33
- package/src/jsx/utils.ts +0 -19
package/dist/fx/index.js
CHANGED
|
@@ -1,11 +1,3 @@
|
|
|
1
|
-
import {
|
|
2
|
-
getCurrentComponentInstance,
|
|
3
|
-
globalScheduler,
|
|
4
|
-
logger
|
|
5
|
-
} from "../chunk-XHKZGJE3.js";
|
|
6
|
-
import "../chunk-SALJX5PZ.js";
|
|
7
|
-
import "../chunk-FJUXFA72.js";
|
|
8
|
-
|
|
9
1
|
// src/fx/timing.ts
|
|
10
2
|
function debounce(fn, ms, options) {
|
|
11
3
|
let timeoutId = null;
|
|
@@ -141,24 +133,304 @@ async function retry(fn, options) {
|
|
|
141
133
|
throw lastError || new Error("Retry failed");
|
|
142
134
|
}
|
|
143
135
|
|
|
136
|
+
// src/dev/invariant.ts
|
|
137
|
+
function invariant(condition, message, context) {
|
|
138
|
+
if (!condition) {
|
|
139
|
+
const contextStr = "";
|
|
140
|
+
throw new Error(`[Askr Invariant] ${message}${contextStr}`);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
function assertSchedulingPrecondition(condition, violationMessage) {
|
|
144
|
+
invariant(condition, `[Scheduler Precondition] ${violationMessage}`);
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
// src/dev/logger.ts
|
|
148
|
+
function callConsole(method, args) {
|
|
149
|
+
const c = typeof console !== "undefined" ? console : void 0;
|
|
150
|
+
if (!c) return;
|
|
151
|
+
const fn = c[method];
|
|
152
|
+
if (typeof fn === "function") {
|
|
153
|
+
try {
|
|
154
|
+
fn.apply(console, args);
|
|
155
|
+
} catch {
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
var logger = {
|
|
160
|
+
debug: (...args) => {
|
|
161
|
+
if (process.env.NODE_ENV === "production") return;
|
|
162
|
+
callConsole("debug", args);
|
|
163
|
+
},
|
|
164
|
+
info: (...args) => {
|
|
165
|
+
if (process.env.NODE_ENV === "production") return;
|
|
166
|
+
callConsole("info", args);
|
|
167
|
+
},
|
|
168
|
+
warn: (...args) => {
|
|
169
|
+
if (process.env.NODE_ENV === "production") return;
|
|
170
|
+
callConsole("warn", args);
|
|
171
|
+
},
|
|
172
|
+
error: (...args) => {
|
|
173
|
+
callConsole("error", args);
|
|
174
|
+
}
|
|
175
|
+
};
|
|
176
|
+
|
|
177
|
+
// src/runtime/scheduler.ts
|
|
178
|
+
var MAX_FLUSH_DEPTH = 50;
|
|
179
|
+
function isBulkCommitActive() {
|
|
180
|
+
try {
|
|
181
|
+
const fb = globalThis.__ASKR_FASTLANE;
|
|
182
|
+
return typeof fb?.isBulkCommitActive === "function" ? !!fb.isBulkCommitActive() : false;
|
|
183
|
+
} catch (e) {
|
|
184
|
+
return false;
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
var Scheduler = class {
|
|
188
|
+
constructor() {
|
|
189
|
+
this.q = [];
|
|
190
|
+
this.head = 0;
|
|
191
|
+
this.running = false;
|
|
192
|
+
this.inHandler = false;
|
|
193
|
+
this.depth = 0;
|
|
194
|
+
this.executionDepth = 0;
|
|
195
|
+
// for compat with existing diagnostics
|
|
196
|
+
// Monotonic flush version increments at end of each flush
|
|
197
|
+
this.flushVersion = 0;
|
|
198
|
+
// Best-effort microtask kick scheduling
|
|
199
|
+
this.kickScheduled = false;
|
|
200
|
+
// Escape hatch flag for runWithSyncProgress
|
|
201
|
+
this.allowSyncProgress = false;
|
|
202
|
+
// Waiters waiting for flushVersion >= target
|
|
203
|
+
this.waiters = [];
|
|
204
|
+
// Keep a lightweight taskCount for compatibility/diagnostics
|
|
205
|
+
this.taskCount = 0;
|
|
206
|
+
}
|
|
207
|
+
enqueue(task) {
|
|
208
|
+
assertSchedulingPrecondition(
|
|
209
|
+
typeof task === "function",
|
|
210
|
+
"enqueue() requires a function"
|
|
211
|
+
);
|
|
212
|
+
if (isBulkCommitActive() && !this.allowSyncProgress) {
|
|
213
|
+
if (process.env.NODE_ENV !== "production") {
|
|
214
|
+
throw new Error(
|
|
215
|
+
"[Scheduler] enqueue() during bulk commit (not allowed)"
|
|
216
|
+
);
|
|
217
|
+
}
|
|
218
|
+
return;
|
|
219
|
+
}
|
|
220
|
+
this.q.push(task);
|
|
221
|
+
this.taskCount++;
|
|
222
|
+
if (!this.running && !this.kickScheduled && !this.inHandler && !isBulkCommitActive()) {
|
|
223
|
+
this.kickScheduled = true;
|
|
224
|
+
queueMicrotask(() => {
|
|
225
|
+
this.kickScheduled = false;
|
|
226
|
+
if (this.running) return;
|
|
227
|
+
if (isBulkCommitActive()) return;
|
|
228
|
+
try {
|
|
229
|
+
this.flush();
|
|
230
|
+
} catch (err) {
|
|
231
|
+
setTimeout(() => {
|
|
232
|
+
throw err;
|
|
233
|
+
});
|
|
234
|
+
}
|
|
235
|
+
});
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
flush() {
|
|
239
|
+
invariant(
|
|
240
|
+
!this.running,
|
|
241
|
+
"[Scheduler] flush() called while already running"
|
|
242
|
+
);
|
|
243
|
+
if (process.env.NODE_ENV !== "production") {
|
|
244
|
+
if (isBulkCommitActive() && !this.allowSyncProgress) {
|
|
245
|
+
throw new Error(
|
|
246
|
+
"[Scheduler] flush() started during bulk commit (not allowed)"
|
|
247
|
+
);
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
this.running = true;
|
|
251
|
+
this.depth = 0;
|
|
252
|
+
let fatal = null;
|
|
253
|
+
try {
|
|
254
|
+
while (this.head < this.q.length) {
|
|
255
|
+
this.depth++;
|
|
256
|
+
if (process.env.NODE_ENV !== "production" && this.depth > MAX_FLUSH_DEPTH) {
|
|
257
|
+
throw new Error(
|
|
258
|
+
`[Scheduler] exceeded MAX_FLUSH_DEPTH (${MAX_FLUSH_DEPTH}). Likely infinite update loop.`
|
|
259
|
+
);
|
|
260
|
+
}
|
|
261
|
+
const task = this.q[this.head++];
|
|
262
|
+
try {
|
|
263
|
+
this.executionDepth++;
|
|
264
|
+
task();
|
|
265
|
+
this.executionDepth--;
|
|
266
|
+
} catch (err) {
|
|
267
|
+
if (this.executionDepth > 0) this.executionDepth = 0;
|
|
268
|
+
fatal = err;
|
|
269
|
+
break;
|
|
270
|
+
}
|
|
271
|
+
if (this.taskCount > 0) this.taskCount--;
|
|
272
|
+
}
|
|
273
|
+
} finally {
|
|
274
|
+
this.running = false;
|
|
275
|
+
this.depth = 0;
|
|
276
|
+
this.executionDepth = 0;
|
|
277
|
+
if (this.head >= this.q.length) {
|
|
278
|
+
this.q.length = 0;
|
|
279
|
+
this.head = 0;
|
|
280
|
+
} else if (this.head > 0) {
|
|
281
|
+
const remaining = this.q.length - this.head;
|
|
282
|
+
for (let i = 0; i < remaining; i++) {
|
|
283
|
+
this.q[i] = this.q[this.head + i];
|
|
284
|
+
}
|
|
285
|
+
this.q.length = remaining;
|
|
286
|
+
this.head = 0;
|
|
287
|
+
}
|
|
288
|
+
this.flushVersion++;
|
|
289
|
+
this.resolveWaiters();
|
|
290
|
+
}
|
|
291
|
+
if (fatal) throw fatal;
|
|
292
|
+
}
|
|
293
|
+
runWithSyncProgress(fn) {
|
|
294
|
+
const prev = this.allowSyncProgress;
|
|
295
|
+
this.allowSyncProgress = true;
|
|
296
|
+
const g = globalThis;
|
|
297
|
+
const origQueueMicrotask = g.queueMicrotask;
|
|
298
|
+
const origSetTimeout = g.setTimeout;
|
|
299
|
+
if (process.env.NODE_ENV !== "production") {
|
|
300
|
+
g.queueMicrotask = () => {
|
|
301
|
+
throw new Error(
|
|
302
|
+
"[Scheduler] queueMicrotask not allowed during runWithSyncProgress"
|
|
303
|
+
);
|
|
304
|
+
};
|
|
305
|
+
g.setTimeout = () => {
|
|
306
|
+
throw new Error(
|
|
307
|
+
"[Scheduler] setTimeout not allowed during runWithSyncProgress"
|
|
308
|
+
);
|
|
309
|
+
};
|
|
310
|
+
}
|
|
311
|
+
const startVersion = this.flushVersion;
|
|
312
|
+
try {
|
|
313
|
+
const res = fn();
|
|
314
|
+
if (!this.running && this.q.length - this.head > 0) {
|
|
315
|
+
this.flush();
|
|
316
|
+
}
|
|
317
|
+
if (process.env.NODE_ENV !== "production") {
|
|
318
|
+
if (this.q.length - this.head > 0) {
|
|
319
|
+
throw new Error(
|
|
320
|
+
"[Scheduler] tasks remain after runWithSyncProgress flush"
|
|
321
|
+
);
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
return res;
|
|
325
|
+
} finally {
|
|
326
|
+
if (process.env.NODE_ENV !== "production") {
|
|
327
|
+
g.queueMicrotask = origQueueMicrotask;
|
|
328
|
+
g.setTimeout = origSetTimeout;
|
|
329
|
+
}
|
|
330
|
+
try {
|
|
331
|
+
if (this.flushVersion === startVersion) {
|
|
332
|
+
this.flushVersion++;
|
|
333
|
+
this.resolveWaiters();
|
|
334
|
+
}
|
|
335
|
+
} catch (e) {
|
|
336
|
+
}
|
|
337
|
+
this.allowSyncProgress = prev;
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
waitForFlush(targetVersion, timeoutMs = 2e3) {
|
|
341
|
+
const target = typeof targetVersion === "number" ? targetVersion : this.flushVersion + 1;
|
|
342
|
+
if (this.flushVersion >= target) return Promise.resolve();
|
|
343
|
+
return new Promise((resolve, reject) => {
|
|
344
|
+
const timer = setTimeout(() => {
|
|
345
|
+
const ns = globalThis.__ASKR__ || {};
|
|
346
|
+
const diag = {
|
|
347
|
+
flushVersion: this.flushVersion,
|
|
348
|
+
queueLen: this.q.length - this.head,
|
|
349
|
+
running: this.running,
|
|
350
|
+
inHandler: this.inHandler,
|
|
351
|
+
bulk: isBulkCommitActive(),
|
|
352
|
+
namespace: ns
|
|
353
|
+
};
|
|
354
|
+
reject(
|
|
355
|
+
new Error(
|
|
356
|
+
`waitForFlush timeout ${timeoutMs}ms: ${JSON.stringify(diag)}`
|
|
357
|
+
)
|
|
358
|
+
);
|
|
359
|
+
}, timeoutMs);
|
|
360
|
+
this.waiters.push({ target, resolve, reject, timer });
|
|
361
|
+
});
|
|
362
|
+
}
|
|
363
|
+
getState() {
|
|
364
|
+
return {
|
|
365
|
+
queueLength: this.q.length - this.head,
|
|
366
|
+
running: this.running,
|
|
367
|
+
depth: this.depth,
|
|
368
|
+
executionDepth: this.executionDepth,
|
|
369
|
+
taskCount: this.taskCount,
|
|
370
|
+
flushVersion: this.flushVersion,
|
|
371
|
+
// New fields for optional inspection
|
|
372
|
+
inHandler: this.inHandler,
|
|
373
|
+
allowSyncProgress: this.allowSyncProgress
|
|
374
|
+
};
|
|
375
|
+
}
|
|
376
|
+
setInHandler(v) {
|
|
377
|
+
this.inHandler = v;
|
|
378
|
+
}
|
|
379
|
+
isInHandler() {
|
|
380
|
+
return this.inHandler;
|
|
381
|
+
}
|
|
382
|
+
isExecuting() {
|
|
383
|
+
return this.running || this.executionDepth > 0;
|
|
384
|
+
}
|
|
385
|
+
// Clear pending synchronous tasks (used by fastlane enter/exit)
|
|
386
|
+
clearPendingSyncTasks() {
|
|
387
|
+
const remaining = this.q.length - this.head;
|
|
388
|
+
if (remaining <= 0) return 0;
|
|
389
|
+
if (this.running) {
|
|
390
|
+
this.q.length = this.head;
|
|
391
|
+
this.taskCount = Math.max(0, this.taskCount - remaining);
|
|
392
|
+
queueMicrotask(() => {
|
|
393
|
+
try {
|
|
394
|
+
this.flushVersion++;
|
|
395
|
+
this.resolveWaiters();
|
|
396
|
+
} catch (e) {
|
|
397
|
+
}
|
|
398
|
+
});
|
|
399
|
+
return remaining;
|
|
400
|
+
}
|
|
401
|
+
this.q.length = 0;
|
|
402
|
+
this.head = 0;
|
|
403
|
+
this.taskCount = Math.max(0, this.taskCount - remaining);
|
|
404
|
+
this.flushVersion++;
|
|
405
|
+
this.resolveWaiters();
|
|
406
|
+
return remaining;
|
|
407
|
+
}
|
|
408
|
+
resolveWaiters() {
|
|
409
|
+
if (this.waiters.length === 0) return;
|
|
410
|
+
const ready = [];
|
|
411
|
+
const remaining = [];
|
|
412
|
+
for (const w of this.waiters) {
|
|
413
|
+
if (this.flushVersion >= w.target) {
|
|
414
|
+
if (w.timer) clearTimeout(w.timer);
|
|
415
|
+
ready.push(w.resolve);
|
|
416
|
+
} else {
|
|
417
|
+
remaining.push(w);
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
this.waiters = remaining;
|
|
421
|
+
for (const r of ready) r();
|
|
422
|
+
}
|
|
423
|
+
};
|
|
424
|
+
var globalScheduler = new Scheduler();
|
|
425
|
+
|
|
144
426
|
// src/fx/noop.ts
|
|
145
|
-
|
|
427
|
+
Object.assign((_ev) => {
|
|
146
428
|
}, { cancel() {
|
|
147
429
|
} });
|
|
148
|
-
|
|
430
|
+
Object.assign((_ev) => {
|
|
149
431
|
}, { cancel() {
|
|
150
432
|
}, flush() {
|
|
151
433
|
} });
|
|
152
|
-
|
|
153
|
-
// src/fx/fx.ts
|
|
154
|
-
function throwIfDuringRender() {
|
|
155
|
-
const inst = getCurrentComponentInstance();
|
|
156
|
-
if (inst !== null) {
|
|
157
|
-
throw new Error(
|
|
158
|
-
"[Askr] calling FX handler during render is not allowed. Move calls to event handlers or effects."
|
|
159
|
-
);
|
|
160
|
-
}
|
|
161
|
-
}
|
|
162
434
|
function enqueueUserCallback(fn) {
|
|
163
435
|
globalScheduler.enqueue(() => {
|
|
164
436
|
try {
|
|
@@ -170,15 +442,10 @@ function enqueueUserCallback(fn) {
|
|
|
170
442
|
}
|
|
171
443
|
function debounceEvent(ms, handler, options) {
|
|
172
444
|
const { leading = false, trailing = true } = options || {};
|
|
173
|
-
const inst = getCurrentComponentInstance();
|
|
174
|
-
if (inst && inst.ssr) {
|
|
175
|
-
return noopEventListenerWithFlush;
|
|
176
|
-
}
|
|
177
445
|
let timeoutId = null;
|
|
178
446
|
let lastEvent = null;
|
|
179
447
|
let lastCallTime = 0;
|
|
180
448
|
const debounced = function(ev) {
|
|
181
|
-
throwIfDuringRender();
|
|
182
449
|
const now = Date.now();
|
|
183
450
|
lastEvent = ev;
|
|
184
451
|
if (timeoutId !== null) {
|
|
@@ -215,24 +482,14 @@ function debounceEvent(ms, handler, options) {
|
|
|
215
482
|
if (ev) enqueueUserCallback(() => handler.call(null, ev));
|
|
216
483
|
}
|
|
217
484
|
};
|
|
218
|
-
if (inst) {
|
|
219
|
-
inst.cleanupFns.push(() => {
|
|
220
|
-
debounced.cancel();
|
|
221
|
-
});
|
|
222
|
-
}
|
|
223
485
|
return debounced;
|
|
224
486
|
}
|
|
225
487
|
function throttleEvent(ms, handler, options) {
|
|
226
488
|
const { leading = true, trailing = true } = options || {};
|
|
227
|
-
const inst = getCurrentComponentInstance();
|
|
228
|
-
if (inst && inst.ssr) {
|
|
229
|
-
return noopEventListener;
|
|
230
|
-
}
|
|
231
489
|
let lastCallTime = 0;
|
|
232
490
|
let timeoutId = null;
|
|
233
491
|
let lastEvent = null;
|
|
234
492
|
const throttled = function(ev) {
|
|
235
|
-
throwIfDuringRender();
|
|
236
493
|
const now = Date.now();
|
|
237
494
|
lastEvent = ev;
|
|
238
495
|
if (leading && now - lastCallTime >= ms) {
|
|
@@ -265,16 +522,9 @@ function throttleEvent(ms, handler, options) {
|
|
|
265
522
|
}
|
|
266
523
|
lastEvent = null;
|
|
267
524
|
};
|
|
268
|
-
if (inst) {
|
|
269
|
-
inst.cleanupFns.push(() => throttled.cancel());
|
|
270
|
-
}
|
|
271
525
|
return throttled;
|
|
272
526
|
}
|
|
273
527
|
function rafEvent(handler) {
|
|
274
|
-
const inst = getCurrentComponentInstance();
|
|
275
|
-
if (inst && inst.ssr) {
|
|
276
|
-
return noopEventListener;
|
|
277
|
-
}
|
|
278
528
|
let frameId = null;
|
|
279
529
|
let lastEvent = null;
|
|
280
530
|
const scheduleFrame = () => {
|
|
@@ -289,7 +539,6 @@ function rafEvent(handler) {
|
|
|
289
539
|
});
|
|
290
540
|
};
|
|
291
541
|
const fn = function(ev) {
|
|
292
|
-
throwIfDuringRender();
|
|
293
542
|
lastEvent = ev;
|
|
294
543
|
if (frameId === null) scheduleFrame();
|
|
295
544
|
};
|
|
@@ -304,16 +553,9 @@ function rafEvent(handler) {
|
|
|
304
553
|
}
|
|
305
554
|
lastEvent = null;
|
|
306
555
|
};
|
|
307
|
-
if (inst) inst.cleanupFns.push(() => fn.cancel());
|
|
308
556
|
return fn;
|
|
309
557
|
}
|
|
310
558
|
function scheduleTimeout(ms, fn) {
|
|
311
|
-
throwIfDuringRender();
|
|
312
|
-
const inst = getCurrentComponentInstance();
|
|
313
|
-
if (inst && inst.ssr) {
|
|
314
|
-
return () => {
|
|
315
|
-
};
|
|
316
|
-
}
|
|
317
559
|
let id = setTimeout(() => {
|
|
318
560
|
id = null;
|
|
319
561
|
enqueueUserCallback(fn);
|
|
@@ -324,14 +566,9 @@ function scheduleTimeout(ms, fn) {
|
|
|
324
566
|
id = null;
|
|
325
567
|
}
|
|
326
568
|
};
|
|
327
|
-
if (inst) inst.cleanupFns.push(cancel);
|
|
328
569
|
return cancel;
|
|
329
570
|
}
|
|
330
571
|
function scheduleIdle(fn, options) {
|
|
331
|
-
throwIfDuringRender();
|
|
332
|
-
const inst = getCurrentComponentInstance();
|
|
333
|
-
if (inst && inst.ssr) return () => {
|
|
334
|
-
};
|
|
335
572
|
let id = null;
|
|
336
573
|
let usingRIC = false;
|
|
337
574
|
if (typeof requestIdleCallback !== "undefined") {
|
|
@@ -356,14 +593,9 @@ function scheduleIdle(fn, options) {
|
|
|
356
593
|
id = null;
|
|
357
594
|
}
|
|
358
595
|
};
|
|
359
|
-
if (inst) inst.cleanupFns.push(cancel);
|
|
360
596
|
return cancel;
|
|
361
597
|
}
|
|
362
598
|
function scheduleRetry(fn, options) {
|
|
363
|
-
throwIfDuringRender();
|
|
364
|
-
const inst = getCurrentComponentInstance();
|
|
365
|
-
if (inst && inst.ssr) return { cancel: () => {
|
|
366
|
-
} };
|
|
367
599
|
const {
|
|
368
600
|
maxAttempts = 3,
|
|
369
601
|
delayMs = 100,
|
|
@@ -396,23 +628,9 @@ function scheduleRetry(fn, options) {
|
|
|
396
628
|
const cancel = () => {
|
|
397
629
|
cancelled = true;
|
|
398
630
|
};
|
|
399
|
-
if (inst) inst.cleanupFns.push(cancel);
|
|
400
631
|
return { cancel };
|
|
401
632
|
}
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
defer,
|
|
406
|
-
idle,
|
|
407
|
-
once,
|
|
408
|
-
raf,
|
|
409
|
-
rafEvent,
|
|
410
|
-
retry,
|
|
411
|
-
scheduleIdle,
|
|
412
|
-
scheduleRetry,
|
|
413
|
-
scheduleTimeout,
|
|
414
|
-
throttle,
|
|
415
|
-
throttleEvent,
|
|
416
|
-
timeout
|
|
417
|
-
};
|
|
633
|
+
|
|
634
|
+
export { debounce, debounceEvent, defer, idle, once, raf, rafEvent, retry, scheduleIdle, scheduleRetry, scheduleTimeout, throttle, throttleEvent, timeout };
|
|
635
|
+
//# sourceMappingURL=index.js.map
|
|
418
636
|
//# sourceMappingURL=index.js.map
|
package/dist/fx/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/fx/timing.ts","../../src/fx/noop.ts","../../src/fx/fx.ts"],"sourcesContent":["/**\n * Timing utilities — pure helpers for common async patterns\n * No framework coupling. No lifecycle awareness.\n */\n\nexport interface DebounceOptions {\n leading?: boolean;\n trailing?: boolean;\n}\n\nexport interface ThrottleOptions {\n leading?: boolean;\n trailing?: boolean;\n}\n\nexport interface RetryOptions {\n maxAttempts?: number;\n delayMs?: number;\n backoff?: (attemptIndex: number) => number;\n}\n\n/**\n * Debounce — delay execution, coalesce rapid calls\n *\n * Useful for: text input, resize, autosave\n *\n * @param fn Function to debounce\n * @param ms Delay in milliseconds\n * @param options trailing (default true), leading\n * @returns Debounced function with cancel() method\n *\n * @example\n * ```ts\n * const save = debounce((text) => api.save(text), 500);\n * input.addEventListener('input', (e) => save(e.target.value));\n * save.cancel(); // stop any pending execution\n * ```\n */\nexport function debounce<T extends (...args: unknown[]) => unknown>(\n fn: T,\n ms: number,\n options?: DebounceOptions\n): T & { cancel(): void } {\n let timeoutId: NodeJS.Timeout | null = null;\n const { leading = false, trailing = true } = options || {};\n let lastArgs: unknown[] | null = null;\n let lastThis: unknown = null;\n let lastCallTime = 0;\n\n const debounced = function (this: unknown, ...args: unknown[]) {\n const callTime = Date.now();\n lastArgs = args;\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n lastThis = this;\n\n if (timeoutId !== null) {\n clearTimeout(timeoutId);\n }\n\n if (leading && callTime - lastCallTime >= ms) {\n fn.apply(this, args);\n lastCallTime = callTime;\n }\n\n if (trailing) {\n timeoutId = setTimeout(() => {\n fn.apply(lastThis, lastArgs!);\n timeoutId = null;\n lastCallTime = Date.now();\n }, ms);\n }\n };\n\n debounced.cancel = () => {\n if (timeoutId !== null) {\n clearTimeout(timeoutId);\n timeoutId = null;\n }\n };\n\n return debounced as T & { cancel(): void };\n}\n\n/**\n * Throttle — rate-limit execution, keep first/last\n *\n * Useful for: scroll, mouse move, high-frequency events\n *\n * @param fn Function to throttle\n * @param ms Minimum interval between calls in milliseconds\n * @param options leading (default true), trailing (default true)\n * @returns Throttled function with cancel() method\n *\n * @example\n * ```ts\n * const handleScroll = throttle(updateUI, 100);\n * window.addEventListener('scroll', handleScroll);\n * handleScroll.cancel();\n * ```\n */\nexport function throttle<T extends (...args: unknown[]) => unknown>(\n fn: T,\n ms: number,\n options?: ThrottleOptions\n): T & { cancel(): void } {\n let lastCallTime = 0;\n let timeoutId: NodeJS.Timeout | null = null;\n const { leading = true, trailing = true } = options || {};\n let lastArgs: unknown[] | null = null;\n let lastThis: unknown = null;\n\n const throttled = function (this: unknown, ...args: unknown[]) {\n const callTime = Date.now();\n lastArgs = args;\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n lastThis = this;\n\n if (leading && callTime - lastCallTime >= ms) {\n fn.apply(this, args);\n lastCallTime = callTime;\n if (timeoutId !== null) {\n clearTimeout(timeoutId);\n timeoutId = null;\n }\n } else if (!leading && lastCallTime === 0) {\n lastCallTime = callTime;\n }\n\n if (trailing && timeoutId === null) {\n timeoutId = setTimeout(\n () => {\n fn.apply(lastThis, lastArgs!);\n lastCallTime = Date.now();\n timeoutId = null;\n },\n ms - (callTime - lastCallTime)\n );\n }\n };\n\n throttled.cancel = () => {\n if (timeoutId !== null) {\n clearTimeout(timeoutId);\n timeoutId = null;\n }\n };\n\n return throttled as T & { cancel(): void };\n}\n\n/**\n * Once — guard against double execution\n *\n * Useful for: init logic, event safety\n *\n * @param fn Function to call at most once\n * @returns Function that executes fn only on first call\n *\n * @example\n * ```ts\n * const init = once(setup);\n * init(); // runs\n * init(); // does nothing\n * init(); // does nothing\n * ```\n */\nexport function once<T extends (...args: unknown[]) => unknown>(fn: T): T {\n let called = false;\n let result: unknown;\n\n return ((...args: unknown[]) => {\n if (!called) {\n called = true;\n result = fn(...args);\n }\n return result;\n }) as T;\n}\n\n/**\n * Defer — schedule on microtask queue\n *\n * Useful for: run-after-current-stack logic\n * More reliable than setTimeout(..., 0)\n *\n * @param fn Function to defer\n *\n * @example\n * ```ts\n * defer(() => update()); // runs after current stack, before next macrotask\n * ```\n */\nexport function defer(fn: () => void): void {\n Promise.resolve().then(fn);\n}\n\n/**\n * RAF — coalesce multiple updates into single frame\n *\n * Useful for: animation, layout work, render updates\n *\n * @param fn Function to schedule on next animation frame\n * @returns Function that schedules fn on requestAnimationFrame\n *\n * @example\n * ```ts\n * const update = raf(render);\n * update(); // schedules on next frame\n * update(); // same frame, no duplicate\n * ```\n */\nexport function raf<T extends (...args: unknown[]) => unknown>(fn: T): T {\n let frameId: number | null = null;\n let lastArgs: unknown[] | null = null;\n let lastThis: unknown = null;\n\n return function (this: unknown, ...args: unknown[]) {\n lastArgs = args;\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n lastThis = this;\n\n if (frameId === null) {\n frameId = requestAnimationFrame(() => {\n fn.apply(lastThis, lastArgs!);\n frameId = null;\n });\n }\n } as T;\n}\n\n/**\n * Idle — schedule low-priority work\n *\n * Useful for: background prep, non-urgent updates\n * Falls back to setTimeout if requestIdleCallback unavailable\n *\n * @param fn Function to call when idle\n * @param options timeout for fallback\n *\n * @example\n * ```ts\n * idle(() => prefetchData());\n * ```\n */\nexport function idle(fn: () => void, options?: { timeout?: number }): void {\n if (typeof requestIdleCallback !== 'undefined') {\n requestIdleCallback(fn, options ? { timeout: options.timeout } : undefined);\n } else {\n // Fallback: defer to microtask, then use setTimeout\n Promise.resolve().then(() => {\n setTimeout(fn, 0);\n });\n }\n}\n\n/**\n * Timeout — Promise-based delay\n *\n * Useful for: readable async code, waiting between retries\n *\n * @param ms Milliseconds to wait\n * @returns Promise that resolves after delay\n *\n * @example\n * ```ts\n * await timeout(300);\n * console.log('300ms later');\n * ```\n */\nexport function timeout(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/**\n * Retry — attempt function with backoff\n *\n * Useful for: network calls, transient failures\n *\n * @param fn Async function to retry\n * @param options maxAttempts, delayMs, backoff function\n * @returns Promise with final result or error\n *\n * @example\n * ```ts\n * const data = await retry(() => fetch(url), {\n * maxAttempts: 3,\n * delayMs: 100,\n * });\n * ```\n */\nexport async function retry<T>(\n fn: () => Promise<T>,\n options?: RetryOptions\n): Promise<T> {\n const {\n maxAttempts = 3,\n delayMs = 100,\n backoff = (i: number) => delayMs * Math.pow(2, i),\n } = options || {};\n\n let lastError: Error | null = null;\n\n for (let attempt = 0; attempt < maxAttempts; attempt++) {\n try {\n return await fn();\n } catch (error) {\n lastError = error as Error;\n if (attempt < maxAttempts - 1) {\n const delay = backoff(attempt);\n await timeout(delay);\n }\n }\n }\n\n throw lastError || new Error('Retry failed');\n}\n","// Lightweight shared no-op helpers to avoid double-casts and duplicated definitions\n\nexport const noop: () => void = () => {};\n\nexport const noopEventListener: EventListener & { cancel(): void } =\n Object.assign((_ev?: Event) => {}, { cancel() {} });\n\nexport const noopEventListenerWithFlush: EventListener & {\n cancel(): void;\n flush(): void;\n} = Object.assign((_ev?: Event) => {}, { cancel() {}, flush() {} });\n\nexport const noopCancel: { cancel(): void } = { cancel() {} };\n","import { globalScheduler } from '../runtime/scheduler';\nimport { getCurrentComponentInstance } from '../runtime/component';\nimport { logger } from '../dev/logger';\nimport { noopEventListener, noopEventListenerWithFlush } from './noop';\n\nexport type CancelFn = () => void;\n\n// Platform-specific timer handle types\ntype TimeoutHandle = ReturnType<typeof setTimeout> | null;\n// rAF may fall back to setTimeout in some environments/tests, include both\ntype RafHandle =\n | ReturnType<typeof requestAnimationFrame>\n | ReturnType<typeof setTimeout>\n | null;\n// requestIdleCallback may be unavailable; allow setTimeout fallback handle\ntype IdleHandle =\n | ReturnType<typeof requestIdleCallback>\n | ReturnType<typeof setTimeout>\n | null;\n\nfunction throwIfDuringRender(): void {\n const inst = getCurrentComponentInstance();\n if (inst !== null) {\n throw new Error(\n '[Askr] calling FX handler during render is not allowed. Move calls to event handlers or effects.'\n );\n }\n}\n\n/**\n * Helper: schedule a user callback through the global scheduler\n */\nfunction enqueueUserCallback(fn: () => void) {\n globalScheduler.enqueue(() => {\n try {\n fn();\n } catch (err) {\n // Keep behavior consistent with other scheduler-queued work\n logger.error('[Askr] FX handler error:', err);\n }\n });\n}\n\n// ---------- Event handlers ----------\n\nexport function debounceEvent(\n ms: number,\n handler: EventListener,\n options?: { leading?: boolean; trailing?: boolean }\n): EventListener & { cancel(): void; flush(): void } {\n const { leading = false, trailing = true } = options || {};\n\n const inst = getCurrentComponentInstance();\n // On SSR, event handlers are inert\n if (inst && inst.ssr) {\n return noopEventListenerWithFlush;\n }\n\n let timeoutId: TimeoutHandle = null;\n let lastEvent: Event | null = null;\n let lastCallTime = 0;\n\n const debounced = function (this: unknown, ev: Event) {\n // Disallow using returned handler during render\n throwIfDuringRender();\n\n const now = Date.now();\n lastEvent = ev;\n\n if (timeoutId !== null) {\n clearTimeout(timeoutId);\n timeoutId = null;\n }\n\n if (leading && now - lastCallTime >= ms) {\n enqueueUserCallback(() => handler.call(null, ev));\n lastCallTime = now;\n }\n\n if (trailing) {\n timeoutId = setTimeout(() => {\n // Schedule through scheduler\n if (lastEvent) {\n enqueueUserCallback(() => handler.call(null, lastEvent!));\n }\n timeoutId = null;\n lastCallTime = Date.now();\n }, ms);\n }\n } as EventListener & { cancel(): void; flush(): void };\n\n debounced.cancel = () => {\n if (timeoutId !== null) {\n clearTimeout(timeoutId);\n timeoutId = null;\n }\n lastEvent = null;\n };\n\n debounced.flush = () => {\n if (timeoutId !== null) {\n clearTimeout(timeoutId);\n const ev = lastEvent;\n lastEvent = null;\n timeoutId = null;\n if (ev) enqueueUserCallback(() => handler.call(null, ev));\n }\n };\n\n // Auto-cleanup on component unmount\n if (inst) {\n inst.cleanupFns.push(() => {\n debounced.cancel();\n });\n }\n\n return debounced;\n}\n\nexport function throttleEvent(\n ms: number,\n handler: EventListener,\n options?: { leading?: boolean; trailing?: boolean }\n): EventListener & { cancel(): void } {\n const { leading = true, trailing = true } = options || {};\n\n const inst = getCurrentComponentInstance();\n if (inst && inst.ssr) {\n return noopEventListener;\n }\n\n let lastCallTime = 0;\n let timeoutId: TimeoutHandle = null;\n let lastEvent: Event | null = null;\n\n const throttled = function (this: unknown, ev: Event) {\n throwIfDuringRender();\n\n const now = Date.now();\n lastEvent = ev;\n\n if (leading && now - lastCallTime >= ms) {\n enqueueUserCallback(() => handler.call(null, ev));\n lastCallTime = now;\n if (timeoutId !== null) {\n clearTimeout(timeoutId);\n timeoutId = null;\n }\n } else if (!leading && lastCallTime === 0) {\n lastCallTime = now;\n }\n\n if (trailing && timeoutId === null) {\n const wait = ms - (now - lastCallTime);\n timeoutId = setTimeout(\n () => {\n if (lastEvent)\n enqueueUserCallback(() => handler.call(null, lastEvent!));\n lastCallTime = Date.now();\n timeoutId = null;\n },\n Math.max(0, wait)\n );\n }\n } as EventListener & { cancel(): void };\n\n throttled.cancel = () => {\n if (timeoutId !== null) {\n clearTimeout(timeoutId);\n timeoutId = null;\n }\n lastEvent = null;\n };\n\n if (inst) {\n inst.cleanupFns.push(() => throttled.cancel());\n }\n\n return throttled;\n}\n\nexport function rafEvent(\n handler: EventListener\n): EventListener & { cancel(): void } {\n const inst = getCurrentComponentInstance();\n if (inst && inst.ssr) {\n return noopEventListener;\n }\n\n let frameId: RafHandle = null;\n let lastEvent: Event | null = null;\n\n const scheduleFrame = () => {\n const rAF =\n typeof requestAnimationFrame !== 'undefined'\n ? requestAnimationFrame\n : (cb: FrameRequestCallback) => setTimeout(() => cb(Date.now()), 16);\n\n frameId = rAF(() => {\n frameId = null;\n if (lastEvent) {\n const ev = lastEvent;\n lastEvent = null;\n enqueueUserCallback(() => handler.call(null, ev));\n }\n });\n };\n\n const fn = function (this: unknown, ev: Event) {\n throwIfDuringRender();\n lastEvent = ev;\n if (frameId === null) scheduleFrame();\n } as EventListener & { cancel(): void };\n\n fn.cancel = () => {\n if (frameId !== null) {\n // If frameId is numeric and cancelAnimationFrame is available, use it;\n // otherwise fall back to clearTimeout for the setTimeout fallback.\n if (\n typeof cancelAnimationFrame !== 'undefined' &&\n typeof frameId === 'number'\n ) {\n cancelAnimationFrame(frameId);\n } else {\n clearTimeout(frameId as ReturnType<typeof setTimeout>);\n }\n frameId = null;\n }\n lastEvent = null;\n };\n\n if (inst) inst.cleanupFns.push(() => fn.cancel());\n\n return fn;\n}\n\n// ---------- Scheduled work ----------\n\nexport function scheduleTimeout(ms: number, fn: () => void): CancelFn {\n throwIfDuringRender();\n const inst = getCurrentComponentInstance();\n if (inst && inst.ssr) {\n return () => {};\n }\n\n let id: TimeoutHandle = setTimeout(() => {\n id = null;\n enqueueUserCallback(fn);\n }, ms);\n\n const cancel = () => {\n if (id !== null) {\n clearTimeout(id);\n id = null;\n }\n };\n\n if (inst) inst.cleanupFns.push(cancel);\n return cancel;\n}\n\nexport function scheduleIdle(\n fn: () => void,\n options?: { timeout?: number }\n): CancelFn {\n throwIfDuringRender();\n const inst = getCurrentComponentInstance();\n if (inst && inst.ssr) return () => {};\n\n let id: IdleHandle = null;\n let usingRIC = false;\n\n if (typeof requestIdleCallback !== 'undefined') {\n usingRIC = true;\n id = requestIdleCallback(() => {\n id = null;\n enqueueUserCallback(fn);\n }, options);\n } else {\n // Fallback: schedule on next macrotask\n id = setTimeout(() => {\n id = null;\n enqueueUserCallback(fn);\n }, 0);\n }\n\n const cancel = () => {\n if (id !== null) {\n // If using requestIdleCallback and available, call cancelIdleCallback for numeric ids.\n if (\n usingRIC &&\n typeof cancelIdleCallback !== 'undefined' &&\n typeof id === 'number'\n ) {\n cancelIdleCallback(id);\n } else {\n clearTimeout(id as ReturnType<typeof setTimeout>);\n }\n id = null;\n }\n };\n\n if (inst) inst.cleanupFns.push(cancel);\n return cancel;\n}\n\nexport interface RetryOptions {\n maxAttempts?: number;\n delayMs?: number;\n backoff?: (attemptIndex: number) => number;\n}\n\nexport function scheduleRetry<T>(\n fn: () => Promise<T>,\n options?: RetryOptions\n): { cancel(): void } {\n throwIfDuringRender();\n const inst = getCurrentComponentInstance();\n if (inst && inst.ssr) return { cancel: () => {} };\n\n const {\n maxAttempts = 3,\n delayMs = 100,\n backoff = (i: number) => delayMs * Math.pow(2, i),\n } = options || {};\n\n let cancelled = false;\n\n const attempt = (index: number) => {\n if (cancelled) return;\n // Run user fn inside scheduler\n globalScheduler.enqueue(() => {\n if (cancelled) return;\n // Call fn (it may be async)\n const p = fn();\n p.then(\n () => {\n // Completed successfully\n },\n () => {\n if (cancelled) return;\n if (index + 1 < maxAttempts) {\n const delay = backoff(index);\n // Schedule next attempt via setTimeout so it gets enqueued through scheduleTimeout\n setTimeout(() => {\n attempt(index + 1);\n }, delay);\n }\n }\n ).catch((e) => {\n logger.error('[Askr] scheduleRetry error:', e);\n });\n });\n };\n\n // Start first attempt\n attempt(0);\n\n const cancel = () => {\n cancelled = true;\n };\n\n if (inst) inst.cleanupFns.push(cancel);\n return { cancel };\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/fx/timing.ts","../../src/dev/invariant.ts","../../src/dev/logger.ts","../../src/runtime/scheduler.ts","../../src/fx/noop.ts","../../src/fx/fx.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Timing utilities — pure helpers for common async patterns\n * No framework coupling. No lifecycle awareness.\n */\n\nexport interface DebounceOptions {\n leading?: boolean;\n trailing?: boolean;\n}\n\nexport interface ThrottleOptions {\n leading?: boolean;\n trailing?: boolean;\n}\n\nexport interface RetryOptions {\n maxAttempts?: number;\n delayMs?: number;\n backoff?: (attemptIndex: number) => number;\n}\n\n/**\n * Debounce — delay execution, coalesce rapid calls\n *\n * Useful for: text input, resize, autosave\n *\n * @param fn Function to debounce\n * @param ms Delay in milliseconds\n * @param options trailing (default true), leading\n * @returns Debounced function with cancel() method\n *\n * @example\n * ```ts\n * const save = debounce((text) => api.save(text), 500);\n * input.addEventListener('input', (e) => save(e.target.value));\n * save.cancel(); // stop any pending execution\n * ```\n */\nexport function debounce<T extends (...args: unknown[]) => unknown>(\n fn: T,\n ms: number,\n options?: DebounceOptions\n): T & { cancel(): void } {\n let timeoutId: NodeJS.Timeout | null = null;\n const { leading = false, trailing = true } = options || {};\n let lastArgs: unknown[] | null = null;\n let lastThis: unknown = null;\n let lastCallTime = 0;\n\n const debounced = function (this: unknown, ...args: unknown[]) {\n const callTime = Date.now();\n lastArgs = args;\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n lastThis = this;\n\n if (timeoutId !== null) {\n clearTimeout(timeoutId);\n }\n\n if (leading && callTime - lastCallTime >= ms) {\n fn.apply(this, args);\n lastCallTime = callTime;\n }\n\n if (trailing) {\n timeoutId = setTimeout(() => {\n fn.apply(lastThis, lastArgs!);\n timeoutId = null;\n lastCallTime = Date.now();\n }, ms);\n }\n };\n\n debounced.cancel = () => {\n if (timeoutId !== null) {\n clearTimeout(timeoutId);\n timeoutId = null;\n }\n };\n\n return debounced as T & { cancel(): void };\n}\n\n/**\n * Throttle — rate-limit execution, keep first/last\n *\n * Useful for: scroll, mouse move, high-frequency events\n *\n * @param fn Function to throttle\n * @param ms Minimum interval between calls in milliseconds\n * @param options leading (default true), trailing (default true)\n * @returns Throttled function with cancel() method\n *\n * @example\n * ```ts\n * const handleScroll = throttle(updateUI, 100);\n * window.addEventListener('scroll', handleScroll);\n * handleScroll.cancel();\n * ```\n */\nexport function throttle<T extends (...args: unknown[]) => unknown>(\n fn: T,\n ms: number,\n options?: ThrottleOptions\n): T & { cancel(): void } {\n let lastCallTime = 0;\n let timeoutId: NodeJS.Timeout | null = null;\n const { leading = true, trailing = true } = options || {};\n let lastArgs: unknown[] | null = null;\n let lastThis: unknown = null;\n\n const throttled = function (this: unknown, ...args: unknown[]) {\n const callTime = Date.now();\n lastArgs = args;\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n lastThis = this;\n\n if (leading && callTime - lastCallTime >= ms) {\n fn.apply(this, args);\n lastCallTime = callTime;\n if (timeoutId !== null) {\n clearTimeout(timeoutId);\n timeoutId = null;\n }\n } else if (!leading && lastCallTime === 0) {\n lastCallTime = callTime;\n }\n\n if (trailing && timeoutId === null) {\n timeoutId = setTimeout(\n () => {\n fn.apply(lastThis, lastArgs!);\n lastCallTime = Date.now();\n timeoutId = null;\n },\n ms - (callTime - lastCallTime)\n );\n }\n };\n\n throttled.cancel = () => {\n if (timeoutId !== null) {\n clearTimeout(timeoutId);\n timeoutId = null;\n }\n };\n\n return throttled as T & { cancel(): void };\n}\n\n/**\n * Once — guard against double execution\n *\n * Useful for: init logic, event safety\n *\n * @param fn Function to call at most once\n * @returns Function that executes fn only on first call\n *\n * @example\n * ```ts\n * const init = once(setup);\n * init(); // runs\n * init(); // does nothing\n * init(); // does nothing\n * ```\n */\nexport function once<T extends (...args: unknown[]) => unknown>(fn: T): T {\n let called = false;\n let result: unknown;\n\n return ((...args: unknown[]) => {\n if (!called) {\n called = true;\n result = fn(...args);\n }\n return result;\n }) as T;\n}\n\n/**\n * Defer — schedule on microtask queue\n *\n * Useful for: run-after-current-stack logic\n * More reliable than setTimeout(..., 0)\n *\n * @param fn Function to defer\n *\n * @example\n * ```ts\n * defer(() => update()); // runs after current stack, before next macrotask\n * ```\n */\nexport function defer(fn: () => void): void {\n Promise.resolve().then(fn);\n}\n\n/**\n * RAF — coalesce multiple updates into single frame\n *\n * Useful for: animation, layout work, render updates\n *\n * @param fn Function to schedule on next animation frame\n * @returns Function that schedules fn on requestAnimationFrame\n *\n * @example\n * ```ts\n * const update = raf(render);\n * update(); // schedules on next frame\n * update(); // same frame, no duplicate\n * ```\n */\nexport function raf<T extends (...args: unknown[]) => unknown>(fn: T): T {\n let frameId: number | null = null;\n let lastArgs: unknown[] | null = null;\n let lastThis: unknown = null;\n\n return function (this: unknown, ...args: unknown[]) {\n lastArgs = args;\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n lastThis = this;\n\n if (frameId === null) {\n frameId = requestAnimationFrame(() => {\n fn.apply(lastThis, lastArgs!);\n frameId = null;\n });\n }\n } as T;\n}\n\n/**\n * Idle — schedule low-priority work\n *\n * Useful for: background prep, non-urgent updates\n * Falls back to setTimeout if requestIdleCallback unavailable\n *\n * @param fn Function to call when idle\n * @param options timeout for fallback\n *\n * @example\n * ```ts\n * idle(() => prefetchData());\n * ```\n */\nexport function idle(fn: () => void, options?: { timeout?: number }): void {\n if (typeof requestIdleCallback !== 'undefined') {\n requestIdleCallback(fn, options ? { timeout: options.timeout } : undefined);\n } else {\n // Fallback: defer to microtask, then use setTimeout\n Promise.resolve().then(() => {\n setTimeout(fn, 0);\n });\n }\n}\n\n/**\n * Timeout — Promise-based delay\n *\n * Useful for: readable async code, waiting between retries\n *\n * @param ms Milliseconds to wait\n * @returns Promise that resolves after delay\n *\n * @example\n * ```ts\n * await timeout(300);\n * console.log('300ms later');\n * ```\n */\nexport function timeout(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/**\n * Retry — attempt function with backoff\n *\n * Useful for: network calls, transient failures\n *\n * @param fn Async function to retry\n * @param options maxAttempts, delayMs, backoff function\n * @returns Promise with final result or error\n *\n * @example\n * ```ts\n * const data = await retry(() => fetch(url), {\n * maxAttempts: 3,\n * delayMs: 100,\n * });\n * ```\n */\nexport async function retry<T>(\n fn: () => Promise<T>,\n options?: RetryOptions\n): Promise<T> {\n const {\n maxAttempts = 3,\n delayMs = 100,\n backoff = (i: number) => delayMs * Math.pow(2, i),\n } = options || {};\n\n let lastError: Error | null = null;\n\n for (let attempt = 0; attempt < maxAttempts; attempt++) {\n try {\n return await fn();\n } catch (error) {\n lastError = error as Error;\n if (attempt < maxAttempts - 1) {\n const delay = backoff(attempt);\n await timeout(delay);\n }\n }\n }\n\n throw lastError || new Error('Retry failed');\n}\n","/**\n * Invariant assertion utilities for correctness checking\n * Production-safe: invariants are enforced at build-time or with minimal overhead\n *\n * Core principle: fail fast when invariants are violated\n * All functions throw descriptive errors for debugging\n */\n\n/**\n * Assert a condition; throw with context if false\n * @internal\n */\nexport function invariant(\n condition: boolean,\n message: string,\n context?: Record<string, unknown>\n): asserts condition {\n if (!condition) {\n const contextStr = context ? '\\n' + JSON.stringify(context, null, 2) : '';\n throw new Error(`[Askr Invariant] ${message}${contextStr}`);\n }\n}\n\n/**\n * Assert object property exists and has correct type\n * @internal\n */\nexport function assertProperty<T extends object, K extends keyof T>(\n obj: T,\n prop: K,\n expectedType?: string\n): asserts obj is T & Required<Pick<T, K>> {\n invariant(prop in obj, `Object missing required property '${String(prop)}'`, {\n object: obj,\n });\n\n if (expectedType) {\n const actualType = typeof obj[prop];\n invariant(\n actualType === expectedType,\n `Property '${String(prop)}' has type '${actualType}', expected '${expectedType}'`,\n { value: obj[prop], expectedType }\n );\n }\n}\n\n/**\n * Assert a reference is not null/undefined\n * @internal\n */\nexport function assertDefined<T>(\n value: T | null | undefined,\n message: string\n): asserts value is T {\n invariant(value !== null && value !== undefined, message, { value });\n}\n\n/**\n * Assert a task runs exactly once atomically\n * Useful for verifying lifecycle events fire precisely when expected\n * @internal\n */\nexport class Once {\n private called = false;\n private calledAt: number | null = null;\n readonly name: string;\n\n constructor(name: string) {\n this.name = name;\n }\n\n check(): boolean {\n return this.called;\n }\n\n mark(): void {\n invariant(\n !this.called,\n `${this.name} called multiple times (previously at ${this.calledAt}ms)`,\n { now: Date.now() }\n );\n this.called = true;\n this.calledAt = Date.now();\n }\n\n reset(): void {\n this.called = false;\n this.calledAt = null;\n }\n}\n\n/**\n * Assert a value falls in an enumerated set\n * @internal\n */\nexport function assertEnum<T extends readonly unknown[]>(\n value: unknown,\n allowedValues: T,\n fieldName: string\n): asserts value is T[number] {\n invariant(\n allowedValues.includes(value),\n `${fieldName} must be one of [${allowedValues.join(', ')}], got ${JSON.stringify(value)}`,\n { value, allowed: allowedValues }\n );\n}\n\n/**\n * Assert execution context (scheduler, component, etc)\n * @internal\n */\nexport function assertContext(\n actual: unknown,\n expected: unknown,\n contextName: string\n): asserts actual is typeof expected {\n invariant(\n actual === expected,\n `Invalid ${contextName} context. Expected ${expected}, got ${actual}`,\n { expected, actual }\n );\n}\n\n/**\n * Assert scheduling precondition (not reentering, not during render, etc)\n * @internal\n */\nexport function assertSchedulingPrecondition(\n condition: boolean,\n violationMessage: string\n): asserts condition {\n invariant(condition, `[Scheduler Precondition] ${violationMessage}`);\n}\n\n/**\n * Assert state precondition\n * @internal\n */\nexport function assertStatePrecondition(\n condition: boolean,\n violationMessage: string\n): asserts condition {\n invariant(condition, `[State Precondition] ${violationMessage}`);\n}\n\n/**\n * Verify AbortController lifecycle\n * @internal\n */\nexport function assertAbortControllerState(\n signal: AbortSignal,\n expectedAborted: boolean,\n context: string\n): void {\n invariant(\n signal.aborted === expectedAborted,\n `AbortSignal ${expectedAborted ? 'should be' : 'should not be'} aborted in ${context}`,\n { actual: signal.aborted, expected: expectedAborted }\n );\n}\n\n/**\n * Guard: throw if callback is null when it shouldn't be\n * Used for notifyUpdate, event handlers, etc.\n * @internal\n */\nexport function assertCallbackAvailable<\n T extends (...args: unknown[]) => unknown,\n>(callback: T | null | undefined, callbackName: string): asserts callback is T {\n invariant(\n callback !== null && callback !== undefined,\n `${callbackName} callback is required but not available`,\n { callback }\n );\n}\n\n/**\n * Verify evaluation generation prevents stale evaluations\n * @internal\n */\nexport function assertEvaluationGeneration(\n current: number,\n latest: number,\n context: string\n): void {\n invariant(\n current === latest,\n `Stale evaluation generation in ${context}: current ${current}, latest ${latest}`,\n { current, latest }\n );\n}\n\n/**\n * Verify mounted flag state\n * @internal\n */\nexport function assertMountedState(\n mounted: boolean,\n expectedMounted: boolean,\n context: string\n): void {\n invariant(\n mounted === expectedMounted,\n `Invalid mounted state in ${context}: expected ${expectedMounted}, got ${mounted}`,\n { mounted, expected: expectedMounted }\n );\n}\n\n/**\n * Verify no null target when rendering\n * @internal\n */\nexport function assertRenderTarget(\n target: Element | null,\n context: string\n): asserts target is Element {\n invariant(target !== null, `Cannot render in ${context}: target is null`, {\n target,\n });\n}\n","/**\n * Centralized logger interface\n * - Keeps production builds silent for debug/warn/info messages\n * - Ensures consistent behavior across the codebase\n * - Protects against missing `console` in some environments\n */\n\nfunction callConsole(method: string, args: unknown[]): void {\n const c = typeof console !== 'undefined' ? (console as unknown) : undefined;\n if (!c) return;\n const fn = (c as Record<string, unknown>)[method];\n if (typeof fn === 'function') {\n try {\n (fn as (...a: unknown[]) => unknown).apply(console, args as unknown[]);\n } catch {\n // ignore logging errors\n }\n }\n}\n\nexport const logger = {\n debug: (...args: unknown[]) => {\n if (process.env.NODE_ENV === 'production') return;\n callConsole('debug', args);\n },\n\n info: (...args: unknown[]) => {\n if (process.env.NODE_ENV === 'production') return;\n callConsole('info', args);\n },\n\n warn: (...args: unknown[]) => {\n if (process.env.NODE_ENV === 'production') return;\n callConsole('warn', args);\n },\n\n error: (...args: unknown[]) => {\n callConsole('error', args);\n },\n};\n","/**\n * Serialized update scheduler — safer design (no inline execution, explicit flush)\n *\n * Key ideas:\n * - Never execute a task inline from `enqueue`.\n * - `flush()` is explicit and non-reentrant.\n * - `runWithSyncProgress()` allows enqueues temporarily but does not run tasks\n * inline; it runs `fn` and then does an explicit `flush()`.\n * - `waitForFlush()` is race-free with a monotonic `flushVersion`.\n */\n\nimport { assertSchedulingPrecondition, invariant } from '../dev/invariant';\nimport { logger } from '../dev/logger';\n\nconst MAX_FLUSH_DEPTH = 50;\n\ntype Task = () => void;\n\nfunction isBulkCommitActive(): boolean {\n try {\n const fb = (\n globalThis as {\n __ASKR_FASTLANE?: { isBulkCommitActive?: () => boolean };\n }\n ).__ASKR_FASTLANE;\n return typeof fb?.isBulkCommitActive === 'function'\n ? !!fb.isBulkCommitActive()\n : false;\n } catch (e) {\n void e;\n return false;\n }\n}\n\nexport class Scheduler {\n private q: Task[] = [];\n private head = 0;\n\n private running = false;\n private inHandler = false;\n private depth = 0;\n private executionDepth = 0; // for compat with existing diagnostics\n\n // Monotonic flush version increments at end of each flush\n private flushVersion = 0;\n\n // Best-effort microtask kick scheduling\n private kickScheduled = false;\n\n // Escape hatch flag for runWithSyncProgress\n private allowSyncProgress = false;\n\n // Waiters waiting for flushVersion >= target\n private waiters: Array<{\n target: number;\n resolve: () => void;\n reject: (err: unknown) => void;\n timer?: ReturnType<typeof setTimeout>;\n }> = [];\n\n // Keep a lightweight taskCount for compatibility/diagnostics\n private taskCount = 0;\n\n enqueue(task: Task): void {\n assertSchedulingPrecondition(\n typeof task === 'function',\n 'enqueue() requires a function'\n );\n\n // Strict rule: during bulk commit, only allow enqueues if runWithSyncProgress enabled\n if (isBulkCommitActive() && !this.allowSyncProgress) {\n if (process.env.NODE_ENV !== 'production') {\n throw new Error(\n '[Scheduler] enqueue() during bulk commit (not allowed)'\n );\n }\n return;\n }\n\n // Enqueue task and account counts\n this.q.push(task);\n this.taskCount++;\n\n // Microtask kick: best-effort, but avoid if we are in handler or running or bulk commit\n if (\n !this.running &&\n !this.kickScheduled &&\n !this.inHandler &&\n !isBulkCommitActive()\n ) {\n this.kickScheduled = true;\n queueMicrotask(() => {\n this.kickScheduled = false;\n if (this.running) return;\n if (isBulkCommitActive()) return;\n try {\n this.flush();\n } catch (err) {\n setTimeout(() => {\n throw err;\n });\n }\n });\n }\n }\n\n flush(): void {\n invariant(\n !this.running,\n '[Scheduler] flush() called while already running'\n );\n\n // Dev-only guard: disallow flush during bulk commit unless allowed\n if (process.env.NODE_ENV !== 'production') {\n if (isBulkCommitActive() && !this.allowSyncProgress) {\n throw new Error(\n '[Scheduler] flush() started during bulk commit (not allowed)'\n );\n }\n }\n\n this.running = true;\n this.depth = 0;\n let fatal: unknown = null;\n\n try {\n while (this.head < this.q.length) {\n this.depth++;\n if (\n process.env.NODE_ENV !== 'production' &&\n this.depth > MAX_FLUSH_DEPTH\n ) {\n throw new Error(\n `[Scheduler] exceeded MAX_FLUSH_DEPTH (${MAX_FLUSH_DEPTH}). Likely infinite update loop.`\n );\n }\n\n const task = this.q[this.head++];\n try {\n this.executionDepth++;\n task();\n this.executionDepth--;\n } catch (err) {\n // ensure executionDepth stays balanced\n if (this.executionDepth > 0) this.executionDepth = 0;\n fatal = err;\n break;\n }\n\n // Account for executed task in taskCount\n if (this.taskCount > 0) this.taskCount--;\n }\n } finally {\n this.running = false;\n this.depth = 0;\n this.executionDepth = 0;\n\n // Compact queue\n if (this.head >= this.q.length) {\n this.q.length = 0;\n this.head = 0;\n } else if (this.head > 0) {\n const remaining = this.q.length - this.head;\n // HOT PATH: compact in-place to avoid slice() allocations (GC tail spikes)\n for (let i = 0; i < remaining; i++) {\n this.q[i] = this.q[this.head + i];\n }\n this.q.length = remaining;\n this.head = 0;\n }\n\n // Advance flush epoch and resolve waiters\n this.flushVersion++;\n this.resolveWaiters();\n }\n\n if (fatal) throw fatal;\n }\n\n runWithSyncProgress<T>(fn: () => T): T {\n const prev = this.allowSyncProgress;\n this.allowSyncProgress = true;\n\n const g = globalThis as {\n queueMicrotask?: (...args: unknown[]) => void;\n setTimeout?: (...args: unknown[]) => unknown;\n };\n const origQueueMicrotask = g.queueMicrotask;\n const origSetTimeout = g.setTimeout;\n\n if (process.env.NODE_ENV !== 'production') {\n g.queueMicrotask = () => {\n throw new Error(\n '[Scheduler] queueMicrotask not allowed during runWithSyncProgress'\n );\n };\n g.setTimeout = () => {\n throw new Error(\n '[Scheduler] setTimeout not allowed during runWithSyncProgress'\n );\n };\n }\n\n // Snapshot flushVersion so we can ensure we always complete an epoch\n const startVersion = this.flushVersion;\n\n try {\n const res = fn();\n\n // Flush deterministically if tasks were enqueued (and we're not already running)\n if (!this.running && this.q.length - this.head > 0) {\n this.flush();\n }\n\n if (process.env.NODE_ENV !== 'production') {\n if (this.q.length - this.head > 0) {\n throw new Error(\n '[Scheduler] tasks remain after runWithSyncProgress flush'\n );\n }\n }\n\n return res;\n } finally {\n // Restore guarded globals\n if (process.env.NODE_ENV !== 'production') {\n g.queueMicrotask = origQueueMicrotask;\n g.setTimeout = origSetTimeout;\n }\n\n // If no flush happened during the protected window, complete an epoch so\n // observers (tests) see progress even when fast-lane did synchronous work\n // without enqueuing tasks.\n try {\n if (this.flushVersion === startVersion) {\n this.flushVersion++;\n this.resolveWaiters();\n }\n } catch (e) {\n void e;\n }\n\n this.allowSyncProgress = prev;\n }\n }\n\n waitForFlush(targetVersion?: number, timeoutMs = 2000): Promise<void> {\n const target =\n typeof targetVersion === 'number' ? targetVersion : this.flushVersion + 1;\n if (this.flushVersion >= target) return Promise.resolve();\n\n return new Promise((resolve, reject) => {\n const timer = setTimeout(() => {\n const ns =\n (\n globalThis as unknown as Record<string, unknown> & {\n __ASKR__?: Record<string, unknown>;\n }\n ).__ASKR__ || {};\n const diag = {\n flushVersion: this.flushVersion,\n queueLen: this.q.length - this.head,\n running: this.running,\n inHandler: this.inHandler,\n bulk: isBulkCommitActive(),\n namespace: ns,\n };\n reject(\n new Error(\n `waitForFlush timeout ${timeoutMs}ms: ${JSON.stringify(diag)}`\n )\n );\n }, timeoutMs);\n\n this.waiters.push({ target, resolve, reject, timer });\n });\n }\n\n getState() {\n // Provide the compatibility shape expected by diagnostics/tests\n return {\n queueLength: this.q.length - this.head,\n running: this.running,\n depth: this.depth,\n executionDepth: this.executionDepth,\n taskCount: this.taskCount,\n flushVersion: this.flushVersion,\n // New fields for optional inspection\n inHandler: this.inHandler,\n allowSyncProgress: this.allowSyncProgress,\n };\n }\n\n setInHandler(v: boolean) {\n this.inHandler = v;\n }\n\n isInHandler(): boolean {\n return this.inHandler;\n }\n\n isExecuting(): boolean {\n return this.running || this.executionDepth > 0;\n }\n\n // Clear pending synchronous tasks (used by fastlane enter/exit)\n clearPendingSyncTasks(): number {\n const remaining = this.q.length - this.head;\n if (remaining <= 0) return 0;\n\n if (this.running) {\n this.q.length = this.head;\n this.taskCount = Math.max(0, this.taskCount - remaining);\n queueMicrotask(() => {\n try {\n this.flushVersion++;\n this.resolveWaiters();\n } catch (e) {\n void e;\n }\n });\n return remaining;\n }\n\n this.q.length = 0;\n this.head = 0;\n this.taskCount = Math.max(0, this.taskCount - remaining);\n this.flushVersion++;\n this.resolveWaiters();\n return remaining;\n }\n\n private resolveWaiters() {\n if (this.waiters.length === 0) return;\n const ready: Array<() => void> = [];\n const remaining: typeof this.waiters = [];\n\n for (const w of this.waiters) {\n if (this.flushVersion >= w.target) {\n if (w.timer) clearTimeout(w.timer);\n ready.push(w.resolve);\n } else {\n remaining.push(w);\n }\n }\n\n this.waiters = remaining;\n for (const r of ready) r();\n }\n}\n\nexport const globalScheduler = new Scheduler();\n\nexport function isSchedulerExecuting(): boolean {\n return globalScheduler.isExecuting();\n}\n\nexport function scheduleEventHandler(handler: EventListener): EventListener {\n return (event: Event) => {\n globalScheduler.setInHandler(true);\n try {\n handler.call(null, event);\n } catch (error) {\n logger.error('[Askr] Event handler error:', error);\n } finally {\n globalScheduler.setInHandler(false);\n // If the handler enqueued tasks while we disallowed microtask kicks,\n // ensure we schedule a microtask to flush them now that the handler\n // has completed. This avoids tests timing out waiting for flush.\n const state = globalScheduler.getState();\n if ((state.queueLength ?? 0) > 0 && !state.running) {\n queueMicrotask(() => {\n try {\n if (!globalScheduler.isExecuting()) globalScheduler.flush();\n } catch (err) {\n setTimeout(() => {\n throw err;\n });\n }\n });\n }\n }\n };\n}\n","// Lightweight shared no-op helpers to avoid double-casts and duplicated definitions\n\nexport const noop: () => void = () => {};\n\nexport const noopEventListener: EventListener & { cancel(): void } =\n Object.assign((_ev?: Event) => {}, { cancel() {} });\n\nexport const noopEventListenerWithFlush: EventListener & {\n cancel(): void;\n flush(): void;\n} = Object.assign((_ev?: Event) => {}, { cancel() {}, flush() {} });\n\nexport const noopCancel: { cancel(): void } = { cancel() {} };\n","import { globalScheduler } from '../runtime/scheduler';\nimport { getCurrentComponentInstance } from '../runtime/component';\nimport { logger } from '../dev/logger';\nimport { noopEventListener, noopEventListenerWithFlush } from './noop';\n\nexport type CancelFn = () => void;\n\n// Platform-specific timer handle types\ntype TimeoutHandle = ReturnType<typeof setTimeout> | null;\n// rAF may fall back to setTimeout in some environments/tests, include both\ntype RafHandle =\n | ReturnType<typeof requestAnimationFrame>\n | ReturnType<typeof setTimeout>\n | null;\n// requestIdleCallback may be unavailable; allow setTimeout fallback handle\ntype IdleHandle =\n | ReturnType<typeof requestIdleCallback>\n | ReturnType<typeof setTimeout>\n | null;\n\nfunction throwIfDuringRender(): void {\n const inst = getCurrentComponentInstance();\n if (inst !== null) {\n throw new Error(\n '[Askr] calling FX handler during render is not allowed. Move calls to event handlers or effects.'\n );\n }\n}\n\n/**\n * Helper: schedule a user callback through the global scheduler\n */\nfunction enqueueUserCallback(fn: () => void) {\n globalScheduler.enqueue(() => {\n try {\n fn();\n } catch (err) {\n // Keep behavior consistent with other scheduler-queued work\n logger.error('[Askr] FX handler error:', err);\n }\n });\n}\n\n// ---------- Event handlers ----------\n\nexport function debounceEvent(\n ms: number,\n handler: EventListener,\n options?: { leading?: boolean; trailing?: boolean }\n): EventListener & { cancel(): void; flush(): void } {\n const { leading = false, trailing = true } = options || {};\n\n const inst = getCurrentComponentInstance();\n // On SSR, event handlers are inert\n if (inst && inst.ssr) {\n return noopEventListenerWithFlush;\n }\n\n let timeoutId: TimeoutHandle = null;\n let lastEvent: Event | null = null;\n let lastCallTime = 0;\n\n const debounced = function (this: unknown, ev: Event) {\n // Disallow using returned handler during render\n throwIfDuringRender();\n\n const now = Date.now();\n lastEvent = ev;\n\n if (timeoutId !== null) {\n clearTimeout(timeoutId);\n timeoutId = null;\n }\n\n if (leading && now - lastCallTime >= ms) {\n enqueueUserCallback(() => handler.call(null, ev));\n lastCallTime = now;\n }\n\n if (trailing) {\n timeoutId = setTimeout(() => {\n // Schedule through scheduler\n if (lastEvent) {\n enqueueUserCallback(() => handler.call(null, lastEvent!));\n }\n timeoutId = null;\n lastCallTime = Date.now();\n }, ms);\n }\n } as EventListener & { cancel(): void; flush(): void };\n\n debounced.cancel = () => {\n if (timeoutId !== null) {\n clearTimeout(timeoutId);\n timeoutId = null;\n }\n lastEvent = null;\n };\n\n debounced.flush = () => {\n if (timeoutId !== null) {\n clearTimeout(timeoutId);\n const ev = lastEvent;\n lastEvent = null;\n timeoutId = null;\n if (ev) enqueueUserCallback(() => handler.call(null, ev));\n }\n };\n\n // Auto-cleanup on component unmount\n if (inst) {\n inst.cleanupFns.push(() => {\n debounced.cancel();\n });\n }\n\n return debounced;\n}\n\nexport function throttleEvent(\n ms: number,\n handler: EventListener,\n options?: { leading?: boolean; trailing?: boolean }\n): EventListener & { cancel(): void } {\n const { leading = true, trailing = true } = options || {};\n\n const inst = getCurrentComponentInstance();\n if (inst && inst.ssr) {\n return noopEventListener;\n }\n\n let lastCallTime = 0;\n let timeoutId: TimeoutHandle = null;\n let lastEvent: Event | null = null;\n\n const throttled = function (this: unknown, ev: Event) {\n throwIfDuringRender();\n\n const now = Date.now();\n lastEvent = ev;\n\n if (leading && now - lastCallTime >= ms) {\n enqueueUserCallback(() => handler.call(null, ev));\n lastCallTime = now;\n if (timeoutId !== null) {\n clearTimeout(timeoutId);\n timeoutId = null;\n }\n } else if (!leading && lastCallTime === 0) {\n lastCallTime = now;\n }\n\n if (trailing && timeoutId === null) {\n const wait = ms - (now - lastCallTime);\n timeoutId = setTimeout(\n () => {\n if (lastEvent)\n enqueueUserCallback(() => handler.call(null, lastEvent!));\n lastCallTime = Date.now();\n timeoutId = null;\n },\n Math.max(0, wait)\n );\n }\n } as EventListener & { cancel(): void };\n\n throttled.cancel = () => {\n if (timeoutId !== null) {\n clearTimeout(timeoutId);\n timeoutId = null;\n }\n lastEvent = null;\n };\n\n if (inst) {\n inst.cleanupFns.push(() => throttled.cancel());\n }\n\n return throttled;\n}\n\nexport function rafEvent(\n handler: EventListener\n): EventListener & { cancel(): void } {\n const inst = getCurrentComponentInstance();\n if (inst && inst.ssr) {\n return noopEventListener;\n }\n\n let frameId: RafHandle = null;\n let lastEvent: Event | null = null;\n\n const scheduleFrame = () => {\n const rAF =\n typeof requestAnimationFrame !== 'undefined'\n ? requestAnimationFrame\n : (cb: FrameRequestCallback) => setTimeout(() => cb(Date.now()), 16);\n\n frameId = rAF(() => {\n frameId = null;\n if (lastEvent) {\n const ev = lastEvent;\n lastEvent = null;\n enqueueUserCallback(() => handler.call(null, ev));\n }\n });\n };\n\n const fn = function (this: unknown, ev: Event) {\n throwIfDuringRender();\n lastEvent = ev;\n if (frameId === null) scheduleFrame();\n } as EventListener & { cancel(): void };\n\n fn.cancel = () => {\n if (frameId !== null) {\n // If frameId is numeric and cancelAnimationFrame is available, use it;\n // otherwise fall back to clearTimeout for the setTimeout fallback.\n if (\n typeof cancelAnimationFrame !== 'undefined' &&\n typeof frameId === 'number'\n ) {\n cancelAnimationFrame(frameId);\n } else {\n clearTimeout(frameId as ReturnType<typeof setTimeout>);\n }\n frameId = null;\n }\n lastEvent = null;\n };\n\n if (inst) inst.cleanupFns.push(() => fn.cancel());\n\n return fn;\n}\n\n// ---------- Scheduled work ----------\n\nexport function scheduleTimeout(ms: number, fn: () => void): CancelFn {\n throwIfDuringRender();\n const inst = getCurrentComponentInstance();\n if (inst && inst.ssr) {\n return () => {};\n }\n\n let id: TimeoutHandle = setTimeout(() => {\n id = null;\n enqueueUserCallback(fn);\n }, ms);\n\n const cancel = () => {\n if (id !== null) {\n clearTimeout(id);\n id = null;\n }\n };\n\n if (inst) inst.cleanupFns.push(cancel);\n return cancel;\n}\n\nexport function scheduleIdle(\n fn: () => void,\n options?: { timeout?: number }\n): CancelFn {\n throwIfDuringRender();\n const inst = getCurrentComponentInstance();\n if (inst && inst.ssr) return () => {};\n\n let id: IdleHandle = null;\n let usingRIC = false;\n\n if (typeof requestIdleCallback !== 'undefined') {\n usingRIC = true;\n id = requestIdleCallback(() => {\n id = null;\n enqueueUserCallback(fn);\n }, options);\n } else {\n // Fallback: schedule on next macrotask\n id = setTimeout(() => {\n id = null;\n enqueueUserCallback(fn);\n }, 0);\n }\n\n const cancel = () => {\n if (id !== null) {\n // If using requestIdleCallback and available, call cancelIdleCallback for numeric ids.\n if (\n usingRIC &&\n typeof cancelIdleCallback !== 'undefined' &&\n typeof id === 'number'\n ) {\n cancelIdleCallback(id);\n } else {\n clearTimeout(id as ReturnType<typeof setTimeout>);\n }\n id = null;\n }\n };\n\n if (inst) inst.cleanupFns.push(cancel);\n return cancel;\n}\n\nexport interface RetryOptions {\n maxAttempts?: number;\n delayMs?: number;\n backoff?: (attemptIndex: number) => number;\n}\n\nexport function scheduleRetry<T>(\n fn: () => Promise<T>,\n options?: RetryOptions\n): { cancel(): void } {\n throwIfDuringRender();\n const inst = getCurrentComponentInstance();\n if (inst && inst.ssr) return { cancel: () => {} };\n\n const {\n maxAttempts = 3,\n delayMs = 100,\n backoff = (i: number) => delayMs * Math.pow(2, i),\n } = options || {};\n\n let cancelled = false;\n\n const attempt = (index: number) => {\n if (cancelled) return;\n // Run user fn inside scheduler\n globalScheduler.enqueue(() => {\n if (cancelled) return;\n // Call fn (it may be async)\n const p = fn();\n p.then(\n () => {\n // Completed successfully\n },\n () => {\n if (cancelled) return;\n if (index + 1 < maxAttempts) {\n const delay = backoff(index);\n // Schedule next attempt via setTimeout so it gets enqueued through scheduleTimeout\n setTimeout(() => {\n attempt(index + 1);\n }, delay);\n }\n }\n ).catch((e) => {\n logger.error('[Askr] scheduleRetry error:', e);\n });\n });\n };\n\n // Start first attempt\n attempt(0);\n\n const cancel = () => {\n cancelled = true;\n };\n\n if (inst) inst.cleanupFns.push(cancel);\n return { cancel };\n}\n"]}
|