socket-function 1.1.24 → 1.1.25
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/index.d.ts +2 -3
- package/package.json +1 -1
- package/src/batching.d.ts +2 -3
- package/src/batching.ts +23 -15
package/index.d.ts
CHANGED
|
@@ -620,10 +620,9 @@ declare module "socket-function/src/batching" {
|
|
|
620
620
|
export declare function safeLoop<T, R>(config: {
|
|
621
621
|
data: T[];
|
|
622
622
|
fnc: (item: T) => MaybePromise<R>;
|
|
623
|
-
/** If set, yields after blocking for this many ms. */
|
|
623
|
+
/** If set, yields after blocking for this many ms. ONLY applies if your function does not return promises. Default = 1000ms */
|
|
624
624
|
maxBlockingTime?: number;
|
|
625
|
-
/**
|
|
626
|
-
* e.g. 0.5 => after blocking X ms, wait X ms before continuing. */
|
|
625
|
+
/** Fraction of time spent active vs yielded. e.g. 0.5 => after running X ms, wait X ms before continuing. */
|
|
627
626
|
maxActiveFraction?: number;
|
|
628
627
|
doNotWarnOnSlow?: boolean;
|
|
629
628
|
name?: string;
|
package/package.json
CHANGED
package/src/batching.d.ts
CHANGED
|
@@ -44,10 +44,9 @@ export declare function unblockLoop<T, R>(config: {
|
|
|
44
44
|
export declare function safeLoop<T, R>(config: {
|
|
45
45
|
data: T[];
|
|
46
46
|
fnc: (item: T) => MaybePromise<R>;
|
|
47
|
-
/** If set, yields after blocking for this many ms. */
|
|
47
|
+
/** If set, yields after blocking for this many ms. ONLY applies if your function does not return promises. Default = 1000ms */
|
|
48
48
|
maxBlockingTime?: number;
|
|
49
|
-
/**
|
|
50
|
-
* e.g. 0.5 => after blocking X ms, wait X ms before continuing. */
|
|
49
|
+
/** Fraction of time spent active vs yielded. e.g. 0.5 => after running X ms, wait X ms before continuing. */
|
|
51
50
|
maxActiveFraction?: number;
|
|
52
51
|
doNotWarnOnSlow?: boolean;
|
|
53
52
|
name?: string;
|
package/src/batching.ts
CHANGED
|
@@ -375,15 +375,15 @@ export async function unblockLoop<T, R>(config: {
|
|
|
375
375
|
export async function safeLoop<T, R>(config: {
|
|
376
376
|
data: T[];
|
|
377
377
|
fnc: (item: T) => MaybePromise<R>;
|
|
378
|
-
/** If set, yields after blocking for this many ms. */
|
|
378
|
+
/** If set, yields after blocking for this many ms. ONLY applies if your function does not return promises. Default = 1000ms */
|
|
379
379
|
maxBlockingTime?: number;
|
|
380
|
-
/**
|
|
381
|
-
* e.g. 0.5 => after blocking X ms, wait X ms before continuing. */
|
|
380
|
+
/** Fraction of time spent active vs yielded. e.g. 0.5 => after running X ms, wait X ms before continuing. */
|
|
382
381
|
maxActiveFraction?: number;
|
|
383
382
|
doNotWarnOnSlow?: boolean;
|
|
384
383
|
name?: string;
|
|
385
384
|
}): Promise<R[]> {
|
|
386
|
-
let { data, fnc,
|
|
385
|
+
let { data, fnc, maxActiveFraction, doNotWarnOnSlow, name } = config;
|
|
386
|
+
let maxBlockingTime = config.maxBlockingTime ?? 1000;
|
|
387
387
|
|
|
388
388
|
let label = name || fnc.name || fnc.toString().slice(0, 100);
|
|
389
389
|
let startTime = Date.now();
|
|
@@ -407,26 +407,34 @@ export async function safeLoop<T, R>(config: {
|
|
|
407
407
|
}
|
|
408
408
|
|
|
409
409
|
let results: R[] = [];
|
|
410
|
-
let
|
|
410
|
+
let activeTimeSinceYield = 0;
|
|
411
411
|
try {
|
|
412
412
|
for (index = 0; index < data.length; index++) {
|
|
413
413
|
indexStartTime = Date.now();
|
|
414
414
|
let result = fnc(data[index]);
|
|
415
|
+
let isPromise = false;
|
|
415
416
|
if (result && typeof result === "object" && "then" in result) {
|
|
417
|
+
isPromise = true;
|
|
416
418
|
result = await result;
|
|
417
419
|
}
|
|
418
420
|
results.push(result);
|
|
419
421
|
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
422
|
+
activeTimeSinceYield += Date.now() - indexStartTime;
|
|
423
|
+
|
|
424
|
+
let backOffTime: number | undefined;
|
|
425
|
+
|
|
426
|
+
if (!isPromise && activeTimeSinceYield > maxBlockingTime) {
|
|
427
|
+
backOffTime = 0;
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
if (maxActiveFraction !== undefined && maxActiveFraction > 0 && maxActiveFraction < 1) {
|
|
431
|
+
let target = activeTimeSinceYield / maxActiveFraction - activeTimeSinceYield;
|
|
432
|
+
backOffTime = Math.max(backOffTime ?? 0, target);
|
|
433
|
+
}
|
|
434
|
+
|
|
435
|
+
if (backOffTime !== undefined) {
|
|
436
|
+
await delay(backOffTime);
|
|
437
|
+
activeTimeSinceYield = 0;
|
|
430
438
|
}
|
|
431
439
|
}
|
|
432
440
|
} finally {
|