@smartbit4all/ng-client 2.0.10 → 2.0.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2020/lib/session/smart-error-catching.interceptor.mjs +51 -27
- package/esm2020/lib/session/smart-session-handler.service.mjs +1 -1
- package/esm2020/lib/session/smart-session.service.mjs +31 -26
- package/esm2020/lib/smart-client/smart-component-api-client.mjs +6 -2
- package/esm2020/lib/smart-client/smart.component.mjs +5 -2
- package/esm2020/lib/smart-client/smart.service.mjs +5 -2
- package/fesm2015/smartbit4all-ng-client.mjs +89 -50
- package/fesm2015/smartbit4all-ng-client.mjs.map +1 -1
- package/fesm2020/smartbit4all-ng-client.mjs +88 -50
- package/fesm2020/smartbit4all-ng-client.mjs.map +1 -1
- package/lib/session/smart-error-catching.interceptor.d.ts +8 -4
- package/lib/session/smart-session-handler.service.d.ts +10 -0
- package/lib/session/smart-session.service.d.ts +2 -0
- package/lib/smart-client/smart-component-api-client.d.ts +3 -1
- package/lib/smart-client/smart.component.d.ts +3 -2
- package/lib/smart-client/smart.service.d.ts +3 -2
- package/package.json +3 -3
- package/smartbit4all-ng-client-2.0.12.tgz +0 -0
- package/smartbit4all-ng-client-2.0.10.tgz +0 -0
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
|
-
import { InjectionToken, Injectable, Optional, Inject, PLATFORM_ID, NgModule, SkipSelf, Component, Pipe, CUSTOM_ELEMENTS_SCHEMA, ViewChild, Input, ViewChildren } from '@angular/core';
|
|
3
|
-
import { Subject, takeUntil, map, catchError, throwError, from } from 'rxjs';
|
|
4
|
-
import { SmartSubject } from '@smartbit4all/subject';
|
|
2
|
+
import { InjectionToken, Injectable, Optional, Inject, PLATFORM_ID, NgModule, SkipSelf, Component, Pipe, CUSTOM_ELEMENTS_SCHEMA, ViewChild, Input, ViewChildren, ChangeDetectorRef } from '@angular/core';
|
|
5
3
|
import * as i1 from '@angular/common/http';
|
|
6
|
-
import { HttpHeaders, HttpContext, HttpParams, HttpEventType, HTTP_INTERCEPTORS, HttpClientModule } from '@angular/common/http';
|
|
4
|
+
import { HttpHeaders, HttpContext, HttpErrorResponse, HttpParams, HttpEventType, HTTP_INTERCEPTORS, HttpClientModule } from '@angular/common/http';
|
|
5
|
+
import { Subject, lastValueFrom, takeUntil, map, catchError, throwError, from } from 'rxjs';
|
|
6
|
+
import { SmartSubject } from '@smartbit4all/subject';
|
|
7
7
|
import * as i4 from '@angular/common';
|
|
8
8
|
import { isPlatformBrowser, DOCUMENT, DatePipe, CommonModule } from '@angular/common';
|
|
9
9
|
import * as i2 from '@angular/material/button';
|
|
@@ -765,7 +765,7 @@ class SmartSessionService {
|
|
|
765
765
|
}
|
|
766
766
|
async handleSessionError(sessionError) {
|
|
767
767
|
if (this.sessionHandlerService) {
|
|
768
|
-
await this.sessionHandlerService.handleSessionError(sessionError);
|
|
768
|
+
return await this.sessionHandlerService.handleSessionError(sessionError);
|
|
769
769
|
}
|
|
770
770
|
throw new Error(`sessionHandlerService was not initialized. Error: ${sessionError.code}`);
|
|
771
771
|
}
|
|
@@ -860,11 +860,7 @@ class SmartSessionService {
|
|
|
860
860
|
async startSession() {
|
|
861
861
|
let sessionInfo = await this.apiService.startSession().toPromise();
|
|
862
862
|
if (sessionInfo) {
|
|
863
|
-
this.
|
|
864
|
-
this.token = sessionInfo.sid;
|
|
865
|
-
this.saveTokenToLocalStorage();
|
|
866
|
-
this.setAuthenticationStatus();
|
|
867
|
-
this.setUpTokenForSessionService();
|
|
863
|
+
this.updateSessionInfo(sessionInfo);
|
|
868
864
|
}
|
|
869
865
|
return this.sessionInfoData;
|
|
870
866
|
}
|
|
@@ -883,26 +879,34 @@ class SmartSessionService {
|
|
|
883
879
|
if (!refreshToken) {
|
|
884
880
|
return await this.startSession();
|
|
885
881
|
}
|
|
886
|
-
|
|
887
|
-
.refreshSession({
|
|
888
|
-
|
|
889
|
-
|
|
890
|
-
|
|
891
|
-
.catch(async (error) => {
|
|
892
|
-
if (error.error &&
|
|
893
|
-
error.error.code &&
|
|
894
|
-
error.error.code === 'session.refreshtoken.invalid') {
|
|
895
|
-
await this.startSession();
|
|
882
|
+
try {
|
|
883
|
+
const sessionInfo = await lastValueFrom(this.apiService.refreshSession({ refreshToken }));
|
|
884
|
+
if (sessionInfo) {
|
|
885
|
+
this.updateSessionInfo(sessionInfo);
|
|
886
|
+
return sessionInfo;
|
|
896
887
|
}
|
|
897
|
-
});
|
|
898
|
-
if (sessionInfo) {
|
|
899
|
-
this.sessionInfoData = sessionInfo;
|
|
900
|
-
this.token = sessionInfo.sid;
|
|
901
|
-
this.saveTokenToLocalStorage();
|
|
902
|
-
this.setAuthenticationStatus();
|
|
903
|
-
this.setUpTokenForSessionService();
|
|
904
888
|
}
|
|
905
|
-
|
|
889
|
+
catch (error) {
|
|
890
|
+
if (this.isInvalidRefreshTokenError(error)) {
|
|
891
|
+
this.clearAndStartNewSession();
|
|
892
|
+
// still throw the error, so the error can be handled in the caller
|
|
893
|
+
}
|
|
894
|
+
throw error;
|
|
895
|
+
}
|
|
896
|
+
// no sessionInfo returned
|
|
897
|
+
throw new Error('Unable to refresh session');
|
|
898
|
+
}
|
|
899
|
+
updateSessionInfo(sessionInfo) {
|
|
900
|
+
this.sessionInfoData = sessionInfo;
|
|
901
|
+
this.token = sessionInfo.sid;
|
|
902
|
+
this.saveTokenToLocalStorage();
|
|
903
|
+
this.setAuthenticationStatus();
|
|
904
|
+
this.setUpTokenForSessionService();
|
|
905
|
+
}
|
|
906
|
+
isInvalidRefreshTokenError(error) {
|
|
907
|
+
return (error instanceof HttpErrorResponse &&
|
|
908
|
+
error.error &&
|
|
909
|
+
error.error.code === 'session.refreshtoken.invalid');
|
|
906
910
|
}
|
|
907
911
|
async getAuthenticationProviders() {
|
|
908
912
|
let providers = await this.apiService
|
|
@@ -3286,52 +3290,68 @@ class SmartErrorCatchingInterceptor {
|
|
|
3286
3290
|
this.session = session;
|
|
3287
3291
|
this.sessionErrorCodes = [
|
|
3288
3292
|
{
|
|
3289
|
-
code:
|
|
3293
|
+
code: 'session.expired',
|
|
3290
3294
|
behaviour: SessionErrorBehaviour.REFRESH,
|
|
3291
3295
|
},
|
|
3292
3296
|
{
|
|
3293
|
-
code:
|
|
3297
|
+
code: 'session.refreshtoken.invalid',
|
|
3294
3298
|
behaviour: SessionErrorBehaviour.RESTART,
|
|
3295
3299
|
},
|
|
3296
3300
|
{
|
|
3297
|
-
code:
|
|
3301
|
+
code: 'session.badrequest.missingtoken',
|
|
3298
3302
|
behaviour: SessionErrorBehaviour.RESTART,
|
|
3299
3303
|
},
|
|
3300
3304
|
{
|
|
3301
|
-
code:
|
|
3305
|
+
code: 'session.security.nocontext',
|
|
3302
3306
|
behaviour: SessionErrorBehaviour.RESTART,
|
|
3303
3307
|
},
|
|
3304
3308
|
{
|
|
3305
|
-
code:
|
|
3309
|
+
code: 'session.invalidsessionuri',
|
|
3306
3310
|
behaviour: SessionErrorBehaviour.RESTART,
|
|
3307
3311
|
},
|
|
3308
3312
|
{
|
|
3309
|
-
code:
|
|
3313
|
+
code: 'session.notinitialized',
|
|
3310
3314
|
behaviour: SessionErrorBehaviour.RESTART,
|
|
3311
3315
|
},
|
|
3312
3316
|
{
|
|
3313
|
-
code:
|
|
3317
|
+
code: 'session.viewcontext.missing',
|
|
3314
3318
|
behaviour: SessionErrorBehaviour.RESTART,
|
|
3315
3319
|
},
|
|
3316
3320
|
];
|
|
3317
3321
|
}
|
|
3318
3322
|
intercept(request, next) {
|
|
3319
|
-
return next
|
|
3320
|
-
|
|
3321
|
-
|
|
3322
|
-
|
|
3323
|
-
|
|
3324
|
-
|
|
3325
|
-
|
|
3326
|
-
|
|
3327
|
-
|
|
3328
|
-
|
|
3329
|
-
return next.handle(request);
|
|
3330
|
-
}
|
|
3331
|
-
|
|
3323
|
+
return next
|
|
3324
|
+
.handle(request)
|
|
3325
|
+
.pipe(catchError$1((error) => this.handleError(error, request, next)));
|
|
3326
|
+
}
|
|
3327
|
+
handleError(error, request, next) {
|
|
3328
|
+
if (this.isSessionError(error)) {
|
|
3329
|
+
const sessionError = this.getSessionError(error);
|
|
3330
|
+
if (sessionError) {
|
|
3331
|
+
return this.resolveError(sessionError).pipe(switchMap((resolved) => {
|
|
3332
|
+
if (resolved && sessionError.behaviour === SessionErrorBehaviour.REFRESH) {
|
|
3333
|
+
return next.handle(this.updateRequestHeaders(request));
|
|
3334
|
+
}
|
|
3335
|
+
return throwError(() => error);
|
|
3336
|
+
}), catchError$1((resolveError) => {
|
|
3337
|
+
// when the resolveError throws a restart error (in the refreshSession), rethrow the original error
|
|
3338
|
+
if (this.isSessionError(resolveError)) {
|
|
3339
|
+
const resolveSessionError = this.getSessionError(resolveError);
|
|
3340
|
+
if (resolveSessionError?.behaviour === SessionErrorBehaviour.RESTART) {
|
|
3341
|
+
return throwError(() => error);
|
|
3342
|
+
}
|
|
3343
|
+
}
|
|
3344
|
+
return throwError(() => resolveError);
|
|
3345
|
+
}));
|
|
3332
3346
|
}
|
|
3333
|
-
|
|
3334
|
-
|
|
3347
|
+
}
|
|
3348
|
+
return throwError(() => error);
|
|
3349
|
+
}
|
|
3350
|
+
isSessionError(error) {
|
|
3351
|
+
return error.status === 400 && error.error.code != null;
|
|
3352
|
+
}
|
|
3353
|
+
getSessionError(error) {
|
|
3354
|
+
return this.sessionErrorCodes.find((sessionError) => sessionError.code === error.error.code);
|
|
3335
3355
|
}
|
|
3336
3356
|
resolveError(sessionError) {
|
|
3337
3357
|
if (sessionError.behaviour === SessionErrorBehaviour.RESTART) {
|
|
@@ -3339,6 +3359,14 @@ class SmartErrorCatchingInterceptor {
|
|
|
3339
3359
|
}
|
|
3340
3360
|
return from(this.session.refreshSession());
|
|
3341
3361
|
}
|
|
3362
|
+
updateRequestHeaders(request) {
|
|
3363
|
+
this.session.headerParams.forEach((headerParam) => {
|
|
3364
|
+
request = request.clone({
|
|
3365
|
+
headers: request.headers.set(headerParam.headerName, headerParam.value),
|
|
3366
|
+
});
|
|
3367
|
+
});
|
|
3368
|
+
return request;
|
|
3369
|
+
}
|
|
3342
3370
|
}
|
|
3343
3371
|
SmartErrorCatchingInterceptor.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: SmartErrorCatchingInterceptor, deps: [{ token: SmartSessionService }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
3344
3372
|
SmartErrorCatchingInterceptor.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: SmartErrorCatchingInterceptor });
|
|
@@ -5942,8 +5970,12 @@ let SmartComponentApiClient = class SmartComponentApiClient {
|
|
|
5942
5970
|
this._destroy$.next();
|
|
5943
5971
|
this._destroy$.complete();
|
|
5944
5972
|
}
|
|
5973
|
+
_ngAfterViewInit() {
|
|
5974
|
+
this.changeDetector = this.inject.get(ChangeDetectorRef);
|
|
5975
|
+
}
|
|
5945
5976
|
initComponentByModel() {
|
|
5946
5977
|
this.initData();
|
|
5978
|
+
this.changeDetector?.detectChanges();
|
|
5947
5979
|
this.initActions();
|
|
5948
5980
|
// TODO: layout, valueSet, widgets
|
|
5949
5981
|
}
|
|
@@ -6219,6 +6251,9 @@ class SmartComponent extends SmartComponentApiClient {
|
|
|
6219
6251
|
ngOnDestroy() {
|
|
6220
6252
|
this._ngOnDestroy();
|
|
6221
6253
|
}
|
|
6254
|
+
ngAfterViewInit() {
|
|
6255
|
+
this._ngAfterViewInit();
|
|
6256
|
+
}
|
|
6222
6257
|
}
|
|
6223
6258
|
SmartComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: SmartComponent, deps: [{ token: i0.Injector }, { token: SmartAuthService }, { token: 'pageName' }], target: i0.ɵɵFactoryTarget.Component });
|
|
6224
6259
|
SmartComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: SmartComponent, selector: "ng-component", usesInheritance: true, ngImport: i0, template: '', isInline: true });
|
|
@@ -6245,6 +6280,9 @@ class SmartService extends SmartComponentApiClient {
|
|
|
6245
6280
|
ngOnDestroy() {
|
|
6246
6281
|
this._ngOnDestroy();
|
|
6247
6282
|
}
|
|
6283
|
+
ngAfterViewInit() {
|
|
6284
|
+
this._ngAfterViewInit();
|
|
6285
|
+
}
|
|
6248
6286
|
}
|
|
6249
6287
|
SmartService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: SmartService, deps: [{ token: i0.Injector }, { token: SmartAuthService }, { token: 'pageName' }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
6250
6288
|
SmartService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: SmartService, providedIn: 'root' });
|