@ascentgl/ads-identity 0.0.2
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/README.md +3 -0
- package/fesm2022/ascentgl-ads-identity.mjs +312 -0
- package/fesm2022/ascentgl-ads-identity.mjs.map +1 -0
- package/index.d.ts +4 -0
- package/lib/guards/auth-callback.guard.d.ts +2 -0
- package/lib/guards/auth.guard.d.ts +2 -0
- package/lib/helpers/error.helper.d.ts +4 -0
- package/lib/helpers/log.helper.d.ts +10 -0
- package/lib/helpers/request.helper.d.ts +11 -0
- package/lib/helpers/token.helper.d.ts +5 -0
- package/lib/interceptors/request.interceptor.d.ts +3 -0
- package/lib/interceptors/response.interceptor.d.ts +3 -0
- package/lib/providers/identity.provider.d.ts +5 -0
- package/lib/services/identity.service.d.ts +12 -0
- package/lib/services/token.service.d.ts +17 -0
- package/lib/types/global-types.d.ts +17 -0
- package/lib/types/internal-consts.d.ts +3 -0
- package/lib/types/internal-enums.d.ts +4 -0
- package/lib/types/internal-types.d.ts +12 -0
- package/package.json +31 -0
package/README.md
ADDED
|
@@ -0,0 +1,312 @@
|
|
|
1
|
+
import { HttpErrorResponse, HttpClient, provideHttpClient, withInterceptors } from '@angular/common/http';
|
|
2
|
+
import { throwError, of, catchError, map, switchMap } from 'rxjs';
|
|
3
|
+
import * as i0 from '@angular/core';
|
|
4
|
+
import { InjectionToken, inject, Injectable, Injector } from '@angular/core';
|
|
5
|
+
import { jwtDecode, InvalidTokenError } from 'jwt-decode';
|
|
6
|
+
import { Router } from '@angular/router';
|
|
7
|
+
|
|
8
|
+
class LogHelper {
|
|
9
|
+
static { this.prefix = 'ADS-IDENTITY:'; }
|
|
10
|
+
static log(...args) {
|
|
11
|
+
if (this.options?.debugMode)
|
|
12
|
+
console.log(...args);
|
|
13
|
+
}
|
|
14
|
+
static warn(...args) {
|
|
15
|
+
if (this.options?.debugMode)
|
|
16
|
+
console.warn(...args);
|
|
17
|
+
}
|
|
18
|
+
static groupStart(...data) {
|
|
19
|
+
if (this.options?.debugMode)
|
|
20
|
+
console.group(this.prefix, ...data);
|
|
21
|
+
}
|
|
22
|
+
static groupEnd() {
|
|
23
|
+
if (this.options?.debugMode)
|
|
24
|
+
console.groupEnd();
|
|
25
|
+
}
|
|
26
|
+
static error(...args) {
|
|
27
|
+
if (this.options?.debugMode)
|
|
28
|
+
console.error(...args);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
class ErrorHelper {
|
|
33
|
+
static { this.throw = (error) => {
|
|
34
|
+
return throwError(() => {
|
|
35
|
+
LogHelper.groupEnd();
|
|
36
|
+
return error;
|
|
37
|
+
});
|
|
38
|
+
}; }
|
|
39
|
+
static extractMessage(error) {
|
|
40
|
+
if (typeof error === 'string') {
|
|
41
|
+
return error;
|
|
42
|
+
}
|
|
43
|
+
let errorMessage;
|
|
44
|
+
if (error instanceof HttpErrorResponse) {
|
|
45
|
+
errorMessage = error.error?.message ?? error.message;
|
|
46
|
+
}
|
|
47
|
+
if (!errorMessage &&
|
|
48
|
+
typeof error === 'object' &&
|
|
49
|
+
typeof error['message'] === 'string') {
|
|
50
|
+
errorMessage = error['message'];
|
|
51
|
+
}
|
|
52
|
+
return errorMessage && typeof errorMessage === 'string'
|
|
53
|
+
? errorMessage
|
|
54
|
+
: 'Unknown server error';
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
class TokenHelper {
|
|
59
|
+
static getPayload(token, verifyClaims = {}, threshold = 0) {
|
|
60
|
+
const payload = jwtDecode(token);
|
|
61
|
+
if (this.isExpired(payload, 'exp', threshold)) {
|
|
62
|
+
throw new InvalidTokenError('Token expired');
|
|
63
|
+
}
|
|
64
|
+
Object.keys(verifyClaims).forEach((claim) => {
|
|
65
|
+
const tokenClaimValue = payload[claim];
|
|
66
|
+
const requestedClaimValue = verifyClaims[claim];
|
|
67
|
+
if (tokenClaimValue !== requestedClaimValue) {
|
|
68
|
+
throw new InvalidTokenError(`Invalid "${claim}" claim value "${tokenClaimValue}" provided in token. Required value is "${requestedClaimValue}"`);
|
|
69
|
+
}
|
|
70
|
+
});
|
|
71
|
+
return payload;
|
|
72
|
+
}
|
|
73
|
+
static isExpired(token, column = 'exp', threshold = 0) {
|
|
74
|
+
const throwInvalidColumnError = (column) => {
|
|
75
|
+
throw new InvalidTokenError(`Column ${column} does not contain a valid number`);
|
|
76
|
+
};
|
|
77
|
+
try {
|
|
78
|
+
let timestamp = token[column];
|
|
79
|
+
if (typeof timestamp === 'number') {
|
|
80
|
+
if (threshold) {
|
|
81
|
+
timestamp -= threshold;
|
|
82
|
+
}
|
|
83
|
+
return !!timestamp && timestamp * 1000 < new Date().getTime();
|
|
84
|
+
}
|
|
85
|
+
throwInvalidColumnError(column.toString());
|
|
86
|
+
return true;
|
|
87
|
+
}
|
|
88
|
+
catch (error) {
|
|
89
|
+
LogHelper.error(new InvalidTokenError(ErrorHelper.extractMessage(error)));
|
|
90
|
+
return true;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
const IDENTITY_OPTIONS = new InjectionToken('IDENTITY_OPTIONS');
|
|
96
|
+
|
|
97
|
+
class TokenService {
|
|
98
|
+
constructor() {
|
|
99
|
+
this.accessToken = null;
|
|
100
|
+
this.refreshToken = null;
|
|
101
|
+
this.options = inject(IDENTITY_OPTIONS);
|
|
102
|
+
}
|
|
103
|
+
setAccessToken(token) {
|
|
104
|
+
return this.accessToken = this.setToken("IDMS_AccessToken", token);
|
|
105
|
+
}
|
|
106
|
+
setRefreshToken(token) {
|
|
107
|
+
return this.refreshToken = this.setToken("IDMS_RefreshToken", token);
|
|
108
|
+
}
|
|
109
|
+
getAccessToken() {
|
|
110
|
+
return this.accessToken = this.getToken("IDMS_AccessToken", this.accessToken?.token);
|
|
111
|
+
}
|
|
112
|
+
getRefreshToken() {
|
|
113
|
+
return this.refreshToken = this.getToken("IDMS_RefreshToken", this.refreshToken?.token);
|
|
114
|
+
}
|
|
115
|
+
setToken(key, token) {
|
|
116
|
+
if (typeof token !== 'string') {
|
|
117
|
+
throw new InvalidTokenError(`Provided ${key} value is not a string`);
|
|
118
|
+
}
|
|
119
|
+
const identityToken = this.wrapToken(key, token, true);
|
|
120
|
+
if (identityToken) {
|
|
121
|
+
localStorage.setItem(key, token);
|
|
122
|
+
}
|
|
123
|
+
return identityToken;
|
|
124
|
+
}
|
|
125
|
+
getToken(key, token) {
|
|
126
|
+
const actualToken = token ?? localStorage.getItem(key) ?? null;
|
|
127
|
+
if (typeof actualToken === 'string') {
|
|
128
|
+
return this.wrapToken(key, actualToken, false);
|
|
129
|
+
}
|
|
130
|
+
LogHelper.log(key, 'not provided and not found in Local Storage');
|
|
131
|
+
return null;
|
|
132
|
+
}
|
|
133
|
+
wrapToken(key, token, throwError) {
|
|
134
|
+
try {
|
|
135
|
+
const payload = TokenHelper.getPayload(token, {
|
|
136
|
+
iss: this.options.backendUrl + '/api',
|
|
137
|
+
sub: this.options.application
|
|
138
|
+
}, 10);
|
|
139
|
+
const identityToken = { token, payload: payload };
|
|
140
|
+
LogHelper.log(key, identityToken);
|
|
141
|
+
return identityToken;
|
|
142
|
+
}
|
|
143
|
+
catch (error) {
|
|
144
|
+
if (throwError) {
|
|
145
|
+
throw error;
|
|
146
|
+
}
|
|
147
|
+
LogHelper.error(error);
|
|
148
|
+
return null;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: TokenService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
152
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: TokenService, providedIn: 'root' }); }
|
|
153
|
+
}
|
|
154
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: TokenService, decorators: [{
|
|
155
|
+
type: Injectable,
|
|
156
|
+
args: [{ providedIn: 'root' }]
|
|
157
|
+
}] });
|
|
158
|
+
|
|
159
|
+
class IdentityService {
|
|
160
|
+
constructor() {
|
|
161
|
+
this.tokenService = inject(TokenService);
|
|
162
|
+
this.httpClient = inject(HttpClient);
|
|
163
|
+
this.options = inject(IDENTITY_OPTIONS);
|
|
164
|
+
}
|
|
165
|
+
isAuthenticated(caller) {
|
|
166
|
+
LogHelper.groupStart(`Verifying access token for ${caller}`);
|
|
167
|
+
const accessToken = this.tokenService.getAccessToken();
|
|
168
|
+
if (accessToken) {
|
|
169
|
+
LogHelper.groupEnd();
|
|
170
|
+
return of(accessToken);
|
|
171
|
+
}
|
|
172
|
+
LogHelper.groupEnd();
|
|
173
|
+
LogHelper.groupStart(`Getting refresh token for ${caller}`);
|
|
174
|
+
if (this.tokenService.getRefreshToken()) {
|
|
175
|
+
LogHelper.groupEnd();
|
|
176
|
+
return this.refreshTokens(caller);
|
|
177
|
+
}
|
|
178
|
+
return ErrorHelper.throw(new InvalidTokenError('No valid tokens found'));
|
|
179
|
+
}
|
|
180
|
+
refreshTokens(caller) {
|
|
181
|
+
LogHelper.groupStart(`Refreshing tokens for ${caller}`);
|
|
182
|
+
const refreshToken = this.tokenService.getRefreshToken();
|
|
183
|
+
if (!refreshToken) {
|
|
184
|
+
return ErrorHelper.throw(new InvalidTokenError('No refresh token found'));
|
|
185
|
+
}
|
|
186
|
+
const endpoint = `${this.options.backendUrl}/api/v${this.options.apiVersion ?? 1}/refresh-token`;
|
|
187
|
+
LogHelper.log(`Calling ${endpoint} to get new tokens`);
|
|
188
|
+
return this.httpClient
|
|
189
|
+
.get(endpoint, {
|
|
190
|
+
headers: { 'Authorization': `Bearer ${refreshToken.token}` }
|
|
191
|
+
})
|
|
192
|
+
.pipe(catchError((error) => {
|
|
193
|
+
LogHelper.error(new InvalidTokenError(`Failed to obtain tokens. Reason: ${ErrorHelper.extractMessage(error).toLowerCase()}`));
|
|
194
|
+
return ErrorHelper.throw(error);
|
|
195
|
+
}), map((response) => {
|
|
196
|
+
const accessToken = this.tokenService.setAccessToken(response.access_token);
|
|
197
|
+
this.tokenService.setRefreshToken(response.refresh_token);
|
|
198
|
+
if (accessToken) {
|
|
199
|
+
LogHelper.groupEnd();
|
|
200
|
+
return accessToken;
|
|
201
|
+
}
|
|
202
|
+
throw new InvalidTokenError('Could not set access token');
|
|
203
|
+
}));
|
|
204
|
+
}
|
|
205
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: IdentityService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
206
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: IdentityService, providedIn: 'root' }); }
|
|
207
|
+
}
|
|
208
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: IdentityService, decorators: [{
|
|
209
|
+
type: Injectable,
|
|
210
|
+
args: [{ providedIn: 'root' }]
|
|
211
|
+
}] });
|
|
212
|
+
|
|
213
|
+
class RequestHelper {
|
|
214
|
+
static isIdentityEndpointRequest(request) {
|
|
215
|
+
return request.url.startsWith(this.options?.backendUrl ?? '');
|
|
216
|
+
}
|
|
217
|
+
static isAuthorizedRequest(request) {
|
|
218
|
+
return !this.options?.requestFilter || this.options.requestFilter(request);
|
|
219
|
+
}
|
|
220
|
+
static isAuthorizationError(error) {
|
|
221
|
+
return error instanceof HttpErrorResponse && error.status === 401;
|
|
222
|
+
}
|
|
223
|
+
static attachAuthorizationHeader(request, accessToken) {
|
|
224
|
+
return request.clone({
|
|
225
|
+
setHeaders: { authorization: `Bearer ${accessToken.token}` }
|
|
226
|
+
});
|
|
227
|
+
}
|
|
228
|
+
static onAuthorizationError(error, injector) {
|
|
229
|
+
if (this.options?.onAuthorizationError) {
|
|
230
|
+
console.log('BOO');
|
|
231
|
+
this.options?.onAuthorizationError(error, injector);
|
|
232
|
+
}
|
|
233
|
+
return throwError(() => error);
|
|
234
|
+
}
|
|
235
|
+
;
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
function requestInterceptor(request, next) {
|
|
239
|
+
const identityService = inject(IdentityService);
|
|
240
|
+
const injector = inject(Injector);
|
|
241
|
+
if (RequestHelper.isIdentityEndpointRequest(request) ||
|
|
242
|
+
!RequestHelper.isAuthorizedRequest(request)) {
|
|
243
|
+
return next(request);
|
|
244
|
+
}
|
|
245
|
+
return identityService.isAuthenticated(`Request Interceptor (${request.url})`).pipe(catchError((error) => RequestHelper.onAuthorizationError(error, injector)), switchMap(accessToken => next(RequestHelper.attachAuthorizationHeader(request, accessToken))));
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
function responseInterceptor(request, next) {
|
|
249
|
+
const options = inject(IDENTITY_OPTIONS);
|
|
250
|
+
const identityService = inject(IdentityService);
|
|
251
|
+
const injector = inject(Injector);
|
|
252
|
+
return next(request).pipe(catchError((error) => {
|
|
253
|
+
if (RequestHelper.isIdentityEndpointRequest(request) ||
|
|
254
|
+
!RequestHelper.isAuthorizedRequest(request) ||
|
|
255
|
+
!RequestHelper.isAuthorizationError(error)) {
|
|
256
|
+
return throwError(() => error);
|
|
257
|
+
}
|
|
258
|
+
if (!options.refreshTokenOnAuthError) {
|
|
259
|
+
return RequestHelper.onAuthorizationError(error, injector);
|
|
260
|
+
}
|
|
261
|
+
return identityService.refreshTokens('Response Interceptor').pipe(switchMap((accessToken) => next(RequestHelper.attachAuthorizationHeader(request, accessToken))), catchError((error) => RequestHelper.onAuthorizationError(error, injector)));
|
|
262
|
+
}));
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
function provideIdentity(options) {
|
|
266
|
+
LogHelper.options = options;
|
|
267
|
+
RequestHelper.options = options;
|
|
268
|
+
return [
|
|
269
|
+
{ provide: IDENTITY_OPTIONS, useValue: options },
|
|
270
|
+
provideHttpClient(withInterceptors([requestInterceptor, responseInterceptor]))
|
|
271
|
+
];
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
const IDENTITY_AUTH_GUARD = (_route, state) => {
|
|
275
|
+
const identityService = inject(IdentityService);
|
|
276
|
+
const options = inject(IDENTITY_OPTIONS);
|
|
277
|
+
return identityService.isAuthenticated(`Auth Guard (${state.url})`).pipe(catchError(() => {
|
|
278
|
+
LogHelper.groupStart('Redirecting to IDMS to login');
|
|
279
|
+
const redirectUrl = `${options.frontendUrl}/apps/${options.application}?redirect=true&redirect_path=${encodeURIComponent(state.url)}`;
|
|
280
|
+
LogHelper.log('Redirect url:', redirectUrl);
|
|
281
|
+
window.location.href = redirectUrl;
|
|
282
|
+
LogHelper.groupEnd();
|
|
283
|
+
return of(null);
|
|
284
|
+
}), map((accessToken) => !!accessToken));
|
|
285
|
+
};
|
|
286
|
+
|
|
287
|
+
const IDENTITY_AUTH_CALLBACK_GUARD = (route) => {
|
|
288
|
+
const router = inject(Router);
|
|
289
|
+
const tokenService = inject(TokenService);
|
|
290
|
+
try {
|
|
291
|
+
LogHelper.groupStart('Storing new tokens');
|
|
292
|
+
const accessToken = tokenService.setAccessToken(route.queryParams['access_token']);
|
|
293
|
+
LogHelper.log("IDMS_AccessToken", accessToken);
|
|
294
|
+
const refreshToken = tokenService.setRefreshToken(route.queryParams['refresh_token']);
|
|
295
|
+
LogHelper.log("IDMS_RefreshToken", refreshToken);
|
|
296
|
+
const redirectPath = route.queryParams['redirect_path'] || '/';
|
|
297
|
+
LogHelper.log(`Redirecting to ${redirectPath}`);
|
|
298
|
+
LogHelper.groupEnd();
|
|
299
|
+
return router.navigateByUrl(route.queryParams['redirect_path'] || '/');
|
|
300
|
+
}
|
|
301
|
+
catch (error) {
|
|
302
|
+
const routerOutlet = document.body.querySelector('router-outlet');
|
|
303
|
+
if (routerOutlet) {
|
|
304
|
+
routerOutlet.innerHTML = ErrorHelper.extractMessage(error);
|
|
305
|
+
}
|
|
306
|
+
LogHelper.error(error);
|
|
307
|
+
return false;
|
|
308
|
+
}
|
|
309
|
+
};
|
|
310
|
+
|
|
311
|
+
export { IDENTITY_AUTH_CALLBACK_GUARD, IDENTITY_AUTH_GUARD, provideIdentity };
|
|
312
|
+
//# sourceMappingURL=ascentgl-ads-identity.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ascentgl-ads-identity.mjs","sources":["../../../../libs/ads-identity/src/lib/helpers/log.helper.ts","../../../../libs/ads-identity/src/lib/helpers/error.helper.ts","../../../../libs/ads-identity/src/lib/helpers/token.helper.ts","../../../../libs/ads-identity/src/lib/types/internal-consts.ts","../../../../libs/ads-identity/src/lib/services/token.service.ts","../../../../libs/ads-identity/src/lib/services/identity.service.ts","../../../../libs/ads-identity/src/lib/helpers/request.helper.ts","../../../../libs/ads-identity/src/lib/interceptors/request.interceptor.ts","../../../../libs/ads-identity/src/lib/interceptors/response.interceptor.ts","../../../../libs/ads-identity/src/lib/providers/identity.provider.ts","../../../../libs/ads-identity/src/lib/guards/auth.guard.ts","../../../../libs/ads-identity/src/lib/guards/auth-callback.guard.ts"],"sourcesContent":["import { IdentityOptions } from '../types/global-types';\r\n\r\nexport class LogHelper {\r\n\r\n static options?: IdentityOptions;\r\n\r\n private static readonly prefix = 'ADS-IDENTITY:';\r\n\r\n static log(...args: unknown[]) {\r\n if (this.options?.debugMode) console.log(...args);\r\n }\r\n\r\n static warn(...args: unknown[]) {\r\n if (this.options?.debugMode) console.warn(...args);\r\n }\r\n\r\n static groupStart(...data: unknown[]) {\r\n if (this.options?.debugMode) console.group(this.prefix, ...data);\r\n }\r\n\r\n static groupEnd() {\r\n if (this.options?.debugMode) console.groupEnd();\r\n }\r\n\r\n static error(...args: unknown[]) {\r\n if (this.options?.debugMode) console.error(...args);\r\n }\r\n\r\n}\r\n","import { LogHelper } from './log.helper';\r\nimport { throwError } from 'rxjs';\r\nimport { HttpErrorResponse } from '@angular/common/http';\r\nimport { GenericCollection } from '../types/internal-types';\r\n\r\nexport class ErrorHelper {\r\n\r\n static throw = (error: unknown) => {\r\n\r\n /**\r\n * return \"throwError\" observable that can be used in reactive requests\r\n */\r\n return throwError(() => {\r\n\r\n LogHelper.groupEnd();\r\n\r\n return error;\r\n\r\n });\r\n };\r\n\r\n static extractMessage(error: unknown): string {\r\n\r\n if (typeof error === 'string') {\r\n return error;\r\n }\r\n\r\n let errorMessage: unknown;\r\n\r\n if (error instanceof HttpErrorResponse) {\r\n errorMessage = error.error?.message ?? error.message;\r\n }\r\n\r\n if (\r\n !errorMessage &&\r\n typeof error === 'object' &&\r\n typeof (<GenericCollection>error)['message'] === 'string'\r\n ) {\r\n errorMessage = (<GenericCollection>error)['message'];\r\n }\r\n\r\n return errorMessage && typeof errorMessage === 'string'\r\n ? errorMessage\r\n : 'Unknown server error';\r\n }\r\n}\r\n","import { InvalidTokenError, jwtDecode, JwtPayload } from 'jwt-decode';\r\nimport { JwtClaim } from '../types/internal-types';\r\nimport { LogHelper } from './log.helper';\r\nimport { ErrorHelper } from './error.helper';\r\n\r\nexport class TokenHelper {\r\n\r\n static getPayload<T extends JwtPayload>(\r\n token: string,\r\n verifyClaims: Partial<JwtPayload> = {},\r\n threshold = 0\r\n ): T {\r\n\r\n const payload = jwtDecode(token) satisfies T;\r\n\r\n /**\r\n * throw error if token is expired\r\n */\r\n if (this.isExpired(payload, 'exp', threshold)) {\r\n throw new InvalidTokenError('Token expired');\r\n }\r\n\r\n /**\r\n * loop through claims to verify and make sure the payload match their values\r\n */\r\n (<JwtClaim[]>Object.keys(verifyClaims)).forEach((claim) => {\r\n\r\n const tokenClaimValue = payload[claim];\r\n const requestedClaimValue = verifyClaims[claim];\r\n\r\n if (tokenClaimValue !== requestedClaimValue) {\r\n throw new InvalidTokenError(`Invalid \"${claim}\" claim value \"${tokenClaimValue}\" provided in token. Required value is \"${requestedClaimValue}\"`);\r\n }\r\n\r\n });\r\n\r\n return payload;\r\n\r\n }\r\n\r\n private static isExpired<T extends JwtPayload>(\r\n token: T,\r\n column: keyof T = 'exp',\r\n threshold = 0\r\n ): boolean {\r\n\r\n const throwInvalidColumnError = (column: string): void => {\r\n throw new InvalidTokenError(\r\n `Column ${column} does not contain a valid number`\r\n );\r\n };\r\n\r\n try {\r\n\r\n /**\r\n * get value from the column\r\n */\r\n let timestamp: unknown = token[column];\r\n\r\n /**\r\n * if values is a number - compare it against current date\r\n */\r\n if (typeof timestamp === 'number') {\r\n\r\n /**\r\n * if threshold is set - extract it from the timestamp\r\n * NOTE: threshold allows to consider the timestamp expired earlier;\r\n * this allows to make sure the token does not expire while being transferred to backend\r\n */\r\n if (threshold) {\r\n timestamp -= threshold;\r\n }\r\n\r\n return !!timestamp && timestamp * 1000 < new Date().getTime();\r\n }\r\n\r\n throwInvalidColumnError(column.toString());\r\n\r\n return true;\r\n } catch (error: unknown) {\r\n\r\n LogHelper.error(new InvalidTokenError(ErrorHelper.extractMessage(error)));\r\n\r\n return true;\r\n }\r\n }\r\n\r\n}\r\n","import { InjectionToken } from '@angular/core';\r\nimport { IdentityOptions } from './global-types';\r\n\r\nexport const IDENTITY_OPTIONS = new InjectionToken<IdentityOptions>('IDENTITY_OPTIONS');\r\n","import { inject, Injectable } from '@angular/core';\r\nimport { Maybe, Nullable } from '../types/internal-types';\r\nimport { IdentityToken } from '../types/global-types';\r\nimport { TokenHelper } from '../helpers/token.helper';\r\nimport { InvalidTokenError } from 'jwt-decode';\r\nimport { IDENTITY_OPTIONS } from '../types/internal-consts';\r\nimport { TokenKey } from '../types/internal-enums';\r\nimport { LogHelper } from '../helpers/log.helper';\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class TokenService {\r\n\r\n private accessToken: Nullable<IdentityToken> = null;\r\n private refreshToken: Nullable<IdentityToken> = null;\r\n\r\n private readonly options = inject(IDENTITY_OPTIONS);\r\n\r\n setAccessToken(token: unknown) {\r\n return this.accessToken = this.setToken(TokenKey.accessToken, token);\r\n }\r\n\r\n setRefreshToken(token: unknown) {\r\n return this.refreshToken = this.setToken(TokenKey.refreshToken, token);\r\n }\r\n\r\n getAccessToken() {\r\n return this.accessToken = this.getToken(TokenKey.accessToken, this.accessToken?.token);\r\n }\r\n\r\n getRefreshToken() {\r\n return this.refreshToken = this.getToken(TokenKey.refreshToken, this.refreshToken?.token);\r\n }\r\n\r\n private setToken(key: TokenKey, token: unknown): Nullable<IdentityToken> {\r\n\r\n /**\r\n * make sure provided token is at least a string\r\n */\r\n if (typeof token !== 'string') {\r\n throw new InvalidTokenError(`Provided ${key} value is not a string`);\r\n }\r\n\r\n /**\r\n * get identity token\r\n */\r\n const identityToken = this.wrapToken(key, token, true);\r\n\r\n /**\r\n * if provided - save it to local storage\r\n */\r\n if (identityToken) {\r\n localStorage.setItem(key, token);\r\n }\r\n\r\n return identityToken;\r\n\r\n }\r\n\r\n private getToken(key: TokenKey, token: Maybe<string>): Nullable<IdentityToken> {\r\n\r\n /**\r\n * either use provided token value or get one from the local storage\r\n */\r\n const actualToken = token ?? localStorage.getItem(key) ?? null;\r\n\r\n if (typeof actualToken === 'string') {\r\n return this.wrapToken(key, actualToken, false);\r\n }\r\n\r\n LogHelper.log(key, 'not provided and not found in Local Storage');\r\n\r\n return null;\r\n\r\n }\r\n\r\n private wrapToken(key: TokenKey, token: string, throwError: boolean): Nullable<IdentityToken> {\r\n\r\n try {\r\n\r\n /**\r\n * parse token and obtain its payload\r\n * NOTE: errors will be thrown if token is expired or has invalid claims\r\n */\r\n const payload = TokenHelper.getPayload(\r\n token,\r\n {\r\n iss: this.options.backendUrl + '/api',\r\n sub: this.options.application\r\n },\r\n 10\r\n );\r\n\r\n /**\r\n * prepare identity token object\r\n */\r\n const identityToken = { token, payload: payload };\r\n\r\n LogHelper.log(key, identityToken);\r\n\r\n return identityToken;\r\n\r\n } catch (error: unknown) {\r\n\r\n if(throwError) {\r\n throw error;\r\n }\r\n\r\n LogHelper.error(error);\r\n\r\n return null;\r\n\r\n }\r\n\r\n }\r\n\r\n}\r\n","import { inject, Injectable } from '@angular/core';\r\nimport { catchError, map, Observable, of } from 'rxjs';\r\nimport { TokenService } from './token.service';\r\nimport { HttpClient } from '@angular/common/http';\r\nimport { IDENTITY_OPTIONS } from '../types/internal-consts';\r\nimport { RefreshTokenResponse } from '../types/internal-types';\r\nimport { LogHelper } from '../helpers/log.helper';\r\nimport { IdentityToken } from '../types/global-types';\r\nimport { InvalidTokenError } from 'jwt-decode';\r\nimport { ErrorHelper } from '../helpers/error.helper';\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class IdentityService {\r\n\r\n private readonly tokenService = inject(TokenService);\r\n private readonly httpClient = inject(HttpClient);\r\n private readonly options = inject(IDENTITY_OPTIONS);\r\n\r\n isAuthenticated(caller: string): Observable<IdentityToken> {\r\n\r\n LogHelper.groupStart(`Verifying access token for ${caller}`);\r\n\r\n /**\r\n * get access token\r\n */\r\n const accessToken = this.tokenService.getAccessToken();\r\n\r\n /**\r\n * if it is available - return it; otherwise try refreshing the tokens by calling IDMS\r\n */\r\n if (accessToken) {\r\n\r\n LogHelper.groupEnd();\r\n\r\n return of(accessToken);\r\n\r\n }\r\n\r\n LogHelper.groupEnd();\r\n\r\n LogHelper.groupStart(`Getting refresh token for ${caller}`);\r\n\r\n /**\r\n * if refresh token is available - try getting new tokens\r\n */\r\n if (this.tokenService.getRefreshToken()) {\r\n\r\n LogHelper.groupEnd();\r\n\r\n return this.refreshTokens(caller);\r\n\r\n }\r\n\r\n /**\r\n * throw error if no tokens are available\r\n */\r\n return ErrorHelper.throw(new InvalidTokenError('No valid tokens found'));\r\n\r\n }\r\n\r\n refreshTokens(caller: string): Observable<IdentityToken> {\r\n\r\n LogHelper.groupStart(`Refreshing tokens for ${caller}`);\r\n\r\n const refreshToken = this.tokenService.getRefreshToken();\r\n\r\n /**\r\n * throw error if refresh token is not available\r\n */\r\n if (!refreshToken) {\r\n return ErrorHelper.throw(new InvalidTokenError('No refresh token found'));\r\n }\r\n\r\n const endpoint = `${this.options.backendUrl}/api/v${this.options.apiVersion ?? 1}/refresh-token`;\r\n\r\n LogHelper.log(`Calling ${endpoint} to get new tokens`);\r\n\r\n /**\r\n * make request to IDMS to get new tokens\r\n */\r\n return this.httpClient\r\n .get<RefreshTokenResponse>(endpoint, {\r\n headers: { 'Authorization': `Bearer ${refreshToken.token}` }\r\n })\r\n .pipe(\r\n catchError((error: unknown) => {\r\n\r\n /**\r\n * log error if it happens\r\n */\r\n LogHelper.error(new InvalidTokenError(`Failed to obtain tokens. Reason: ${ErrorHelper.extractMessage(error).toLowerCase()}`));\r\n\r\n return ErrorHelper.throw(error);\r\n\r\n }),\r\n map((response) => {\r\n\r\n /**\r\n * store new access and refresh tokens\r\n */\r\n const accessToken = this.tokenService.setAccessToken(response.access_token);\r\n this.tokenService.setRefreshToken(response.refresh_token);\r\n\r\n /**\r\n * if new access token is valid - return it\r\n */\r\n if (accessToken) {\r\n\r\n LogHelper.groupEnd();\r\n\r\n return accessToken;\r\n\r\n }\r\n\r\n throw new InvalidTokenError('Could not set access token');\r\n\r\n })\r\n );\r\n\r\n }\r\n\r\n}\r\n","import { HttpErrorResponse, HttpRequest } from '@angular/common/http';\r\nimport { IdentityOptions, IdentityToken } from '../types/global-types';\r\nimport { throwError } from 'rxjs';\r\nimport { Injector } from '@angular/core';\r\n\r\nexport class RequestHelper {\r\n\r\n static options?: IdentityOptions;\r\n\r\n static isIdentityEndpointRequest(request: HttpRequest<unknown>): boolean {\r\n return request.url.startsWith(this.options?.backendUrl ?? '');\r\n }\r\n\r\n static isAuthorizedRequest(request: HttpRequest<unknown>): boolean {\r\n return !this.options?.requestFilter || this.options.requestFilter(request);\r\n }\r\n\r\n static isAuthorizationError(error: unknown): boolean {\r\n return error instanceof HttpErrorResponse && error.status === 401;\r\n }\r\n\r\n static attachAuthorizationHeader(request: HttpRequest<unknown>, accessToken: IdentityToken): HttpRequest<unknown> {\r\n\r\n return request.clone({\r\n setHeaders: { authorization: `Bearer ${accessToken.token}` }\r\n });\r\n\r\n }\r\n\r\n static onAuthorizationError(error: unknown, injector: Injector) {\r\n\r\n if (this.options?.onAuthorizationError) {\r\n console.log('BOO');\r\n this.options?.onAuthorizationError(error, injector);\r\n }\r\n\r\n return throwError(() => error);\r\n\r\n };\r\n\r\n}\r\n","import { HttpEvent, HttpHandlerFn, HttpRequest } from '@angular/common/http';\nimport { catchError, Observable, switchMap } from 'rxjs';\nimport { inject, Injector } from '@angular/core';\nimport { IdentityService } from '../services/identity.service';\nimport { RequestHelper } from '../helpers/request.helper';\n\nexport function requestInterceptor(\n request: HttpRequest<unknown>,\n next: HttpHandlerFn\n): Observable<HttpEvent<unknown>> {\n\n const identityService = inject(IdentityService);\n const injector = inject(Injector)\n\n /**\n * if it is a request to IDMS or not an authorized request - do not modify it\n */\n if (RequestHelper.isIdentityEndpointRequest(request) ||\n !RequestHelper.isAuthorizedRequest(request)) {\n return next(request);\n }\n\n /**\n * if current user is authenticated - attach \"Authorization\" header to the request;\n * or process the error if it happens\n */\n return identityService.isAuthenticated(`Request Interceptor (${request.url})`).pipe(\n catchError((error: unknown) => RequestHelper.onAuthorizationError(error, injector)),\n switchMap(accessToken => next(RequestHelper.attachAuthorizationHeader(request, accessToken))),\n );\n\n\n}\n","import {\n HttpEvent, HttpHandlerFn,\n HttpRequest\n} from '@angular/common/http';\nimport { catchError, Observable, switchMap, throwError } from 'rxjs';\nimport { inject, Injector } from '@angular/core';\nimport { IdentityService } from '../services/identity.service';\nimport { IDENTITY_OPTIONS } from '../types/internal-consts';\nimport { RequestHelper } from '../helpers/request.helper';\n\nexport function responseInterceptor(\n request: HttpRequest<unknown>,\n next: HttpHandlerFn\n): Observable<HttpEvent<unknown>> {\n\n const options = inject(IDENTITY_OPTIONS);\n const identityService = inject(IdentityService);\n const injector = inject(Injector);\n\n /**\n * process all response errors\n */\n return next(request).pipe(\n catchError((error: unknown) => {\n\n /**\n * if error happened with IDMS request, or not-authorized request, or it is not an authorization (401) error -\n * do not change anything and return the error as is\n */\n if (\n RequestHelper.isIdentityEndpointRequest(request) ||\n !RequestHelper.isAuthorizedRequest(request) ||\n !RequestHelper.isAuthorizationError(error)\n ) {\n return throwError(() => error);\n }\n\n /**\n * if options do not allow to try and refresh tokens on error 401 -\n * process the error and return it\n */\n if (!options.refreshTokenOnAuthError) {\n return RequestHelper.onAuthorizationError(error, injector);\n }\n\n /**\n * if tokens were refreshed - attach \"Authorization\" header to the request and call it again;\n * or process the error if it happens\n */\n return identityService.refreshTokens('Response Interceptor').pipe(\n switchMap((accessToken) => next(RequestHelper.attachAuthorizationHeader(request, accessToken))),\n catchError((error: unknown) => RequestHelper.onAuthorizationError(error, injector))\n );\n\n }));\n}\n","import { IdentityOptions } from '../types/global-types';\r\nimport { provideHttpClient, withInterceptors } from '@angular/common/http';\r\nimport { requestInterceptor } from '../interceptors/request.interceptor';\r\nimport { responseInterceptor } from '../interceptors/response.interceptor';\r\nimport { IDENTITY_OPTIONS } from '../types/internal-consts';\r\nimport { LogHelper } from '../helpers/log.helper';\r\nimport { RequestHelper } from '../helpers/request.helper';\r\n\r\nexport function provideIdentity(options: IdentityOptions) {\r\n\r\n LogHelper.options = options;\r\n RequestHelper.options = options;\r\n\r\n return [\r\n { provide: IDENTITY_OPTIONS, useValue: options },\r\n provideHttpClient(withInterceptors([requestInterceptor, responseInterceptor]))\r\n ];\r\n}\r\n","import { CanActivateFn } from '@angular/router';\r\nimport { inject } from '@angular/core';\r\nimport { IdentityService } from '../services/identity.service';\r\nimport { catchError, map, of } from 'rxjs';\r\nimport { IDENTITY_OPTIONS } from '../types/internal-consts';\r\nimport { LogHelper } from '../helpers/log.helper';\r\n\r\nexport const IDENTITY_AUTH_GUARD: CanActivateFn = (_route, state) => {\r\n\r\n const identityService = inject(IdentityService);\r\n const options = inject(IDENTITY_OPTIONS);\r\n\r\n /**\r\n * check if user is authenticated;\r\n * if error happened - redirect to IDMS url to re-login;\r\n * return true on success and false on error\r\n */\r\n return identityService.isAuthenticated(`Auth Guard (${state.url})`).pipe(\r\n catchError(() => {\r\n\r\n LogHelper.groupStart('Redirecting to IDMS to login');\r\n\r\n const redirectUrl = `${options.frontendUrl}/apps/${options.application}?redirect=true&redirect_path=${encodeURIComponent(\r\n state.url\r\n )}`;\r\n\r\n LogHelper.log('Redirect url:', redirectUrl);\r\n\r\n window.location.href = redirectUrl;\r\n\r\n LogHelper.groupEnd();\r\n\r\n return of(null);\r\n\r\n }),\r\n map((accessToken) => !!accessToken));\r\n\r\n};\r\n","import { CanActivateFn, Router } from '@angular/router';\r\nimport { inject } from '@angular/core';\r\nimport { TokenService } from '../services/token.service';\r\nimport { LogHelper } from '../helpers/log.helper';\r\nimport { TokenKey } from '../types/internal-enums';\r\nimport { ErrorHelper } from '../helpers/error.helper';\r\n\r\nexport const IDENTITY_AUTH_CALLBACK_GUARD: CanActivateFn = (route) => {\r\n\r\n const router = inject(Router);\r\n const tokenService = inject(TokenService);\r\n\r\n /**\r\n * save access and refresh tokens and redirect either to root or to provided \"redirect_path\";\r\n * if error happened - display error message on the page and return false to stop further navigation\r\n */\r\n try {\r\n\r\n LogHelper.groupStart('Storing new tokens');\r\n\r\n const accessToken = tokenService.setAccessToken(route.queryParams['access_token']);\r\n\r\n LogHelper.log(TokenKey.accessToken, accessToken);\r\n\r\n const refreshToken = tokenService.setRefreshToken(route.queryParams['refresh_token']);\r\n\r\n LogHelper.log(TokenKey.refreshToken, refreshToken);\r\n\r\n const redirectPath = route.queryParams['redirect_path'] || '/';\r\n\r\n LogHelper.log(`Redirecting to ${redirectPath}`);\r\n\r\n LogHelper.groupEnd();\r\n\r\n return router.navigateByUrl(route.queryParams['redirect_path'] || '/');\r\n\r\n } catch (error: unknown) {\r\n\r\n const routerOutlet = document.body.querySelector('router-outlet');\r\n\r\n if (routerOutlet) {\r\n routerOutlet.innerHTML = ErrorHelper.extractMessage(error);\r\n }\r\n\r\n LogHelper.error(error);\r\n\r\n return false;\r\n\r\n }\r\n\r\n};\r\n"],"names":[],"mappings":"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"}
|
package/index.d.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { IdentityOptions } from '../types/global-types';
|
|
2
|
+
export declare class LogHelper {
|
|
3
|
+
static options?: IdentityOptions;
|
|
4
|
+
private static readonly prefix;
|
|
5
|
+
static log(...args: unknown[]): void;
|
|
6
|
+
static warn(...args: unknown[]): void;
|
|
7
|
+
static groupStart(...data: unknown[]): void;
|
|
8
|
+
static groupEnd(): void;
|
|
9
|
+
static error(...args: unknown[]): void;
|
|
10
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { HttpRequest } from '@angular/common/http';
|
|
2
|
+
import { IdentityOptions, IdentityToken } from '../types/global-types';
|
|
3
|
+
import { Injector } from '@angular/core';
|
|
4
|
+
export declare class RequestHelper {
|
|
5
|
+
static options?: IdentityOptions;
|
|
6
|
+
static isIdentityEndpointRequest(request: HttpRequest<unknown>): boolean;
|
|
7
|
+
static isAuthorizedRequest(request: HttpRequest<unknown>): boolean;
|
|
8
|
+
static isAuthorizationError(error: unknown): boolean;
|
|
9
|
+
static attachAuthorizationHeader(request: HttpRequest<unknown>, accessToken: IdentityToken): HttpRequest<unknown>;
|
|
10
|
+
static onAuthorizationError(error: unknown, injector: Injector): import("rxjs").Observable<never>;
|
|
11
|
+
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { IdentityOptions } from '../types/global-types';
|
|
2
|
+
export declare function provideIdentity(options: IdentityOptions): (import("@angular/core").EnvironmentProviders | {
|
|
3
|
+
provide: import("@angular/core").InjectionToken<IdentityOptions>;
|
|
4
|
+
useValue: IdentityOptions;
|
|
5
|
+
})[];
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { Observable } from 'rxjs';
|
|
2
|
+
import { IdentityToken } from '../types/global-types';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
export declare class IdentityService {
|
|
5
|
+
private readonly tokenService;
|
|
6
|
+
private readonly httpClient;
|
|
7
|
+
private readonly options;
|
|
8
|
+
isAuthenticated(caller: string): Observable<IdentityToken>;
|
|
9
|
+
refreshTokens(caller: string): Observable<IdentityToken>;
|
|
10
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<IdentityService, never>;
|
|
11
|
+
static ɵprov: i0.ɵɵInjectableDeclaration<IdentityService>;
|
|
12
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { Nullable } from '../types/internal-types';
|
|
2
|
+
import { IdentityToken } from '../types/global-types';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
export declare class TokenService {
|
|
5
|
+
private accessToken;
|
|
6
|
+
private refreshToken;
|
|
7
|
+
private readonly options;
|
|
8
|
+
setAccessToken(token: unknown): Nullable<IdentityToken>;
|
|
9
|
+
setRefreshToken(token: unknown): Nullable<IdentityToken>;
|
|
10
|
+
getAccessToken(): Nullable<IdentityToken>;
|
|
11
|
+
getRefreshToken(): Nullable<IdentityToken>;
|
|
12
|
+
private setToken;
|
|
13
|
+
private getToken;
|
|
14
|
+
private wrapToken;
|
|
15
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<TokenService, never>;
|
|
16
|
+
static ɵprov: i0.ɵɵInjectableDeclaration<TokenService>;
|
|
17
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { JwtPayload } from 'jwt-decode';
|
|
2
|
+
import { Injector } from '@angular/core';
|
|
3
|
+
import { HttpRequest } from '@angular/common/http';
|
|
4
|
+
export type IdentityToken = {
|
|
5
|
+
token: string;
|
|
6
|
+
payload: JwtPayload;
|
|
7
|
+
};
|
|
8
|
+
export type IdentityOptions = {
|
|
9
|
+
frontendUrl: string;
|
|
10
|
+
backendUrl: string;
|
|
11
|
+
application: string;
|
|
12
|
+
refreshTokenOnAuthError?: boolean;
|
|
13
|
+
apiVersion?: number;
|
|
14
|
+
debugMode?: boolean;
|
|
15
|
+
requestFilter?: (request: HttpRequest<unknown>) => boolean;
|
|
16
|
+
onAuthorizationError?: (error: unknown, injector: Injector) => void;
|
|
17
|
+
};
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { JwtPayload } from 'jwt-decode';
|
|
2
|
+
export type Nullable<T> = T | null;
|
|
3
|
+
export type Maybe<T> = T | undefined;
|
|
4
|
+
export type GenericCollection<T = unknown, K extends string = string> = Record<K, T>;
|
|
5
|
+
export type JwtClaim = keyof JwtPayload;
|
|
6
|
+
export type RefreshTokenResponse = {
|
|
7
|
+
access_token: string;
|
|
8
|
+
refresh_token: string;
|
|
9
|
+
token_type: string;
|
|
10
|
+
expires_in: string;
|
|
11
|
+
refresh_token_expires_in: string;
|
|
12
|
+
};
|
package/package.json
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@ascentgl/ads-identity",
|
|
3
|
+
"version": "0.0.2",
|
|
4
|
+
"peerDependencies": {
|
|
5
|
+
"@ascentgl/ads-store": ">=0.9.5",
|
|
6
|
+
"jwt-decode": ">=4.0.0"
|
|
7
|
+
},
|
|
8
|
+
"description": "This library was generated with [Nx](https://nx.dev).",
|
|
9
|
+
"main": "jest.config.ts",
|
|
10
|
+
"repository": {
|
|
11
|
+
"type": "git",
|
|
12
|
+
"url": "https://aoddevproj@dev.azure.com/aoddevproj/Ascent_Design_System/_git/Ascent_Design_System"
|
|
13
|
+
},
|
|
14
|
+
"author": "Kirill Krasnobayev",
|
|
15
|
+
"license": "ISC",
|
|
16
|
+
"module": "fesm2022/ascentgl-ads-identity.mjs",
|
|
17
|
+
"typings": "index.d.ts",
|
|
18
|
+
"exports": {
|
|
19
|
+
"./package.json": {
|
|
20
|
+
"default": "./package.json"
|
|
21
|
+
},
|
|
22
|
+
".": {
|
|
23
|
+
"types": "./index.d.ts",
|
|
24
|
+
"default": "./fesm2022/ascentgl-ads-identity.mjs"
|
|
25
|
+
}
|
|
26
|
+
},
|
|
27
|
+
"sideEffects": false,
|
|
28
|
+
"dependencies": {
|
|
29
|
+
"tslib": "^2.3.0"
|
|
30
|
+
}
|
|
31
|
+
}
|