-import os from 'node:os'
+import * as os from 'node:os'
import type {
MeasurementStatisticsRequirements,
WorkerChoiceStrategyOptions
} from './pools/selection-strategies/selection-strategies-types'
+import type { KillBehavior } from './worker/worker-options'
+import type { MeasurementStatistics } from './pools/worker'
+
+/**
+ * Default task name.
+ */
+export const DEFAULT_TASK_NAME = 'default'
/**
* An intentional empty function.
try {
availableParallelism = os.availableParallelism()
} catch {
- const cpus = os.cpus()
- if (Array.isArray(cpus) && cpus.length > 0) {
- availableParallelism = cpus.length
+ const numberOfCpus = os.cpus()
+ if (Array.isArray(numberOfCpus) && numberOfCpus.length > 0) {
+ availableParallelism = numberOfCpus.length
}
}
return availableParallelism
obj !== null &&
obj?.constructor === Object &&
Object.prototype.toString.call(obj) === '[object Object]'
+
+/**
+ * Detects whether the given value is a kill behavior or not.
+ *
+ * @typeParam KB - Which specific KillBehavior type to test against.
+ * @param killBehavior - Which kind of kill behavior to detect.
+ * @param value - Any value.
+ * @returns `true` if `value` was strictly equals to `killBehavior`, otherwise `false`.
+ */
+export const isKillBehavior = <KB extends KillBehavior>(
+ killBehavior: KB,
+ value: unknown
+): value is KB => {
+ return value === killBehavior
+}
+
+/**
+ * Detects whether the given value is an asynchronous function or not.
+ *
+ * @param fn - Any value.
+ * @returns `true` if `fn` was an asynchronous function, otherwise `false`.
+ */
+export const isAsyncFunction = (
+ fn: unknown
+): fn is (...args: unknown[]) => Promise<unknown> => {
+ return typeof fn === 'function' && fn.constructor.name === 'AsyncFunction'
+}
+
+/**
+ * Updates the given measurement statistics.
+ *
+ * @param measurementStatistics - The measurement statistics to update.
+ * @param measurementRequirements - The measurement statistics requirements.
+ * @param measurementValue - The measurement value.
+ * @param numberOfMeasurements - The number of measurements.
+ */
+export const updateMeasurementStatistics = (
+ measurementStatistics: MeasurementStatistics,
+ measurementRequirements: MeasurementStatisticsRequirements,
+ measurementValue: number,
+ numberOfMeasurements: number
+): void => {
+ if (measurementRequirements.aggregate) {
+ measurementStatistics.aggregate =
+ (measurementStatistics.aggregate ?? 0) + measurementValue
+ measurementStatistics.minimum = Math.min(
+ measurementValue,
+ measurementStatistics.minimum ?? Infinity
+ )
+ measurementStatistics.maximum = Math.max(
+ measurementValue,
+ measurementStatistics.maximum ?? -Infinity
+ )
+ if (measurementRequirements.average && numberOfMeasurements !== 0) {
+ measurementStatistics.average =
+ measurementStatistics.aggregate / numberOfMeasurements
+ }
+ if (measurementRequirements.median && measurementValue != null) {
+ measurementStatistics.history.push(measurementValue)
+ measurementStatistics.median = median(measurementStatistics.history)
+ }
+ }
+}