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 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
- /** If set (with maxBlockingTime), the fraction of time spent active vs yielded.
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "socket-function",
3
- "version": "1.1.24",
3
+ "version": "1.1.25",
4
4
  "main": "index.js",
5
5
  "license": "MIT",
6
6
  "dependencies": {
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
- /** If set (with maxBlockingTime), the fraction of time spent active vs yielded.
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
- /** If set (with maxBlockingTime), the fraction of time spent active vs yielded.
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, maxBlockingTime, maxActiveFraction, doNotWarnOnSlow, name } = config;
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 lastYieldTime = Date.now();
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
- if (maxBlockingTime !== undefined) {
421
- let blockedFor = Date.now() - lastYieldTime;
422
- if (blockedFor > maxBlockingTime) {
423
- let backOffTime = 0;
424
- if (maxActiveFraction !== undefined && maxActiveFraction > 0 && maxActiveFraction < 1) {
425
- backOffTime = blockedFor / maxActiveFraction - blockedFor;
426
- }
427
- await delay(backOffTime);
428
- lastYieldTime = Date.now();
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 {