Simple caching for parsed workflow and template
This commit is contained in:
@@ -11,6 +11,8 @@ import {convertReferencedWorkflow} from "./converter/referencedWorkflow";
|
||||
import {isReusableWorkflowJob} from "./type-guards";
|
||||
import {WorkflowTemplate} from "./workflow-template";
|
||||
|
||||
const workflowTemplateCache = new Map<string, WorkflowTemplate>();
|
||||
|
||||
export enum ErrorPolicy {
|
||||
ReturnErrorsOnly,
|
||||
TryConversion
|
||||
@@ -46,11 +48,17 @@ const defaultOptions: Required<WorkflowTemplateConverterOptions> = {
|
||||
};
|
||||
|
||||
export async function convertWorkflowTemplate(
|
||||
fileName: string,
|
||||
context: TemplateContext,
|
||||
root: TemplateToken,
|
||||
fileProvider?: FileProvider,
|
||||
options: WorkflowTemplateConverterOptions = defaultOptions
|
||||
): Promise<WorkflowTemplate> {
|
||||
const cachedResult = workflowTemplateCache.get(fileName)
|
||||
if (cachedResult) {
|
||||
return cachedResult;
|
||||
}
|
||||
|
||||
const result = {} as WorkflowTemplate;
|
||||
const opts = getOptionsWithDefaults(options);
|
||||
|
||||
@@ -58,6 +66,7 @@ export async function convertWorkflowTemplate(
|
||||
result.errors = context.errors.getErrors().map(x => ({
|
||||
Message: x.message
|
||||
}));
|
||||
workflowTemplateCache.set(fileName, result);
|
||||
return result;
|
||||
}
|
||||
|
||||
@@ -129,6 +138,7 @@ export async function convertWorkflowTemplate(
|
||||
}
|
||||
}
|
||||
|
||||
workflowTemplateCache.set(fileName, result);
|
||||
return result;
|
||||
}
|
||||
|
||||
@@ -145,3 +155,7 @@ function getOptionsWithDefaults(options: WorkflowTemplateConverterOptions): Requ
|
||||
errorPolicy: options.errorPolicy !== undefined ? options.errorPolicy : defaultOptions.errorPolicy
|
||||
};
|
||||
}
|
||||
|
||||
export function clearWorkflowTemplateCacheEntry(uri: string) {
|
||||
workflowTemplateCache.delete(uri);
|
||||
}
|
||||
@@ -6,6 +6,9 @@ import {File} from "./file";
|
||||
import {WORKFLOW_ROOT} from "./workflow-constants";
|
||||
import {getWorkflowSchema} from "./workflow-schema";
|
||||
import {YamlObjectReader} from "./yaml-object-reader";
|
||||
|
||||
const parsedWorkflowCache = new Map<string, ParseWorkflowResult>();
|
||||
|
||||
export interface ParseWorkflowResult {
|
||||
context: TemplateContext;
|
||||
value: TemplateToken | undefined;
|
||||
@@ -14,6 +17,11 @@ export interface ParseWorkflowResult {
|
||||
export function parseWorkflow(entryFile: File, trace: TraceWriter): ParseWorkflowResult;
|
||||
export function parseWorkflow(entryFile: File, context: TemplateContext): ParseWorkflowResult;
|
||||
export function parseWorkflow(entryFile: File, contextOrTrace: TraceWriter | TemplateContext): ParseWorkflowResult {
|
||||
const cachedResult = parsedWorkflowCache.get(entryFile.name)
|
||||
if (cachedResult) {
|
||||
return cachedResult;
|
||||
}
|
||||
|
||||
const context =
|
||||
contextOrTrace instanceof TemplateContext
|
||||
? contextOrTrace
|
||||
@@ -26,15 +34,23 @@ export function parseWorkflow(entryFile: File, contextOrTrace: TraceWriter | Tem
|
||||
for (const err of reader.errors) {
|
||||
context.error(fileId, err.message, err.range);
|
||||
}
|
||||
return {
|
||||
const result = {
|
||||
context,
|
||||
value: undefined
|
||||
};
|
||||
parsedWorkflowCache.set(entryFile.name, result);
|
||||
return result
|
||||
}
|
||||
const result = templateReader.readTemplate(context, WORKFLOW_ROOT, reader, fileId);
|
||||
const templateToken = templateReader.readTemplate(context, WORKFLOW_ROOT, reader, fileId);
|
||||
|
||||
return <ParseWorkflowResult>{
|
||||
const result = {
|
||||
context,
|
||||
value: result
|
||||
};
|
||||
value: templateToken
|
||||
} satisfies ParseWorkflowResult;
|
||||
parsedWorkflowCache.set(entryFile.name, result);
|
||||
return result;
|
||||
}
|
||||
|
||||
export function clearParsedCacheEntry(path: string) {
|
||||
parsedWorkflowCache.delete(path);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user