@comyata/run
Version:
Simplify data workflows and management with data templates, for browser and server.
64 lines (63 loc) • 3.04 kB
TypeScript
import { IDataNode } from '@comyata/run/DataNode';
export interface IComputeStatsBase {
step: string;
dur?: number;
cached?: number;
stats?: ComputeStats[];
}
export interface NodeComputeStats extends IComputeStatsBase {
dataNode?: IDataNode['path'];
stats: (ComputeStats)[];
cached?: 0 | 1 | 2 | 3;
engine?: string;
}
export interface NodeRuntimeBaggage<TNode extends IDataNode> {
nodesChain: Set<TNode | IDataNode>;
abort?: AbortSignal;
}
export interface NodeRuntimeBaggageComplete<TNode extends IDataNode> extends NodeRuntimeBaggage<TNode> {
stats: NodeComputeStats;
getNodeContext: (node: TNode | IDataNode) => NodeContext;
}
export type ComputeFn<TNode extends IDataNode, C = unknown, TBaggage extends NodeRuntimeBaggageComplete<TNode> = NodeRuntimeBaggageComplete<TNode>> = (dataNode: TNode, context: C, parentData: unknown[], runtimeBaggage: TBaggage) => Promise<unknown>;
export type ComputeStats = IComputeStatsBase | NodeComputeStats;
export type NodeContext = [
setter: (value: unknown) => void,
getter: () => unknown,
dataChain: unknown[]
];
type ResultState<TOutput = unknown, TNode extends IDataNode = IDataNode> = {
output: () => TOutput;
stats: ComputeStats[];
getValue: (node: TNode | IDataNode) => unknown;
compute: () => Promise<TOutput>;
};
export type NodeComputeEngines<TNode extends IDataNode, C = unknown, TBaggage extends NodeRuntimeBaggage<TNode> = NodeRuntimeBaggage<TNode>> = {
[engine in NonNullable<TNode['engine']>]?: TNode extends {
engine: engine;
computed: true;
} ? ComputeFn<TNode, C, TBaggage & NodeRuntimeBaggageComplete<TNode>> : never;
};
export declare const runtime: <TNode extends IDataNode, D = unknown, C = unknown, TBaggage extends NodeRuntimeBaggage<TNode> = NodeRuntimeBaggage<TNode>>(dataNode: TNode, context: C, computeEngines: NodeComputeEngines<TNode, C, TBaggage>, { onCompute, onComputed, onComputedError, __unsafeAllowCrossResolving, __unsafeDisableResultValidation, }?: {
onCompute?: ((dataNode: TNode) => void) | undefined;
onComputed?: ((dataNode: TNode, result: unknown, meta: {
statsNode: NodeComputeStats;
statsRun: IComputeStatsBase;
}) => Promise<void> | void) | undefined;
onComputedError?: ((dataNode: TNode, error: unknown, meta: {
statsNode: NodeComputeStats;
statsRun: IComputeStatsBase;
}) => void) | undefined;
/**
* Allows to resolve other computed nodes from other computed nodes,
* may lead to promise based deadlocks when cross-accessing computed nodes in the same file
*/
__unsafeAllowCrossResolving?: boolean | undefined;
/**
* Disables the validation that the value is neither Error nor Promise,
* checked after the computation of a property, based on the resolved value,
* but before the value is set to the output data.
*/
__unsafeDisableResultValidation?: boolean | undefined;
}, { nodesChain, ...baggage }?: TBaggage) => ResultState<D, TNode>;
export {};