Simple caching for parsed workflow and template

This commit is contained in:
Jacob Wallraff
2023-03-02 16:43:23 -08:00
parent 4b8613da02
commit f2f377c21c
10 changed files with 58 additions and 12 deletions
+14
View File
@@ -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);
}