@eagleoutice/flowr-dev
Version:
Static Dataflow Analyzer and Program Slicer for the R Programming Language
131 lines (130 loc) • 6.55 kB
TypeScript
import type { MergeableRecord } from './util/objects';
/** Wiki reference for the gas resource guard, use this in user-facing warnings. */
export declare const GasWikiRef = "https://github.com/flowr-analysis/flowr/wiki/Core#gas-resource-guard";
/**
* Resource-pressure level returned by {@link ReadOnlyFlowrAnalyzerGasContext.checkGas}.
* Numeric ordering lets callers use `>=` for threshold comparisons at zero cost.
* See the [Gas (Resource Guard)](https://github.com/flowr-analysis/flowr/wiki/Core#gas-resource-guard) wiki section for details.
*/
export declare const enum GasLevel {
/** Safe to continue, all resources are within bounds. */
Normal = 0,
/** Approaching a threshold. Consider emitting a warning and continue. */
Problematic = 1,
/** Threshold exceeded. The caller should skip the expensive work. */
Critical = 2
}
/**
* Known feature keys accepted by {@link ReadOnlyFlowrAnalyzerGasContext.checkGas}.
* Each key corresponds to a sensitivity factor in {@link FlowrGasConfig.features}.
*/
export declare const GasFeatureKey: {
/** Gas key for built-in `source()` file analysis. */
readonly Source: "source";
/** Gas key for the side-effect link resolution phase of the dataflow extractor, which matches unknown side effects against call sites via the CFG and can be expensive for large scripts. */
readonly SideEffectLinking: "side-effect-linking";
/** Gas key for the linter, checked once per linting rule. Under critical pressure, remaining rules are skipped. */
readonly Linter: "linter";
/**
* Gas key for the static slicer, checked while traversing the dataflow graph. Under critical pressure the
* traversal stops and the slice is returned as far as it got (`SliceResult.stoppedEarly`), which is the only
* way to bound the otherwise synchronous traversal from the outside.
*/
readonly Slicer: "slicer";
};
export type GasFeatureKey = typeof GasFeatureKey[keyof typeof GasFeatureKey];
/** Paired low/high thresholds used inside {@link GasThresholdSpec}. */
export interface GasThresholdPair extends MergeableRecord {
/** Returns {@link GasLevel.Problematic} when reached (after factor scaling). */
readonly problematic: number;
/** Returns {@link GasLevel.Critical} when reached (after factor scaling). */
readonly critical: number;
}
/**
* Thresholds for one gas dimension, either as one pair for every feature or split per {@link GasFeatureKey}:
*
* ```ts
* timeMs: {
* default: { problematic: 60_000, critical: 120_000 },
* slicer: { problematic: 24_000, critical: 30_000 }
* }
* ```
*
* Per bound, a feature entry wins over `default`, which wins over the direct pair. A bound nowhere given never triggers.
*/
export interface GasThresholdSpec extends MergeableRecord {
/** Shared bound, for every feature without a more specific entry. */
readonly problematic?: number;
/** Shared bound, for every feature without a more specific entry. */
readonly critical?: number;
/** Bounds for the features that have no entry of their own. */
readonly default?: Partial<GasThresholdPair>;
/** Bounds for one {@link GasFeatureKey}. */
readonly [feature: string]: number | Partial<GasThresholdPair> | undefined;
}
/**
* Thresholds for {@link GasLevel} transitions used by {@link ReadOnlyFlowrAnalyzerGasContext.checkGas}, each
* dimension boundable per feature (see {@link GasThresholdSpec}).
* See the [Gas (Resource Guard)](https://github.com/flowr-analysis/flowr/wiki/Core#gas-resource-guard) wiki section.
*/
export interface FlowrGasThresholds extends MergeableRecord {
/** Heap-usage fraction thresholds (0-1, before factor scaling). */
readonly memory: GasThresholdSpec;
/** Elapsed analysis time thresholds in milliseconds (before factor scaling). */
readonly timeMs: GasThresholdSpec;
}
/** Gas bounds for one feature within a single call, see {@link GasOverrides}. */
export interface GasFeatureOverride extends MergeableRecord {
/** Elapsed ms, shorthand for `timeMs.problematic`. */
readonly problematic?: number;
/** Elapsed ms, shorthand for `timeMs.critical`. */
readonly critical?: number;
/** Overrides `config.gas.thresholds.timeMs` for this call. */
readonly timeMs?: Partial<GasThresholdPair>;
/** Overrides `config.gas.thresholds.memory` for this call. */
readonly memory?: Partial<GasThresholdPair>;
/** Sensitivity factor, defaulting to the configured one, or `1` if the feature is disabled. */
readonly factor?: number;
}
/**
* Gas bounds for a single call, keyed by {@link GasFeatureKey}, measured from that call:
*
* ```ts
* analyzer.query([...], { gas: { slicer: { critical: 30_000 } } });
* ```
*
* Naming a feature enables gas for it even when `config.gas.features` disables it; pass `factor: 0` to keep it off.
*/
export type GasOverrides = {
/** Bounds for the features that have no entry of their own. */
readonly default?: GasFeatureOverride;
/** Bounds for one {@link GasFeatureKey}. */
readonly [feature: string]: GasFeatureOverride | undefined;
};
/** Heap statistics used for gas memory checks (field names follow the v8 API). */
export interface GasHeapStatistics {
readonly used_heap_size: number;
readonly heap_size_limit: number;
}
/**
* Gas configuration embedded in {@link FlowrConfig.gas}.
*
* Each entry in `features` is a sensitivity factor for a named analysis feature
* (see {@link GasFeatureKey} for the recognised keys):
* - `0` / absent - disabled for that feature, zero overhead.
* - `1` - normal sensitivity, thresholds in {@link thresholds} apply as-is.
* - `N` - N times as sensitive, effectively divides each threshold by N.
*
* See the [Gas (Resource Guard)](https://github.com/flowr-analysis/flowr/wiki/Core#gas-resource-guard) wiki section.
*/
export interface FlowrGasConfig extends MergeableRecord {
/** Thresholds scaled by each feature factor before comparison, optionally bounded per feature (see {@link GasThresholdSpec}). */
readonly thresholds: FlowrGasThresholds;
/** Per-feature sensitivity factors. Missing or `0` disables checking with zero overhead. */
readonly features: Record<string, number | undefined>;
/**
* Custom heap statistics source (programmatic configs only), overriding the built-in
* detection (v8 module, then Chromium's performance.memory). Return undefined to skip the memory check.
*/
readonly heapProvider?: () => GasHeapStatistics | undefined;
}