diff --git a/packages/data-loader/src/data-loader.context.ts b/packages/data-loader/src/data-loader.context.ts index a700ef7..a9388ec 100644 --- a/packages/data-loader/src/data-loader.context.ts +++ b/packages/data-loader/src/data-loader.context.ts @@ -58,16 +58,17 @@ export class DataLoaderContext { }); } - private createContext(): LoaderContextType { + private createContext() { const contextId = ContextIdFactory.create(); const loaders: LoaderContextType['loaders'] = new Map(); - return { + const loaderContext: LoaderContextType = { contextId, loaders, getLoader: cacheable(loaders, (strategyType) => - this.factory.create(strategyType, contextId), + this.factory.create(strategyType, contextId, loaderContext), ), }; + return loaderContext; } } diff --git a/packages/data-loader/src/data-loader.factory.ts b/packages/data-loader/src/data-loader.factory.ts index 4404355..83b832a 100644 --- a/packages/data-loader/src/data-loader.factory.ts +++ b/packages/data-loader/src/data-loader.factory.ts @@ -2,6 +2,7 @@ import { Inject, Injectable, Type } from '@nestjs/common'; import { ContextId, ModuleRef } from '@nestjs/core'; import DataLoaderLib from 'dataloader'; import type { DataLoaderOptions } from './data-loader-options.type'; +import type { LoaderContextType } from './data-loader.context'; import { MODULE_OPTIONS_TOKEN } from './data-loader.module-builder'; import { DataLoaderStrategy } from './data-loader.strategy'; import { DataLoader } from './data-loader.type'; @@ -27,6 +28,7 @@ export class DataLoaderFactory { async create( strategyType: Type>, contextId: ContextId, + loaderContext: LoaderContextType, ): Promise> { const strategy = await this.moduleRef.resolve< DataLoaderStrategy @@ -35,7 +37,7 @@ export class DataLoaderFactory { const options = this.resolveOptions(strategy, this.defaultOptions); const loader = new DataLoaderLib( - this.makeBatchFn(strategy, options), + this.makeBatchFn(strategy, options, loaderContext), options, ) as DataLoader; @@ -72,11 +74,12 @@ export class DataLoaderFactory { protected makeBatchFn( strategy: DataLoaderStrategy, options: ResolvedDataLoaderOptions, + loaderContext: LoaderContextType, ) { const { propertyKey: getKey, cacheKeyFn: getCacheKey } = options; const batchFn: DataLoaderLib.BatchLoadFn = async (keys) => { - const docs = await strategy.loadMany(keys); + const docs = await strategy.loadMany(keys, loaderContext); // Put documents (docs) into a map where key is a document's ID or some // property (prop) of a document and value is a document. diff --git a/packages/data-loader/src/data-loader.strategy.ts b/packages/data-loader/src/data-loader.strategy.ts index 7318001..a9e7d51 100644 --- a/packages/data-loader/src/data-loader.strategy.ts +++ b/packages/data-loader/src/data-loader.strategy.ts @@ -1,9 +1,11 @@ /* eslint-disable @typescript-eslint/method-signature-style */ import { DataLoaderOptions } from './data-loader-options.type'; +import { LoaderContextType } from './data-loader.context'; export interface DataLoaderStrategy { loadMany( keys: readonly Key[], + loaderContext: LoaderContextType, ): Promise>; getOptions?: () => DataLoaderOptions;