Skip to content

Commit 204c12e

Browse files
committed
fix: use Set() for middleware cache
1 parent 01da920 commit 204c12e

1 file changed

Lines changed: 41 additions & 22 deletions

File tree

src/metadata/metadata-storage.ts

Lines changed: 41 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -70,11 +70,11 @@ export class MetadataStorage {
7070

7171
middlewares: MiddlewareMetadata[] = [];
7272

73-
middlewaresByTargetAndFieldCache = new Map<string, MiddlewareMetadata[]>();
73+
middlewaresByTargetAndFieldCache = new Map<string, Set<MiddlewareMetadata>>();
7474

7575
resolverMiddlewares: ResolverMiddlewareMetadata[] = [];
7676

77-
resolverMiddlewaresByTargetCache = new Map<Function, ResolverMiddlewareMetadata[]>();
77+
resolverMiddlewaresByTargetCache = new Map<Function, Set<ResolverMiddlewareMetadata>>();
7878

7979
classDirectives: DirectiveClassMetadata[] = [];
8080

@@ -218,19 +218,25 @@ export class MetadataStorage {
218218
this.middlewares.forEach(middleware => {
219219
const key = `${middleware.target}-${middleware.fieldName}`;
220220
if (!this.middlewaresByTargetAndFieldCache.has(key)) {
221-
this.middlewaresByTargetAndFieldCache.set(key, []);
221+
this.middlewaresByTargetAndFieldCache.set(key, new Set());
222+
}
223+
224+
if (!this.middlewaresByTargetAndFieldCache.get(key)?.has(middleware)) {
225+
this.middlewaresByTargetAndFieldCache.get(key)?.add(middleware);
222226
}
223-
this.middlewaresByTargetAndFieldCache.get(key)?.push(middleware);
224227
});
225228
}
226229

227230
if (this.resolverMiddlewares?.length) {
228231
this.resolverMiddlewares.forEach(middleware => {
229232
const key = middleware.target;
230233
if (!this.resolverMiddlewaresByTargetCache.has(key)) {
231-
this.resolverMiddlewaresByTargetCache.set(key, []);
234+
this.resolverMiddlewaresByTargetCache.set(key, new Set());
235+
}
236+
237+
if (!this.resolverMiddlewaresByTargetCache.get(key)?.has(middleware)) {
238+
this.resolverMiddlewaresByTargetCache.get(key)?.add(middleware);
232239
}
233-
this.resolverMiddlewaresByTargetCache.get(key)?.push(middleware);
234240
});
235241
}
236242

@@ -338,6 +344,19 @@ export class MetadataStorage {
338344
this.classExtensions = [];
339345
this.fieldExtensions = [];
340346

347+
// clear map caches
348+
this.fieldsCache = new Map();
349+
this.objectTypesCache = new Map();
350+
this.interfaceTypesCache = new Map();
351+
this.middlewaresByTargetAndFieldCache = new Map();
352+
this.resolverMiddlewaresByTargetCache = new Map();
353+
this.paramsCache = new Map();
354+
this.fieldDirectivesByTargetAndFieldCache = new Map();
355+
this.classDirectivesByTargetCache = new Map();
356+
this.authorizedFieldsByTargetAndFieldCache = new Map();
357+
this.authorizedResolverByTargetCache = new Map();
358+
this.resolverClassesCache = new Map();
359+
341360
this.resolverClasses = [];
342361
this.fields = [];
343362
this.params = [];
@@ -350,20 +369,20 @@ export class MetadataStorage {
350369
fields.forEach(field => {
351370
field.roles = this.findFieldRoles(field.target, field.name);
352371

353-
const paramKey = `${field.target.name}-${field.name}`;
372+
const paramKey = `${field.target}-${field.name}`;
354373
field.params = this.paramsCache.get(paramKey) || [];
355374

356-
const middlewares1 = this.resolverMiddlewaresByTargetCache.get(field.target) || [];
357-
const middlewaresKey = `${field.target.name}-${field.name}`;
358-
const middlewares2 = this.middlewaresByTargetAndFieldCache.get(middlewaresKey) || [];
375+
const resolverMiddlewares = this.resolverMiddlewaresByTargetCache.get(field.target) || [];
376+
const middlewaresKey = `${field.target}-${field.name}`;
377+
const fieldMiddlewares = this.middlewaresByTargetAndFieldCache.get(middlewaresKey) || [];
359378

360-
field.middlewares = mapMiddlewareMetadataToArray(middlewares1).concat(
361-
mapMiddlewareMetadataToArray(middlewares2),
362-
);
379+
field.middlewares = [
380+
...mapMiddlewareMetadataToArray(Array.from(resolverMiddlewares)),
381+
...mapMiddlewareMetadataToArray(Array.from(fieldMiddlewares)),
382+
];
363383

364384
const directives =
365-
this.fieldDirectivesByTargetAndFieldCache.get(`${field.target.name}-${field.name}`) ||
366-
[];
385+
this.fieldDirectivesByTargetAndFieldCache.get(`${field.target}-${field.name}`) || [];
367386
field.directives = directives.map(it => it.directive);
368387

369388
field.extensions = this.findExtensions(field.target, field.name);
@@ -386,13 +405,13 @@ export class MetadataStorage {
386405
def.params = this.paramsCache.get(`${def.target}-${def.methodName}`) || [];
387406
def.roles = this.findFieldRoles(def.target, def.methodName);
388407

389-
def.middlewares = mapMiddlewareMetadataToArray(
390-
this.resolverMiddlewaresByTargetCache.get(def.target) || [],
391-
).concat(
392-
mapMiddlewareMetadataToArray(
393-
this.middlewaresByTargetAndFieldCache.get(`${def.target}-${def.methodName}`) || [],
394-
),
395-
);
408+
const resolverMiddlewares = this.resolverMiddlewaresByTargetCache.get(def.target) || [];
409+
const fieldMiddlewares =
410+
this.middlewaresByTargetAndFieldCache.get(`${def.target}-${def.methodName}`) || [];
411+
def.middlewares = [
412+
...mapMiddlewareMetadataToArray(Array.from(resolverMiddlewares)),
413+
...mapMiddlewareMetadataToArray(Array.from(fieldMiddlewares)),
414+
];
396415

397416
def.directives = (
398417
this.fieldDirectivesByTargetAndFieldCache.get(`${def.target}-${def.methodName}`) || []

0 commit comments

Comments
 (0)