Skip to content

Commit

Permalink
feat: expose files and various memory cache
Browse files Browse the repository at this point in the history
  • Loading branch information
lihbr committed Mar 12, 2023
1 parent af8ed28 commit af6021a
Show file tree
Hide file tree
Showing 2 changed files with 49 additions and 28 deletions.
31 changes: 22 additions & 9 deletions src/AkteApp.ts
Expand Up @@ -72,6 +72,11 @@ const debugCache = createDebugger("akte:app:cache");
export class AkteApp<TGlobalData = unknown> {
protected config: Config<TGlobalData>;

// TODO: TSDocs
get files(): AkteFiles<TGlobalData>[] {
return this.config.files;
}

constructor(config: Config<TGlobalData>) {
if (!__PRODUCTION__) {
if (config.files.length === 0 && akteWelcome) {
Expand Down Expand Up @@ -129,18 +134,19 @@ export class AkteApp<TGlobalData = unknown> {
async render(
match: MatchedRoute<{
file: AkteFiles<TGlobalData>;
}> & { path: string },
}> & { path: string; globalData?: TGlobalData; data?: unknown },
): Promise<string> {
debugRender("rendering %o...", match.path);

const params: Record<string, string> = match.params || {};
const globalData = await this.getGlobalDataPromise();
const globalData = match.globalData || (await this.getGlobalData());

try {
const content = await match.file.render({
path: match.path,
params,
globalData,
data: match.data,
});

debugRender("rendered %o", match.path);
Expand All @@ -166,7 +172,7 @@ export class AkteApp<TGlobalData = unknown> {
async renderAll(): Promise<Record<string, string>> {
debugRender("rendering all files...");

const globalData = await this.getGlobalDataPromise();
const globalData = await this.getGlobalData();

const renderAll = async (
akteFiles: AkteFiles<TGlobalData>,
Expand Down Expand Up @@ -294,7 +300,7 @@ export class AkteApp<TGlobalData = unknown> {
clearCache(alsoClearFileCache = false): void {
debugCache("clearing...");

this._globalDataPromise = undefined;
this._globalDataCache = undefined;
this._router = undefined;

if (alsoClearFileCache) {
Expand All @@ -306,9 +312,16 @@ export class AkteApp<TGlobalData = unknown> {
debugCache("cleared");
}

private _globalDataPromise: Awaitable<TGlobalData> | undefined;
protected getGlobalDataPromise(): Awaitable<TGlobalData> {
if (!this._globalDataPromise) {
// TODO: TSDocs
get globalDataCache(): Awaitable<TGlobalData> | undefined {
return this._globalDataCache;
}

private _globalDataCache: Awaitable<TGlobalData> | undefined;

// TODO: TSDocs
getGlobalData(): Awaitable<TGlobalData> {
if (!this._globalDataCache) {
debugCache("retrieving global data...");
const globalDataPromise =
this.config.globalData?.() ?? (undefined as TGlobalData);
Expand All @@ -321,12 +334,12 @@ export class AkteApp<TGlobalData = unknown> {
debugCache("retrieved global data");
}

this._globalDataPromise = globalDataPromise;
this._globalDataCache = globalDataPromise;
} else {
debugCache("using cached global data");
}

return this._globalDataPromise;
return this._globalDataCache;
}

private _router:
Expand Down
46 changes: 27 additions & 19 deletions src/AkteFiles.ts
Expand Up @@ -122,8 +122,9 @@ export class AkteFiles<
path: string;
params: Record<TParams[number], string>;
globalData: TGlobalData;
data?: TData;
}): Promise<string> {
const data = await this.getDataPromise(args);
const data = args.data || (await this.getData(args));

return this.definition.render({
path: args.path,
Expand All @@ -144,7 +145,7 @@ export class AkteFiles<

debugRender("rendering files... %o", this.path);

const bulkData = await this.getBulkDataPromise(args);
const bulkData = await this.getBulkData(args);

const render = async (
path: string,
Expand Down Expand Up @@ -181,16 +182,20 @@ export class AkteFiles<

/** @internal Prefer {@link AkteApp.clearCache} or use at your own risks. */
clearCache(): void {
this._dataPromiseMap = new Map();
this._bulkDataPromise = undefined;
this._dataMapCache.clear();
this._bulkDataCache = undefined;
}

private _dataPromiseMap: Map<string, Awaitable<TData>> = new Map();
// TODO: TSDocs + freeze map(?)
get dataMapCache(): Map<string, Awaitable<TData>> {
return this._dataMapCache;
}

private _dataMapCache: Map<string, Awaitable<TData>> = new Map();

protected getDataPromise: FilesDataFn<TGlobalData, TParams, TData> = (
context,
) => {
const maybePromise = this._dataPromiseMap.get(context.path);
// TODO: TSDocs
getData: FilesDataFn<TGlobalData, TParams, TData> = (context) => {
const maybePromise = this._dataMapCache.get(context.path);
if (maybePromise) {
debugCache("using cached data %o", context.path);

Expand All @@ -204,8 +209,7 @@ export class AkteFiles<
promise = this.definition.data(context);
} else if (this.definition.bulkData) {
const dataFromBulkData = async (path: string): Promise<TData> => {
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
const bulkData = await this.definition.bulkData!({
const bulkData = await this.getBulkData({
globalData: context.globalData,
});

Expand Down Expand Up @@ -233,17 +237,21 @@ export class AkteFiles<
debugCache("retrieved data %o", context.path);
}

this._dataPromiseMap.set(context.path, promise);
this._dataMapCache.set(context.path, promise);

return promise;
};

private _bulkDataPromise: Awaitable<Record<string, TData>> | undefined;
// TODO: TSDocs
get bulkDataCache(): Awaitable<Record<string, TData>> | undefined {
return this._bulkDataCache;
}

private _bulkDataCache: Awaitable<Record<string, TData>> | undefined;

protected getBulkDataPromise: FilesBulkDataFn<TGlobalData, TData> = (
context,
) => {
if (!this._bulkDataPromise) {
// TODO: TSDocs
getBulkData: FilesBulkDataFn<TGlobalData, TData> = (context) => {
if (!this._bulkDataCache) {
debugCache("retrieving bulk data... %o", this.path);

const bulkDataPromise =
Expand All @@ -257,11 +265,11 @@ export class AkteFiles<
debugCache("retrieved bulk data %o", this.path);
}

this._bulkDataPromise = bulkDataPromise;
this._bulkDataCache = bulkDataPromise;
} else {
debugCache("using cached bulk data %o", this.path);
}

return this._bulkDataPromise;
return this._bulkDataCache;
};
}

0 comments on commit af6021a

Please sign in to comment.