UNPKG

@comyata/run

Version:

Simplify data workflows and management with data templates, for browser and server.

64 lines (63 loc) 3.04 kB
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 {};