Browse Source

UI: Fixed clear cache in SystemJs load resources

pull/8562/head
Vladyslav_Prykhodko 3 years ago
parent
commit
01065ec0c5
  1. 59
      ui-ngx/src/app/core/services/resources.service.ts

59
ui-ngx/src/app/core/services/resources.service.ts

@ -33,6 +33,7 @@ import { AuthService } from '@core/auth/auth.service';
import { select, Store } from '@ngrx/store'; import { select, Store } from '@ngrx/store';
import { selectIsAuthenticated } from '@core/auth/auth.selectors'; import { selectIsAuthenticated } from '@core/auth/auth.selectors';
import { AppState } from '@core/core.state'; import { AppState } from '@core/core.state';
import { tap } from 'rxjs/operators';
declare const System; declare const System;
@ -57,7 +58,7 @@ export class ResourcesService {
private compiler: Compiler, private compiler: Compiler,
private http: HttpClient, private http: HttpClient,
private injector: Injector) { private injector: Injector) {
this.store.pipe(select(selectIsAuthenticated)).subscribe(() => this.clearCache()); this.store.pipe(select(selectIsAuthenticated)).subscribe(() => this.clearModulesCache());
} }
public loadResource(url: string): Observable<any> { public loadResource(url: string): Observable<any> {
@ -71,9 +72,9 @@ export class ResourcesService {
fileType = match[1]; fileType = match[1];
} }
if (!fileType) { if (!fileType) {
return throwError(new Error(`Unable to detect file type from url: ${url}`)); return throwError(() => new Error(`Unable to detect file type from url: ${url}`));
} else if (fileType !== 'css' && fileType !== 'js') { } else if (fileType !== 'css' && fileType !== 'js') {
return throwError(new Error(`Unsupported file type: ${fileType}`)); return throwError(() => new Error(`Unsupported file type: ${fileType}`));
} }
return this.loadResourceByType(fileType, url); return this.loadResourceByType(fileType, url);
} }
@ -97,7 +98,8 @@ export class ResourcesService {
for (const m of modules) { for (const m of modules) {
tasks.push(this.compiler.compileModuleAndAllComponentsAsync(m)); tasks.push(this.compiler.compileModuleAndAllComponentsAsync(m));
} }
forkJoin(tasks).subscribe((compiled) => { forkJoin(tasks).subscribe({
next: (compiled) => {
try { try {
const componentFactories: ComponentFactory<any>[] = []; const componentFactories: ComponentFactory<any>[] = [];
for (const c of compiled) { for (const c of compiled) {
@ -112,26 +114,32 @@ export class ResourcesService {
this.loadedModulesAndFactories[url].complete(); this.loadedModulesAndFactories[url].complete();
} catch (e) { } catch (e) {
this.loadedModulesAndFactories[url].error(new Error(`Unable to init module from url: ${url}`)); this.loadedModulesAndFactories[url].error(new Error(`Unable to init module from url: ${url}`));
delete this.loadedModulesAndFactories[url];
} }
}, },
(e) => { error: (e) => {
this.loadedModulesAndFactories[url].error(new Error(`Unable to compile module from url: ${url}`)); this.loadedModulesAndFactories[url].error(new Error(`Unable to compile module from url: ${url}`));
delete this.loadedModulesAndFactories[url]; }
}); });
} else { } else {
this.loadedModulesAndFactories[url].error(new Error(`Module '${url}' doesn't have default export!`)); this.loadedModulesAndFactories[url].error(new Error(`Module '${url}' doesn't have default export!`));
delete this.loadedModulesAndFactories[url];
} }
}, },
(e) => { (e) => {
this.loadedModulesAndFactories[url].error(new Error(`Unable to load module from url: ${url}`)); this.loadedModulesAndFactories[url].error(new Error(`Unable to load module from url: ${url}`));
delete this.loadedModulesAndFactories[url];
} }
); );
} }
); );
return subject.asObservable(); return subject.asObservable().pipe(
tap({
next: () => System.delete(url),
error: () => {
delete this.loadedModulesAndFactories[url];
System.delete(url);
},
complete: () => System.delete(url)
})
);
} }
public loadModules(resourceId: string | TbResourceId, modulesMap: IModulesMap): Observable<Type<any>[]> { public loadModules(resourceId: string | TbResourceId, modulesMap: IModulesMap): Observable<Type<any>[]> {
@ -168,31 +176,35 @@ export class ResourcesService {
this.loadedModules[url].complete(); this.loadedModules[url].complete();
} catch (e) { } catch (e) {
this.loadedModules[url].error(new Error(`Unable to init module from url: ${url}`)); this.loadedModules[url].error(new Error(`Unable to init module from url: ${url}`));
delete this.loadedModules[url];
} }
}, },
(e) => { (e) => {
this.loadedModules[url].error(new Error(`Unable to compile module from url: ${url}`)); this.loadedModules[url].error(new Error(`Unable to compile module from url: ${url}`));
delete this.loadedModules[url];
}); });
} else { } else {
this.loadedModules[url].error(new Error(`Module '${url}' doesn't have default export or not NgModule!`)); this.loadedModules[url].error(new Error(`Module '${url}' doesn't have default export or not NgModule!`));
delete this.loadedModules[url];
} }
} catch (e) { } catch (e) {
this.loadedModules[url].error(new Error(`Unable to load module from url: ${url}`)); this.loadedModules[url].error(new Error(`Unable to load module from url: ${url}`));
delete this.loadedModules[url];
} }
}, },
(e) => { (e) => {
this.loadedModules[url].error(new Error(`Unable to load module from url: ${url}`)); this.loadedModules[url].error(new Error(`Unable to load module from url: ${url}`));
delete this.loadedModules[url];
console.error(`Unable to load module from url: ${url}`, e); console.error(`Unable to load module from url: ${url}`, e);
} }
); );
} }
); );
return subject.asObservable(); return subject.asObservable().pipe(
tap({
next: () => System.delete(url),
error: () => {
delete this.loadedModulesAndFactories[url];
System.delete(url);
},
complete: () => System.delete(url)
})
);
} }
private extractNgModules(module: any, modules: Type<any>[] = []): Type<any>[] { private extractNgModules(module: any, modules: Type<any>[] = []): Type<any>[] {
@ -277,19 +289,8 @@ export class ResourcesService {
} }
} }
private deleteFromSystemJS(keys: string[]) { private clearModulesCache() {
keys.forEach(item => {
if (System.has(item)) {
System.delete(item);
}
});
}
private clearCache() {
this.deleteFromSystemJS(Object.keys(this.loadedModules));
this.loadedModules = {}; this.loadedModules = {};
this.deleteFromSystemJS(Object.keys(this.loadedModulesAndFactories));
this.loadedModulesAndFactories = {}; this.loadedModulesAndFactories = {};
} }
} }

Loading…
Cancel
Save