@progalaxyelabs/ngx-stonescriptphp-client 0.0.10 → 1.0.0
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/esm2022/lib/api-connection.service.mjs +159 -24
- package/esm2022/lib/api-response.model.mjs +19 -1
- package/esm2022/lib/csrf.service.mjs +46 -0
- package/esm2022/lib/my-environment.model.mjs +13 -1
- package/esm2022/lib/token.service.mjs +9 -1
- package/esm2022/public-api.mjs +2 -1
- package/fesm2022/progalaxyelabs-ngx-stonescriptphp-client.mjs +240 -24
- package/fesm2022/progalaxyelabs-ngx-stonescriptphp-client.mjs.map +1 -1
- package/lib/api-connection.service.d.ts +15 -1
- package/lib/api-response.model.d.ts +6 -0
- package/lib/csrf.service.d.ts +24 -0
- package/lib/my-environment.model.d.ts +40 -0
- package/lib/token.service.d.ts +2 -0
- package/package.json +1 -1
- package/public-api.d.ts +1 -0
|
@@ -4,14 +4,35 @@ import * as i0 from "@angular/core";
|
|
|
4
4
|
import * as i1 from "./token.service";
|
|
5
5
|
import * as i2 from "./signin-status.service";
|
|
6
6
|
import * as i3 from "./my-environment.model";
|
|
7
|
+
import * as i4 from "./csrf.service";
|
|
7
8
|
export class ApiConnectionService {
|
|
8
|
-
constructor(tokens, signinStatus, environment) {
|
|
9
|
+
constructor(tokens, signinStatus, environment, csrf) {
|
|
9
10
|
this.tokens = tokens;
|
|
10
11
|
this.signinStatus = signinStatus;
|
|
11
12
|
this.environment = environment;
|
|
13
|
+
this.csrf = csrf;
|
|
12
14
|
this.host = ''; // contains trailing slash
|
|
13
15
|
this.accessToken = '';
|
|
14
16
|
this.host = environment.apiServer.host;
|
|
17
|
+
// Set default auth config based on mode
|
|
18
|
+
this.authConfig = {
|
|
19
|
+
mode: environment.auth?.mode || 'cookie',
|
|
20
|
+
refreshEndpoint: environment.auth?.refreshEndpoint,
|
|
21
|
+
useCsrf: environment.auth?.useCsrf,
|
|
22
|
+
refreshTokenCookieName: environment.auth?.refreshTokenCookieName || 'refresh_token',
|
|
23
|
+
csrfTokenCookieName: environment.auth?.csrfTokenCookieName || 'csrf_token',
|
|
24
|
+
csrfHeaderName: environment.auth?.csrfHeaderName || 'X-CSRF-Token'
|
|
25
|
+
};
|
|
26
|
+
// Set default refresh endpoint based on mode if not specified
|
|
27
|
+
if (!this.authConfig.refreshEndpoint) {
|
|
28
|
+
this.authConfig.refreshEndpoint = this.authConfig.mode === 'cookie'
|
|
29
|
+
? '/auth/refresh'
|
|
30
|
+
: '/user/refresh_access';
|
|
31
|
+
}
|
|
32
|
+
// Set default CSRF setting based on mode if not specified
|
|
33
|
+
if (this.authConfig.useCsrf === undefined) {
|
|
34
|
+
this.authConfig.useCsrf = this.authConfig.mode === 'cookie';
|
|
35
|
+
}
|
|
15
36
|
}
|
|
16
37
|
async request(url, options, data) {
|
|
17
38
|
try {
|
|
@@ -68,6 +89,41 @@ export class ApiConnectionService {
|
|
|
68
89
|
};
|
|
69
90
|
return this.request(url, fetchOptions, data);
|
|
70
91
|
}
|
|
92
|
+
async put(pathWithQueryParams, data) {
|
|
93
|
+
const url = this.host + pathWithQueryParams.replace(/^\/+/, '');
|
|
94
|
+
const fetchOptions = {
|
|
95
|
+
method: 'PUT',
|
|
96
|
+
mode: 'cors',
|
|
97
|
+
redirect: 'error',
|
|
98
|
+
headers: {
|
|
99
|
+
'Content-Type': 'application/json'
|
|
100
|
+
},
|
|
101
|
+
body: JSON.stringify(data)
|
|
102
|
+
};
|
|
103
|
+
return this.request(url, fetchOptions, data);
|
|
104
|
+
}
|
|
105
|
+
async patch(pathWithQueryParams, data) {
|
|
106
|
+
const url = this.host + pathWithQueryParams.replace(/^\/+/, '');
|
|
107
|
+
const fetchOptions = {
|
|
108
|
+
method: 'PATCH',
|
|
109
|
+
mode: 'cors',
|
|
110
|
+
redirect: 'error',
|
|
111
|
+
headers: {
|
|
112
|
+
'Content-Type': 'application/json'
|
|
113
|
+
},
|
|
114
|
+
body: JSON.stringify(data)
|
|
115
|
+
};
|
|
116
|
+
return this.request(url, fetchOptions, data);
|
|
117
|
+
}
|
|
118
|
+
async delete(endpoint, queryParamsObj) {
|
|
119
|
+
const url = this.host + endpoint.replace(/^\/+/, '') + this.buildQueryString(queryParamsObj);
|
|
120
|
+
const fetchOptions = {
|
|
121
|
+
method: 'DELETE',
|
|
122
|
+
mode: 'cors',
|
|
123
|
+
redirect: 'error'
|
|
124
|
+
};
|
|
125
|
+
return this.request(url, fetchOptions, null);
|
|
126
|
+
}
|
|
71
127
|
// async postFormWithFiles(pathWithQueryParams: string, formData: FormData): Promise<ApiResponse | null> {
|
|
72
128
|
// const url = this.host + pathWithQueryParams.replace(/^\/+/, '')
|
|
73
129
|
// try {
|
|
@@ -111,35 +167,114 @@ export class ApiConnectionService {
|
|
|
111
167
|
return response;
|
|
112
168
|
}
|
|
113
169
|
async refreshAccessToken() {
|
|
114
|
-
|
|
115
|
-
if (!refreshToken) {
|
|
170
|
+
if (this.authConfig.mode === 'none') {
|
|
116
171
|
return false;
|
|
117
172
|
}
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
173
|
+
if (this.authConfig.mode === 'cookie') {
|
|
174
|
+
return await this.refreshAccessTokenCookieMode();
|
|
175
|
+
}
|
|
176
|
+
else {
|
|
177
|
+
return await this.refreshAccessTokenBodyMode();
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Refresh access token using cookie-based auth (StoneScriptPHP v2.1.x default)
|
|
182
|
+
*/
|
|
183
|
+
async refreshAccessTokenCookieMode() {
|
|
184
|
+
try {
|
|
185
|
+
const refreshTokenUrl = this.host + this.authConfig.refreshEndpoint.replace(/^\/+/, '');
|
|
186
|
+
const headers = {
|
|
124
187
|
'Content-Type': 'application/json'
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
188
|
+
};
|
|
189
|
+
// Add CSRF token if enabled
|
|
190
|
+
if (this.authConfig.useCsrf) {
|
|
191
|
+
const csrfToken = this.csrf.getCsrfToken(this.authConfig.csrfTokenCookieName);
|
|
192
|
+
if (!csrfToken) {
|
|
193
|
+
console.error('CSRF token not found in cookie');
|
|
194
|
+
return false;
|
|
195
|
+
}
|
|
196
|
+
headers[this.authConfig.csrfHeaderName] = csrfToken;
|
|
197
|
+
}
|
|
198
|
+
let refreshTokenResponse = await fetch(refreshTokenUrl, {
|
|
199
|
+
method: 'POST',
|
|
200
|
+
mode: 'cors',
|
|
201
|
+
credentials: 'include',
|
|
202
|
+
redirect: 'error',
|
|
203
|
+
headers: headers
|
|
204
|
+
});
|
|
205
|
+
if (!refreshTokenResponse.ok) {
|
|
206
|
+
this.accessToken = '';
|
|
207
|
+
this.tokens.clear();
|
|
208
|
+
return false;
|
|
209
|
+
}
|
|
210
|
+
let refreshAccessData = await refreshTokenResponse.json();
|
|
211
|
+
if (!refreshAccessData || refreshAccessData.status !== 'ok') {
|
|
212
|
+
return false;
|
|
213
|
+
}
|
|
214
|
+
// Extract access token from response
|
|
215
|
+
const newAccessToken = refreshAccessData.data?.access_token || refreshAccessData.access_token;
|
|
216
|
+
if (!newAccessToken) {
|
|
217
|
+
console.error('No access token in refresh response');
|
|
218
|
+
return false;
|
|
219
|
+
}
|
|
220
|
+
// Store new access token (refresh token is in httpOnly cookie)
|
|
221
|
+
this.tokens.setAccessToken(newAccessToken);
|
|
222
|
+
this.accessToken = newAccessToken;
|
|
223
|
+
return true;
|
|
224
|
+
}
|
|
225
|
+
catch (error) {
|
|
226
|
+
console.error('Token refresh failed (cookie mode):', error);
|
|
132
227
|
this.accessToken = '';
|
|
133
228
|
this.tokens.clear();
|
|
134
229
|
return false;
|
|
135
230
|
}
|
|
136
|
-
|
|
137
|
-
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* Refresh access token using body-based auth (legacy mode)
|
|
234
|
+
*/
|
|
235
|
+
async refreshAccessTokenBodyMode() {
|
|
236
|
+
try {
|
|
237
|
+
const refreshToken = this.tokens.getRefreshToken();
|
|
238
|
+
if (!refreshToken) {
|
|
239
|
+
return false;
|
|
240
|
+
}
|
|
241
|
+
const refreshTokenUrl = this.host + this.authConfig.refreshEndpoint.replace(/^\/+/, '');
|
|
242
|
+
let refreshTokenResponse = await fetch(refreshTokenUrl, {
|
|
243
|
+
method: 'POST',
|
|
244
|
+
mode: 'cors',
|
|
245
|
+
redirect: 'error',
|
|
246
|
+
headers: {
|
|
247
|
+
'Content-Type': 'application/json'
|
|
248
|
+
},
|
|
249
|
+
body: JSON.stringify({
|
|
250
|
+
access_token: this.accessToken,
|
|
251
|
+
refresh_token: refreshToken
|
|
252
|
+
})
|
|
253
|
+
});
|
|
254
|
+
if (!refreshTokenResponse.ok) {
|
|
255
|
+
this.accessToken = '';
|
|
256
|
+
this.tokens.clear();
|
|
257
|
+
return false;
|
|
258
|
+
}
|
|
259
|
+
let refreshAccessData = await refreshTokenResponse.json();
|
|
260
|
+
if (!refreshAccessData) {
|
|
261
|
+
return false;
|
|
262
|
+
}
|
|
263
|
+
const newAccessToken = refreshAccessData.data?.access_token || refreshAccessData.access_token;
|
|
264
|
+
if (!newAccessToken) {
|
|
265
|
+
console.error('No access token in refresh response');
|
|
266
|
+
return false;
|
|
267
|
+
}
|
|
268
|
+
this.tokens.setTokens(newAccessToken, refreshToken);
|
|
269
|
+
this.accessToken = newAccessToken;
|
|
270
|
+
return true;
|
|
271
|
+
}
|
|
272
|
+
catch (error) {
|
|
273
|
+
console.error('Token refresh failed (body mode):', error);
|
|
274
|
+
this.accessToken = '';
|
|
275
|
+
this.tokens.clear();
|
|
138
276
|
return false;
|
|
139
277
|
}
|
|
140
|
-
this.tokens.setTokens(refreshAccessData.data.access_token, refreshToken);
|
|
141
|
-
this.accessToken = refreshAccessData.data.access_token;
|
|
142
|
-
return true;
|
|
143
278
|
}
|
|
144
279
|
buildQueryString(options) {
|
|
145
280
|
if (options === undefined) {
|
|
@@ -157,7 +292,7 @@ export class ApiConnectionService {
|
|
|
157
292
|
}
|
|
158
293
|
return '';
|
|
159
294
|
}
|
|
160
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ApiConnectionService, deps: [{ token: i1.TokenService }, { token: i2.SigninStatusService }, { token: i3.MyEnvironmentModel }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
295
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ApiConnectionService, deps: [{ token: i1.TokenService }, { token: i2.SigninStatusService }, { token: i3.MyEnvironmentModel }, { token: i4.CsrfService }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
161
296
|
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ApiConnectionService, providedIn: 'root' }); }
|
|
162
297
|
}
|
|
163
298
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ApiConnectionService, decorators: [{
|
|
@@ -165,5 +300,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
|
|
|
165
300
|
args: [{
|
|
166
301
|
providedIn: 'root'
|
|
167
302
|
}]
|
|
168
|
-
}], ctorParameters: function () { return [{ type: i1.TokenService }, { type: i2.SigninStatusService }, { type: i3.MyEnvironmentModel }]; } });
|
|
169
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpLWNvbm5lY3Rpb24uc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1zdG9uZXNjcmlwdHBocC1jbGllbnQvc3JjL2xpYi9hcGktY29ubmVjdGlvbi5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHM0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHNCQUFzQixDQUFDOzs7OztBQU1uRCxNQUFNLE9BQU8sb0JBQW9CO0lBTTdCLFlBQ1ksTUFBb0IsRUFDcEIsWUFBaUMsRUFDakMsV0FBK0I7UUFGL0IsV0FBTSxHQUFOLE1BQU0sQ0FBYztRQUNwQixpQkFBWSxHQUFaLFlBQVksQ0FBcUI7UUFDakMsZ0JBQVcsR0FBWCxXQUFXLENBQW9CO1FBUG5DLFNBQUksR0FBRyxFQUFFLENBQUEsQ0FBQywwQkFBMEI7UUFFcEMsZ0JBQVcsR0FBRyxFQUFFLENBQUE7UUFPcEIsSUFBSSxDQUFDLElBQUksR0FBRyxXQUFXLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQTtJQUMxQyxDQUFDO0lBR08sS0FBSyxDQUFDLE9BQU8sQ0FBVyxHQUFXLEVBQUUsT0FBWSxFQUFFLElBQWdCO1FBQ3ZFLElBQUk7WUFFQSxJQUFHLElBQUksS0FBSyxJQUFJLEVBQUU7Z0JBQ2QsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQTtnQkFDakMsSUFBRyxJQUFJLEVBQUU7b0JBQ0wsT0FBTyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUE7aUJBQ3RCO3FCQUFNO29CQUNILE9BQU8sQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFBO2lCQUNwQjthQUNKO1lBRUQsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsT0FBTyxDQUFDLENBQUE7WUFFNUQsSUFBSSxRQUFRLEdBQWEsTUFBTSxL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TyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQTthQUMvRTtTQUNKO1FBQ0QsTUFBTSxHQUFHLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQTtRQUMzQixJQUFJLEdBQUcsS0FBSyxFQUFFLEVBQUU7WUFDWixPQUFPLEdBQUcsR0FBRyxHQUFHLENBQUE7U0FDbkI7UUFFRCxPQUFPLEVBQUUsQ0FBQTtJQUNiLENBQUM7K0dBekxRLG9CQUFvQjttSEFBcEIsb0JBQW9CLGNBRmpCLE1BQU07OzRGQUVULG9CQUFvQjtrQkFIaEMsVUFBVTttQkFBQztvQkFDUixVQUFVLEVBQUUsTUFBTTtpQkFDckIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBUb2tlblNlcnZpY2UgfSBmcm9tICcuL3Rva2VuLnNlcnZpY2UnO1xuaW1wb3J0IHsgU2lnbmluU3RhdHVzU2VydmljZSB9IGZyb20gJy4vc2lnbmluLXN0YXR1cy5zZXJ2aWNlJztcbmltcG9ydCB7IEFwaVJlc3BvbnNlIH0gZnJvbSAnLi9hcGktcmVzcG9uc2UubW9kZWwnO1xuaW1wb3J0IHsgTXlFbnZpcm9ubWVudE1vZGVsIH0gZnJvbSAnLi9teS1lbnZpcm9ubWVudC5tb2RlbCc7XG5cbkBJbmplY3RhYmxlKHtcbiAgICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgQXBpQ29ubmVjdGlvblNlcnZpY2Uge1xuXG4gICAgcHJpdmF0ZSBob3N0ID0gJycgLy8gY29udGFpbnMgdHJhaWxpbmcgc2xhc2hcblxuICAgIHByaXZhdGUgYWNjZXNzVG9rZW4gPSAnJ1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgdG9rZW5zOiBUb2tlblNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgc2lnbmluU3RhdHVzOiBTaWduaW5TdGF0dXNTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIGVudmlyb25tZW50OiBNeUVudmlyb25tZW50TW9kZWxcbiAgICApIHtcbiAgICAgICAgdGhpcy5ob3N0ID0gZW52aXJvbm1lbnQuYXBpU2VydmVyLmhvc3RcbiAgICB9XG5cblxuICAgIHByaXZhdGUgYXN5bmMgcmVxdWVzdDxEYXRhVHlwZT4odXJsOiBzdHJpbmcsIG9wdGlvbnM6IGFueSwgZGF0YTogYW55IHwgbnVsbCk6IFByb21pc2U8QXBpUmVzcG9uc2U8RGF0YVR5cGU+PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmKGRhdGEgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBib2R5ID0gSlNPTi5zdHJpbmdpZnkoZGF0YSlcbiAgICAgICAgICAgICAgICBpZihib2R5KSB7XG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuYm9keSA9IGJvZHlcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmJvZHkgPSB7fVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgYWNjZXNzVG9rZW5JbmNsdWRlZCA9IHRoaXMuaW5jbHVkZUFjY2Vzc1Rva2VuKG9wdGlvbnMpXG5cbiAgICAgICAgICAgIGxldCByZXNwb25zZTogUmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwsIG9wdGlvbnMpXG5cbiAgICAgICAgICAgIGlmICgocmVzcG9uc2Uuc3RhdHVzID09PSA0MDEpICYmIGFjY2Vzc1Rva2VuSW5jbHVkZWQpIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZSA9IGF3YWl0IHRoaXMucmVmcmVzaEFjY2Vzc1Rva2VuQW5kUmV0cnkodXJsLCBvcHRpb25zLCByZXNwb25zZSlcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgICAgICAgY29uc3QganNvbiA9IGF3YWl0IChyZXNwb25zZS5qc29uKCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIChuZXcgQXBpUmVzcG9uc2U8RGF0YVR5cGU+KGpzb24uc3RhdHVzLCBqc29uLmRhdGEsIGpzb24ubWVzc2FnZSkpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPT09IDQwMSkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2lnbmluU3RhdHVzLnNpZ25lZE91dCgpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB0aGlzLmhhbmRsZUVycm9yPERhdGFUeXBlPihyZXNwb25zZSlcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmhhbmRsZUVycm9yPERhdGFUeXBlPihlcnJvcilcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgaGFuZGxlRXJyb3I8RGF0YVR5cGU+KGVycm9yOiBhbnkpOiBBcGlSZXNwb25zZTxEYXRhVHlwZT4ge1xuICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgYEJhY2tlbmQgcmV0dXJuZWQgY29kZSAke2Vycm9yLnN0YXR1c30sIGAgK1xuICAgICAgICAgICAgYGZ1bGwgZXJyb3I6IGAsIGVycm9yKTtcbiAgICAgICAgcmV0dXJuIG5ldyBBcGlSZXNwb25zZTxEYXRhVHlwZT4oJ2Vycm9yJylcbiAgICB9XG5cbiAgICBhc3luYyBnZXQ8RGF0YVR5cGU+KGVuZHBvaW50OiBzdHJpbmcsIHF1ZXJ5UGFyYW1zT2JqPzogYW55ICk6IFByb21pc2U8QXBpUmVzcG9uc2U8RGF0YVR5cGU+PiB7XG4gICAgICAgIGNvbnN0IHVybCA9IHRoaXMuaG9zdCArIGVuZHBvaW50LnJlcGxhY2UoL15cXC8rLywgJycpICsgdGhpcy5idWlsZFF1ZXJ5U3RyaW5nKHF1ZXJ5UGFyYW1zT2JqKVxuICAgICAgICBjb25zdCBmZXRjaE9wdGlvbnM6IFJlcXVlc3RJbml0ID0ge1xuICAgICAgICAgICAgbW9kZTogJ2NvcnMnLFxuICAgICAgICAgICAgcmVkaXJlY3Q6ICdlcnJvcidcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5yZXF1ZXN0KHVybCwgZmV0Y2hPcHRpb25zLCBudWxsKVxuICAgIH1cblxuICAgIGFzeW5jIHBvc3Q8RGF0YVR5cGU+KHBhdGhXaXRoUXVlcnlQYXJhbXM6IHN0cmluZywgZGF0YTogYW55KTogUHJvbWlzZTxBcGlSZXNwb25zZTxEYXRhVHlwZT4+IHtcbiAgICAgICAgY29uc3QgdXJsID0gdGhpcy5ob3N0ICsgcGF0aFdpdGhRdWVyeVBhcmFtcy5yZXBsYWNlKC9eXFwvKy8sICcnKVxuICAgICAgICBjb25zdCBmZXRjaE9wdGlvbnM6IFJlcXVlc3RJbml0ID0ge1xuICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgICBtb2RlOiAnY29ycycsXG4gICAgICAgICAgICByZWRpcmVjdDogJ2Vycm9yJyxcbiAgICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoZGF0YSlcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5yZXF1ZXN0KHVybCwgZmV0Y2hPcHRpb25zLCBkYXRhKSAgICAgICAgXG4gICAgfVxuXG4gICAgLy8gYXN5bmMgcG9zdEZvcm1XaXRoRmlsZXMocGF0aFdpdGhRdWVyeVBhcmFtczogc3RyaW5nLCBmb3JtRGF0YTogRm9ybURhdGEpOiBQcm9taXNlPEFwaVJlc3BvbnNlIHwgbnVsbD4ge1xuICAgIC8vICAgICBjb25zdCB1cmwgPSB0aGlzLmhvc3QgKyBwYXRoV2l0aFF1ZXJ5UGFyYW1zLnJlcGxhY2UoL15cXC8rLywgJycpXG4gICAgLy8gICAgIHRyeSB7XG4gICAgLy8gICAgICAgICBjb25zdCBmZXRjaE9wdGlvbnM6IFJlcXVlc3RJbml0ID0ge1xuICAgIC8vICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgIC8vICAgICAgICAgICAgIG1vZGU6ICdjb3JzJyxcbiAgICAvLyAgICAgICAgICAgICByZWRpcmVjdDogJ2Vycm9yJyxcbiAgICAvLyAgICAgICAgICAgICBib2R5OiBmb3JtRGF0YVxuICAgIC8vICAgICAgICAgfVxuXG4gICAgLy8gICAgICAgICBjb25zdCBhY2Nlc3NUb2tlbkluY2x1ZGVkID0gdGhpcy5pbmNsdWRlQWNjZXNzVG9rZW4oZmV0Y2hPcHRpb25zKVxuXG4gICAgLy8gICAgICAgICBsZXQgcmVzcG9uc2U6IFJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLCBmZXRjaE9wdGlvbnMpXG5cbiAgICAvLyAgICAgICAgIGlmICgocmVzcG9uc2Uuc3RhdHVzID09PSA0MDEpICYmIGFjY2Vzc1Rva2VuSW5jbHVkZWQpIHtcbiAgICAvLyAgICAgICAgICAgICByZXNwb25zZSA9IGF3YWl0IHRoaXMucmVmcmVzaEFjY2Vzc1Rva2VuQW5kUmV0cnkodXJsLCBmZXRjaE9wdGlvbnMsIHJlc3BvbnNlKVxuICAgIC8vICAgICAgICAgfVxuXG4gICAgLy8gICAgICAgICBpZiAocmVzcG9uc2Uub2spIHtcbiAgICAvLyAgICAgICAgICAgICByZXR1cm4gKChhd2FpdCAocmVzcG9uc2UuanNvbigpKSBhcyBBcGlSZXNwb25zZSkpXG4gICAgLy8gICAgICAgICB9XG5cbiAgICAvLyAgICAgICAgIHJldHVybiB0aGlzLmhhbmRsZUVycm9yKHJlc3BvbnNlKVxuICAgIC8vICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgIC8vICAgICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlRXJyb3IoZXJyb3IpXG4gICAgLy8gICAgIH1cbiAgICAvLyB9XG5cbiAgICBwcml2YXRlIGluY2x1ZGVBY2Nlc3NUb2tlbihvcHRpb25zOiBhbnkpOiBib29sZWFuIHtcbiAgICAgICAgdGhpcy5hY2Nlc3NUb2tlbiA9IHRoaXMudG9rZW5zLmdldEFjY2Vzc1Rva2VuKClcbiAgICAgICAgaWYgKCF0aGlzLmFjY2Vzc1Rva2VuKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghb3B0aW9ucy5oZWFkZXJzKSB7XG4gICAgICAgICAgICBvcHRpb25zLmhlYWRlcnMgPSB7fVxuICAgICAgICB9XG4gICAgICAgIG9wdGlvbnMuaGVhZGVyc1snQXV0aG9yaXphdGlvbiddID0gJ0JlYXJlciAnICsgdGhpcy5hY2Nlc3NUb2tlblxuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgcmVmcmVzaEFjY2Vzc1Rva2VuQW5kUmV0cnkodXJsOiBzdHJpbmcsIGZldGNoT3B0aW9uczogYW55LCByZXNwb25zZTogUmVzcG9uc2UpOiBQcm9taXNlPFJlc3BvbnNlPiB7XG5cbiAgICAgICAgY29uc3QgcmVmcmVzaFN0YXR1c09rID0gYXdhaXQgdGhpcy5yZWZyZXNoQWNjZXNzVG9rZW4oKVxuICAgICAgICBpZiAoIXJlZnJlc2hTdGF0dXNPaykge1xuICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlXG4gICAgICAgIH1cblxuICAgICAgICBmZXRjaE9wdGlvbnMuaGVhZGVyc1snQXV0aG9yaXphdGlvbiddID0gJ0JlYXJlciAnICsgdGhpcy5hY2Nlc3NUb2tlblxuICAgICAgICByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCwgZmV0Y2hPcHRpb25zKVxuICAgICAgICByZXR1cm4gcmVzcG9uc2VcbiAgICB9XG5cbiAgICBhc3luYyByZWZyZXNoQWNjZXNzVG9rZW4oKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIGNvbnN0IHJlZnJlc2hUb2tlbiA9IHRoaXMudG9rZW5zLmdldFJlZnJlc2hUb2tlbigpXG4gICAgICAgIGlmICghcmVmcmVzaFRva2VuKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlZnJlc2hUb2tlblVybCA9IHRoaXMuaG9zdCArICd1c2VyL3JlZnJlc2hfYWNjZXNzJ1xuICAgICAgICBsZXQgcmVmcmVzaFRva2VuUmVzcG9uc2UgPSBhd2FpdCBmZXRjaChyZWZyZXNoVG9rZW5VcmwsIHtcbiAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgbW9kZTogJ2NvcnMnLFxuICAgICAgICAgICAgcmVkaXJlY3Q6ICdlcnJvcicsXG4gICAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJ1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgICBhY2Nlc3NfdG9rZW46IHRoaXMuYWNjZXNzVG9rZW4sXG4gICAgICAgICAgICAgICAgcmVmcmVzaF90b2tlbjogcmVmcmVzaFRva2VuXG4gICAgICAgICAgICB9KVxuICAgICAgICB9KVxuICAgICAgICBpZiAoIXJlZnJlc2hUb2tlblJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgICB0aGlzLmFjY2Vzc1Rva2VuID0gJydcbiAgICAgICAgICAgIHRoaXMudG9rZW5zLmNsZWFyKClcbiAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHJlZnJlc2hBY2Nlc3NEYXRhID0gYXdhaXQgcmVmcmVzaFRva2VuUmVzcG9uc2UuanNvbigpXG4gICAgICAgIGlmICghcmVmcmVzaEFjY2Vzc0RhdGEpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICB9XG4gICAgICAgIHRoaXMudG9rZW5zLnNldFRva2VucyhyZWZyZXNoQWNjZXNzRGF0YS5kYXRhLmFjY2Vzc190b2tlbiwgcmVmcmVzaFRva2VuKVxuICAgICAgICB0aGlzLmFjY2Vzc1Rva2VuID0gcmVmcmVzaEFjY2Vzc0RhdGEuZGF0YS5hY2Nlc3NfdG9rZW5cblxuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cblxuICAgIGJ1aWxkUXVlcnlTdHJpbmcob3B0aW9ucz86IGFueSk6IHN0cmluZyB7XG4gICAgICAgIGlmIChvcHRpb25zID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiAnJ1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYXJyYXkgPSBbXVxuICAgICAgICBmb3IgKGxldCBrZXkgaW4gb3B0aW9ucykge1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMuaGFzT3duUHJvcGVydHkoa2V5KSAmJiAob3B0aW9uc1trZXldICE9PSBudWxsKSAmJiAob3B0aW9uc1trZXldICE9PSB1bmRlZmluZWQpKSB7XG4gICAgICAgICAgICAgICAgYXJyYXkucHVzaChlbmNvZGVVUklDb21wb25lbnQoa2V5KSArIFwiPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KG9wdGlvbnNba2V5XSkpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc3RyID0gYXJyYXkuam9pbignJicpXG4gICAgICAgIGlmIChzdHIgIT09ICcnKSB7XG4gICAgICAgICAgICByZXR1cm4gJz8nICsgc3RyXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gJydcbiAgICB9XG59XG4iXX0=
|
|
303
|
+
}], ctorParameters: function () { return [{ type: i1.TokenService }, { type: i2.SigninStatusService }, { type: i3.MyEnvironmentModel }, { type: i4.CsrfService }]; } });
|
|
304
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpLWNvbm5lY3Rpb24uc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1zdG9uZXNjcmlwdHBocC1jbGllbnQvc3JjL2xpYi9hcGktY29ubmVjdGlvbi5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHM0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHNCQUFzQixDQUFDOzs7Ozs7QUFPbkQsTUFBTSxPQUFPLG9CQUFvQjtJQVE3QixZQUNZLE1BQW9CLEVBQ3BCLFlBQWlDLEVBQ2pDLFdBQStCLEVBQy9CLElBQWlCO1FBSGpCLFdBQU0sR0FBTixNQUFNLENBQWM7UUFDcEIsaUJBQVksR0FBWixZQUFZLENBQXFCO1FBQ2pDLGdCQUFXLEdBQVgsV0FBVyxDQUFvQjtRQUMvQixTQUFJLEdBQUosSUFBSSxDQUFhO1FBVnJCLFNBQUksR0FBRyxFQUFFLENBQUEsQ0FBQywwQkFBMEI7UUFFcEMsZ0JBQVcsR0FBRyxFQUFFLENBQUE7UUFVcEIsSUFBSSxDQUFDLElBQUksR0FBRyxXQUFXLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQTtRQUV0Qyx3Q0FBd0M7UUFDeEMsSUFBSSxDQUFDLFVBQVUsR0FBRztZQUNkLElBQUksRUFBRSxXQUFXLENBQUMsSUFBSSxFQUFFLElBQUksSUFBSSxRQUFRO1lBQ3hDLGVBQWUsRUFBRSxXQUFXLENBQUMsSUFBSSxFQUFFLGVBQWU7WUFDbEQsT0FBTyxFQUFFLFdBQVcsQ0FBQyxJQUFJLEVBQUUsT0FBTztZQUNsQyxzQkFBc0IsRUFBRSxXQUFXLENBQUMsSUFBSSxFQUFFLHNCQUFzQixJQUFJLGVBQWU7WUFDbkYsbUJBQW1CLEVBQUUsV0FBVyxDQUFDLElBQUksRUFBRSxtQkFBbUIsSUFBSSxZQUFZO1lBQzFFLGNBQWMsRUFBRSxXQUFXLENBQUMsSUFBSSxFQUFFLGNBQWMsSUFB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QyxPQUFhO1FBQzFCLElBQUksT0FBTyxLQUFLLFNBQVMsRUFBRTtZQUN2QixPQUFPLEVBQUUsQ0FBQTtTQUNaO1FBRUQsTUFBTSxLQUFLLEdBQUcsRUFBRSxDQUFBO1FBQ2hCLEtBQUssSUFBSSxHQUFHLElBQUksT0FBTyxFQUFFO1lBQ3JCLElBQUksT0FBTyxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxTQUFTLENBQUMsRUFBRTtnQkFDeEYsS0FBSyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsa0JBQWtCLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQTthQUMvRTtTQUNKO1FBQ0QsTUFBTSxHQUFHLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQTtRQUMzQixJQUFJLEdBQUcsS0FBSyxFQUFFLEVBQUU7WUFDWixPQUFPLEdBQUcsR0FBRyxHQUFHLENBQUE7U0FDbkI7UUFFRCxPQUFPLEVBQUUsQ0FBQTtJQUNiLENBQUM7K0dBalZRLG9CQUFvQjttSEFBcEIsb0JBQW9CLGNBRmpCLE1BQU07OzRGQUVULG9CQUFvQjtrQkFIaEMsVUFBVTttQkFBQztvQkFDUixVQUFVLEVBQUUsTUFBTTtpQkFDckIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBUb2tlblNlcnZpY2UgfSBmcm9tICcuL3Rva2VuLnNlcnZpY2UnO1xuaW1wb3J0IHsgU2lnbmluU3RhdHVzU2VydmljZSB9IGZyb20gJy4vc2lnbmluLXN0YXR1cy5zZXJ2aWNlJztcbmltcG9ydCB7IEFwaVJlc3BvbnNlIH0gZnJvbSAnLi9hcGktcmVzcG9uc2UubW9kZWwnO1xuaW1wb3J0IHsgTXlFbnZpcm9ubWVudE1vZGVsLCBBdXRoQ29uZmlnIH0gZnJvbSAnLi9teS1lbnZpcm9ubWVudC5tb2RlbCc7XG5pbXBvcnQgeyBDc3JmU2VydmljZSB9IGZyb20gJy4vY3NyZi5zZXJ2aWNlJztcblxuQEluamVjdGFibGUoe1xuICAgIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBBcGlDb25uZWN0aW9uU2VydmljZSB7XG5cbiAgICBwcml2YXRlIGhvc3QgPSAnJyAvLyBjb250YWlucyB0cmFpbGluZyBzbGFzaFxuXG4gICAgcHJpdmF0ZSBhY2Nlc3NUb2tlbiA9ICcnXG5cbiAgICBwcml2YXRlIGF1dGhDb25maWc6IEF1dGhDb25maWdcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIHRva2VuczogVG9rZW5TZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIHNpZ25pblN0YXR1czogU2lnbmluU3RhdHVzU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBlbnZpcm9ubWVudDogTXlFbnZpcm9ubWVudE1vZGVsLFxuICAgICAgICBwcml2YXRlIGNzcmY6IENzcmZTZXJ2aWNlXG4gICAgKSB7XG4gICAgICAgIHRoaXMuaG9zdCA9IGVudmlyb25tZW50LmFwaVNlcnZlci5ob3N0XG5cbiAgICAgICAgLy8gU2V0IGRlZmF1bHQgYXV0aCBjb25maWcgYmFzZWQgb24gbW9kZVxuICAgICAgICB0aGlzLmF1dGhDb25maWcgPSB7XG4gICAgICAgICAgICBtb2RlOiBlbnZpcm9ubWVudC5hdXRoPy5tb2RlIHx8ICdjb29raWUnLFxuICAgICAgICAgICAgcmVmcmVzaEVuZHBvaW50OiBlbnZpcm9ubWVudC5hdXRoPy5yZWZyZXNoRW5kcG9pbnQsXG4gICAgICAgICAgICB1c2VDc3JmOiBlbnZpcm9ubWVudC5hdXRoPy51c2VDc3JmLFxuICAgICAgICAgICAgcmVmcmVzaFRva2VuQ29va2llTmFtZTogZW52aXJvbm1lbnQuYXV0aD8ucmVmcmVzaFRva2VuQ29va2llTmFtZSB8fCAncmVmcmVzaF90b2tlbicsXG4gICAgICAgICAgICBjc3JmVG9rZW5Db29raWVOYW1lOiBlbnZpcm9ubWVudC5hdXRoPy5jc3JmVG9rZW5Db29raWVOYW1lIHx8ICdjc3JmX3Rva2VuJyxcbiAgICAgICAgICAgIGNzcmZIZWFkZXJOYW1lOiBlbnZpcm9ubWVudC5hdXRoPy5jc3JmSGVhZGVyTmFtZSB8fCAnWC1DU1JGLVRva2VuJ1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2V0IGRlZmF1bHQgcmVmcmVzaCBlbmRwb2ludCBiYXNlZCBvbiBtb2RlIGlmIG5vdCBzcGVjaWZpZWRcbiAgICAgICAgaWYgKCF0aGlzLmF1dGhDb25maWcucmVmcmVzaEVuZHBvaW50KSB7XG4gICAgICAgICAgICB0aGlzLmF1dGhDb25maWcucmVmcmVzaEVuZHBvaW50ID0gdGhpcy5hdXRoQ29uZmlnLm1vZGUgPT09ICdjb29raWUnXG4gICAgICAgICAgICAgICAgPyAnL2F1dGgvcmVmcmVzaCdcbiAgICAgICAgICAgICAgICA6ICcvdXNlci9yZWZyZXNoX2FjY2VzcydcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNldCBkZWZhdWx0IENTUkYgc2V0dGluZyBiYXNlZCBvbiBtb2RlIGlmIG5vdCBzcGVjaWZpZWRcbiAgICAgICAgaWYgKHRoaXMuYXV0aENvbmZpZy51c2VDc3JmID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuYXV0aENvbmZpZy51c2VDc3JmID0gdGhpcy5hdXRoQ29uZmlnLm1vZGUgPT09ICdjb29raWUnXG4gICAgICAgIH1cbiAgICB9XG5cblxuICAgIHByaXZhdGUgYXN5bmMgcmVxdWVzdDxEYXRhVHlwZT4odXJsOiBzdHJpbmcsIG9wdGlvbnM6IGFueSwgZGF0YTogYW55IHwgbnVsbCk6IFByb21pc2U8QXBpUmVzcG9uc2U8RGF0YVR5cGU+PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmKGRhdGEgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBib2R5ID0gSlNPTi5zdHJpbmdpZnkoZGF0YSlcbiAgICAgICAgICAgICAgICBpZihib2R5KSB7XG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuYm9keSA9IGJvZHlcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmJvZHkgPSB7fVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgYWNjZXNzVG9rZW5JbmNsdWRlZCA9IHRoaXMuaW5jbHVkZUFjY2Vzc1Rva2VuKG9wdGlvbnMpXG5cbiAgICAgICAgICAgIGxldCByZXNwb25zZTogUmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwsIG9wdGlvbnMpXG5cbiAgICAgICAgICAgIGlmICgocmVzcG9uc2Uuc3RhdHVzID09PSA0MDEpICYmIGFjY2Vzc1Rva2VuSW5jbHVkZWQpIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZSA9IGF3YWl0IHRoaXMucmVmcmVzaEFjY2Vzc1Rva2VuQW5kUmV0cnkodXJsLCBvcHRpb25zLCByZXNwb25zZSlcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgICAgICAgY29uc3QganNvbiA9IGF3YWl0IChyZXNwb25zZS5qc29uKCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIChuZXcgQXBpUmVzcG9uc2U8RGF0YVR5cGU+KGpzb24uc3RhdHVzLCBqc29uLmRhdGEsIGpzb24ubWVzc2FnZSkpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPT09IDQwMSkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2lnbmluU3RhdHVzLnNpZ25lZE91dCgpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB0aGlzLmhhbmRsZUVycm9yPERhdGFUeXBlPihyZXNwb25zZSlcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmhhbmRsZUVycm9yPERhdGFUeXBlPihlcnJvcilcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgaGFuZGxlRXJyb3I8RGF0YVR5cGU+KGVycm9yOiBhbnkpOiBBcGlSZXNwb25zZTxEYXRhVHlwZT4ge1xuICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgYEJhY2tlbmQgcmV0dXJuZWQgY29kZSAke2Vycm9yLnN0YXR1c30sIGAgK1xuICAgICAgICAgICAgYGZ1bGwgZXJyb3I6IGAsIGVycm9yKTtcbiAgICAgICAgcmV0dXJuIG5ldyBBcGlSZXNwb25zZTxEYXRhVHlwZT4oJ2Vycm9yJylcbiAgICB9XG5cbiAgICBhc3luYyBnZXQ8RGF0YVR5cGU+KGVuZHBvaW50OiBzdHJpbmcsIHF1ZXJ5UGFyYW1zT2JqPzogYW55ICk6IFByb21pc2U8QXBpUmVzcG9uc2U8RGF0YVR5cGU+PiB7XG4gICAgICAgIGNvbnN0IHVybCA9IHRoaXMuaG9zdCArIGVuZHBvaW50LnJlcGxhY2UoL15cXC8rLywgJycpICsgdGhpcy5idWlsZFF1ZXJ5U3RyaW5nKHF1ZXJ5UGFyYW1zT2JqKVxuICAgICAgICBjb25zdCBmZXRjaE9wdGlvbnM6IFJlcXVlc3RJbml0ID0ge1xuICAgICAgICAgICAgbW9kZTogJ2NvcnMnLFxuICAgICAgICAgICAgcmVkaXJlY3Q6ICdlcnJvcidcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5yZXF1ZXN0KHVybCwgZmV0Y2hPcHRpb25zLCBudWxsKVxuICAgIH1cblxuICAgIGFzeW5jIHBvc3Q8RGF0YVR5cGU+KHBhdGhXaXRoUXVlcnlQYXJhbXM6IHN0cmluZywgZGF0YTogYW55KTogUHJvbWlzZTxBcGlSZXNwb25zZTxEYXRhVHlwZT4+IHtcbiAgICAgICAgY29uc3QgdXJsID0gdGhpcy5ob3N0ICsgcGF0aFdpdGhRdWVyeVBhcmFtcy5yZXBsYWNlKC9eXFwvKy8sICcnKVxuICAgICAgICBjb25zdCBmZXRjaE9wdGlvbnM6IFJlcXVlc3RJbml0ID0ge1xuICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgICBtb2RlOiAnY29ycycsXG4gICAgICAgICAgICByZWRpcmVjdDogJ2Vycm9yJyxcbiAgICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoZGF0YSlcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5yZXF1ZXN0KHVybCwgZmV0Y2hPcHRpb25zLCBkYXRhKVxuICAgIH1cblxuICAgIGFzeW5jIHB1dDxEYXRhVHlwZT4ocGF0aFdpdGhRdWVyeVBhcmFtczogc3RyaW5nLCBkYXRhOiBhbnkpOiBQcm9taXNlPEFwaVJlc3BvbnNlPERhdGFUeXBlPj4ge1xuICAgICAgICBjb25zdCB1cmwgPSB0aGlzLmhvc3QgKyBwYXRoV2l0aFF1ZXJ5UGFyYW1zLnJlcGxhY2UoL15cXC8rLywgJycpXG4gICAgICAgIGNvbnN0IGZldGNoT3B0aW9uczogUmVxdWVzdEluaXQgPSB7XG4gICAgICAgICAgICBtZXRob2Q6ICdQVVQnLFxuICAgICAgICAgICAgbW9kZTogJ2NvcnMnLFxuICAgICAgICAgICAgcmVkaXJlY3Q6ICdlcnJvcicsXG4gICAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJ1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KGRhdGEpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMucmVxdWVzdCh1cmwsIGZldGNoT3B0aW9ucywgZGF0YSlcbiAgICB9XG5cbiAgICBhc3luYyBwYXRjaDxEYXRhVHlwZT4ocGF0aFdpdGhRdWVyeVBhcmFtczogc3RyaW5nLCBkYXRhOiBhbnkpOiBQcm9taXNlPEFwaVJlc3BvbnNlPERhdGFUeXBlPj4ge1xuICAgICAgICBjb25zdCB1cmwgPSB0aGlzLmhvc3QgKyBwYXRoV2l0aFF1ZXJ5UGFyYW1zLnJlcGxhY2UoL15cXC8rLywgJycpXG4gICAgICAgIGNvbnN0IGZldGNoT3B0aW9uczogUmVxdWVzdEluaXQgPSB7XG4gICAgICAgICAgICBtZXRob2Q6ICdQQVRDSCcsXG4gICAgICAgICAgICBtb2RlOiAnY29ycycsXG4gICAgICAgICAgICByZWRpcmVjdDogJ2Vycm9yJyxcbiAgICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoZGF0YSlcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5yZXF1ZXN0KHVybCwgZmV0Y2hPcHRpb25zLCBkYXRhKVxuICAgIH1cblxuICAgIGFzeW5jIGRlbGV0ZTxEYXRhVHlwZT4oZW5kcG9pbnQ6IHN0cmluZywgcXVlcnlQYXJhbXNPYmo/OiBhbnkpOiBQcm9taXNlPEFwaVJlc3BvbnNlPERhdGFUeXBlPj4ge1xuICAgICAgICBjb25zdCB1cmwgPSB0aGlzLmhvc3QgKyBlbmRwb2ludC5yZXBsYWNlKC9eXFwvKy8sICcnKSArIHRoaXMuYnVpbGRRdWVyeVN0cmluZyhxdWVyeVBhcmFtc09iailcbiAgICAgICAgY29uc3QgZmV0Y2hPcHRpb25zOiBSZXF1ZXN0SW5pdCA9IHtcbiAgICAgICAgICAgIG1ldGhvZDogJ0RFTEVURScsXG4gICAgICAgICAgICBtb2RlOiAnY29ycycsXG4gICAgICAgICAgICByZWRpcmVjdDogJ2Vycm9yJ1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnJlcXVlc3QodXJsLCBmZXRjaE9wdGlvbnMsIG51bGwpXG4gICAgfVxuXG4gICAgLy8gYXN5bmMgcG9zdEZvcm1XaXRoRmlsZXMocGF0aFdpdGhRdWVyeVBhcmFtczogc3RyaW5nLCBmb3JtRGF0YTogRm9ybURhdGEpOiBQcm9taXNlPEFwaVJlc3BvbnNlIHwgbnVsbD4ge1xuICAgIC8vICAgICBjb25zdCB1cmwgPSB0aGlzLmhvc3QgKyBwYXRoV2l0aFF1ZXJ5UGFyYW1zLnJlcGxhY2UoL15cXC8rLywgJycpXG4gICAgLy8gICAgIHRyeSB7XG4gICAgLy8gICAgICAgICBjb25zdCBmZXRjaE9wdGlvbnM6IFJlcXVlc3RJbml0ID0ge1xuICAgIC8vICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgIC8vICAgICAgICAgICAgIG1vZGU6ICdjb3JzJyxcbiAgICAvLyAgICAgICAgICAgICByZWRpcmVjdDogJ2Vycm9yJyxcbiAgICAvLyAgICAgICAgICAgICBib2R5OiBmb3JtRGF0YVxuICAgIC8vICAgICAgICAgfVxuXG4gICAgLy8gICAgICAgICBjb25zdCBhY2Nlc3NUb2tlbkluY2x1ZGVkID0gdGhpcy5pbmNsdWRlQWNjZXNzVG9rZW4oZmV0Y2hPcHRpb25zKVxuXG4gICAgLy8gICAgICAgICBsZXQgcmVzcG9uc2U6IFJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLCBmZXRjaE9wdGlvbnMpXG5cbiAgICAvLyAgICAgICAgIGlmICgocmVzcG9uc2Uuc3RhdHVzID09PSA0MDEpICYmIGFjY2Vzc1Rva2VuSW5jbHVkZWQpIHtcbiAgICAvLyAgICAgICAgICAgICByZXNwb25zZSA9IGF3YWl0IHRoaXMucmVmcmVzaEFjY2Vzc1Rva2VuQW5kUmV0cnkodXJsLCBmZXRjaE9wdGlvbnMsIHJlc3BvbnNlKVxuICAgIC8vICAgICAgICAgfVxuXG4gICAgLy8gICAgICAgICBpZiAocmVzcG9uc2Uub2spIHtcbiAgICAvLyAgICAgICAgICAgICByZXR1cm4gKChhd2FpdCAocmVzcG9uc2UuanNvbigpKSBhcyBBcGlSZXNwb25zZSkpXG4gICAgLy8gICAgICAgICB9XG5cbiAgICAvLyAgICAgICAgIHJldHVybiB0aGlzLmhhbmRsZUVycm9yKHJlc3BvbnNlKVxuICAgIC8vICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgIC8vICAgICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlRXJyb3IoZXJyb3IpXG4gICAgLy8gICAgIH1cbiAgICAvLyB9XG5cbiAgICBwcml2YXRlIGluY2x1ZGVBY2Nlc3NUb2tlbihvcHRpb25zOiBhbnkpOiBib29sZWFuIHtcbiAgICAgICAgdGhpcy5hY2Nlc3NUb2tlbiA9IHRoaXMudG9rZW5zLmdldEFjY2Vzc1Rva2VuKClcbiAgICAgICAgaWYgKCF0aGlzLmFjY2Vzc1Rva2VuKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghb3B0aW9ucy5oZWFkZXJzKSB7XG4gICAgICAgICAgICBvcHRpb25zLmhlYWRlcnMgPSB7fVxuICAgICAgICB9XG4gICAgICAgIG9wdGlvbnMuaGVhZGVyc1snQXV0aG9yaXphdGlvbiddID0gJ0JlYXJlciAnICsgdGhpcy5hY2Nlc3NUb2tlblxuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgcmVmcmVzaEFjY2Vzc1Rva2VuQW5kUmV0cnkodXJsOiBzdHJpbmcsIGZldGNoT3B0aW9uczogYW55LCByZXNwb25zZTogUmVzcG9uc2UpOiBQcm9taXNlPFJlc3BvbnNlPiB7XG5cbiAgICAgICAgY29uc3QgcmVmcmVzaFN0YXR1c09rID0gYXdhaXQgdGhpcy5yZWZyZXNoQWNjZXNzVG9rZW4oKVxuICAgICAgICBpZiAoIXJlZnJlc2hTdGF0dXNPaykge1xuICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlXG4gICAgICAgIH1cblxuICAgICAgICBmZXRjaE9wdGlvbnMuaGVhZGVyc1snQXV0aG9yaXphdGlvbiddID0gJ0JlYXJlciAnICsgdGhpcy5hY2Nlc3NUb2tlblxuICAgICAgICByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCwgZmV0Y2hPcHRpb25zKVxuICAgICAgICByZXR1cm4gcmVzcG9uc2VcbiAgICB9XG5cbiAgICBhc3luYyByZWZyZXNoQWNjZXNzVG9rZW4oKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIGlmICh0aGlzLmF1dGhDb25maWcubW9kZSA9PT0gJ25vbmUnKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmF1dGhDb25maWcubW9kZSA9PT0gJ2Nvb2tpZScpIHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnJlZnJlc2hBY2Nlc3NUb2tlbkNvb2tpZU1vZGUoKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMucmVmcmVzaEFjY2Vzc1Rva2VuQm9keU1vZGUoKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVmcmVzaCBhY2Nlc3MgdG9rZW4gdXNpbmcgY29va2llLWJhc2VkIGF1dGggKFN0b25lU2NyaXB0UEhQIHYyLjEueCBkZWZhdWx0KVxuICAgICAqL1xuICAgIHByaXZhdGUgYXN5bmMgcmVmcmVzaEFjY2Vzc1Rva2VuQ29va2llTW9kZSgpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHJlZnJlc2hUb2tlblVybCA9IHRoaXMuaG9zdCArIHRoaXMuYXV0aENvbmZpZy5yZWZyZXNoRW5kcG9pbnQhLnJlcGxhY2UoL15cXC8rLywgJycpXG4gICAgICAgICAgICBjb25zdCBoZWFkZXJzOiBhbnkgPSB7XG4gICAgICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJ1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBBZGQgQ1NSRiB0b2tlbiBpZiBlbmFibGVkXG4gICAgICAgICAgICBpZiAodGhpcy5hdXRoQ29uZmlnLnVzZUNzcmYpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjc3JmVG9rZW4gPSB0aGlzLmNzcmYuZ2V0Q3NyZlRva2VuKHRoaXMuYXV0aENvbmZpZy5jc3JmVG9rZW5Db29raWVOYW1lISlcbiAgICAgICAgICAgICAgICBpZiAoIWNzcmZUb2tlbikge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdDU1JGIHRva2VuIG5vdCBmb3VuZCBpbiBjb29raWUnKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaGVhZGVyc1t0aGlzLmF1dGhDb25maWcuY3NyZkhlYWRlck5hbWUhXSA9IGNzcmZUb2tlblxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgcmVmcmVzaFRva2VuUmVzcG9uc2UgPSBhd2FpdCBmZXRjaChyZWZyZXNoVG9rZW5VcmwsIHtcbiAgICAgICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICAgICAgICBtb2RlOiAnY29ycycsXG4gICAgICAgICAgICAgICAgY3JlZGVudGlhbHM6ICdpbmNsdWRlJywgLy8gSW1wb3J0YW50OiBzZW5kIGNvb2tpZXNcbiAgICAgICAgICAgICAgICByZWRpcmVjdDogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiBoZWFkZXJzXG4gICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICBpZiAoIXJlZnJlc2hUb2tlblJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hY2Nlc3NUb2tlbiA9ICcnXG4gICAgICAgICAgICAgICAgdGhpcy50b2tlbnMuY2xlYXIoKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgcmVmcmVzaEFjY2Vzc0RhdGEgPSBhd2FpdCByZWZyZXNoVG9rZW5SZXNwb25zZS5qc29uKClcbiAgICAgICAgICAgIGlmICghcmVmcmVzaEFjY2Vzc0RhdGEgfHwgcmVmcmVzaEFjY2Vzc0RhdGEuc3RhdHVzICE9PSAnb2snKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEV4dHJhY3QgYWNjZXNzIHRva2VuIGZyb20gcmVzcG9uc2VcbiAgICAgICAgICAgIGNvbnN0IG5ld0FjY2Vzc1Rva2VuID0gcmVmcmVzaEFjY2Vzc0RhdGEuZGF0YT8uYWNjZXNzX3Rva2VuIHx8IHJlZnJlc2hBY2Nlc3NEYXRhLmFjY2Vzc190b2tlblxuICAgICAgICAgICAgaWYgKCFuZXdBY2Nlc3NUb2tlbikge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ05vIGFjY2VzcyB0b2tlbiBpbiByZWZyZXNoIHJlc3BvbnNlJylcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gU3RvcmUgbmV3IGFjY2VzcyB0b2tlbiAocmVmcmVzaCB0b2tlbiBpcyBpbiBodHRwT25seSBjb29raWUpXG4gICAgICAgICAgICB0aGlzLnRva2Vucy5zZXRBY2Nlc3NUb2tlbihuZXdBY2Nlc3NUb2tlbilcbiAgICAgICAgICAgIHRoaXMuYWNjZXNzVG9rZW4gPSBuZXdBY2Nlc3NUb2tlblxuXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignVG9rZW4gcmVmcmVzaCBmYWlsZWQgKGNvb2tpZSBtb2RlKTonLCBlcnJvcilcbiAgICAgICAgICAgIHRoaXMuYWNjZXNzVG9rZW4gPSAnJ1xuICAgICAgICAgICAgdGhpcy50b2tlbnMuY2xlYXIoKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZWZyZXNoIGFjY2VzcyB0b2tlbiB1c2luZyBib2R5LWJhc2VkIGF1dGggKGxlZ2FjeSBtb2RlKVxuICAgICAqL1xuICAgIHByaXZhdGUgYXN5bmMgcmVmcmVzaEFjY2Vzc1Rva2VuQm9keU1vZGUoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCByZWZyZXNoVG9rZW4gPSB0aGlzLnRva2Vucy5nZXRSZWZyZXNoVG9rZW4oKVxuICAgICAgICAgICAgaWYgKCFyZWZyZXNoVG9rZW4pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgcmVmcmVzaFRva2VuVXJsID0gdGhpcy5ob3N0ICsgdGhpcy5hdXRoQ29uZmlnLnJlZnJlc2hFbmRwb2ludCEucmVwbGFjZSgvXlxcLysvLCAnJylcbiAgICAgICAgICAgIGxldCByZWZyZXNoVG9rZW5SZXNwb25zZSA9IGF3YWl0IGZldGNoKHJlZnJlc2hUb2tlblVybCwge1xuICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgICAgIG1vZGU6ICdjb3JzJyxcbiAgICAgICAgICAgICAgICByZWRpcmVjdDogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAgICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbidcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgICAgICAgYWNjZXNzX3Rva2VuOiB0aGlzLmFjY2Vzc1Rva2VuLFxuICAgICAgICAgICAgICAgICAgICByZWZyZXNoX3Rva2VuOiByZWZyZXNoVG9rZW5cbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgaWYgKCFyZWZyZXNoVG9rZW5SZXNwb25zZS5vaykge1xuICAgICAgICAgICAgICAgIHRoaXMuYWNjZXNzVG9rZW4gPSAnJ1xuICAgICAgICAgICAgICAgIHRoaXMudG9rZW5zLmNsZWFyKClcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IHJlZnJlc2hBY2Nlc3NEYXRhID0gYXdhaXQgcmVmcmVzaFRva2VuUmVzcG9uc2UuanNvbigpXG4gICAgICAgICAgICBpZiAoIXJlZnJlc2hBY2Nlc3NEYXRhKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IG5ld0FjY2Vzc1Rva2VuID0gcmVmcmVzaEFjY2Vzc0RhdGEuZGF0YT8uYWNjZXNzX3Rva2VuIHx8IHJlZnJlc2hBY2Nlc3NEYXRhLmFjY2Vzc190b2tlblxuICAgICAgICAgICAgaWYgKCFuZXdBY2Nlc3NUb2tlbikge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ05vIGFjY2VzcyB0b2tlbiBpbiByZWZyZXNoIHJlc3BvbnNlJylcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy50b2tlbnMuc2V0VG9rZW5zKG5ld0FjY2Vzc1Rva2VuLCByZWZyZXNoVG9rZW4pXG4gICAgICAgICAgICB0aGlzLmFjY2Vzc1Rva2VuID0gbmV3QWNjZXNzVG9rZW5cblxuICAgICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1Rva2VuIHJlZnJlc2ggZmFpbGVkIChib2R5IG1vZGUpOicsIGVycm9yKVxuICAgICAgICAgICAgdGhpcy5hY2Nlc3NUb2tlbiA9ICcnXG4gICAgICAgICAgICB0aGlzLnRva2Vucy5jbGVhcigpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGJ1aWxkUXVlcnlTdHJpbmcob3B0aW9ucz86IGFueSk6IHN0cmluZyB7XG4gICAgICAgIGlmIChvcHRpb25zID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiAnJ1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYXJyYXkgPSBbXVxuICAgICAgICBmb3IgKGxldCBrZXkgaW4gb3B0aW9ucykge1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMuaGFzT3duUHJvcGVydHkoa2V5KSAmJiAob3B0aW9uc1trZXldICE9PSBudWxsKSAmJiAob3B0aW9uc1trZXldICE9PSB1bmRlZmluZWQpKSB7XG4gICAgICAgICAgICAgICAgYXJyYXkucHVzaChlbmNvZGVVUklDb21wb25lbnQoa2V5KSArIFwiPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KG9wdGlvbnNba2V5XSkpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc3RyID0gYXJyYXkuam9pbignJicpXG4gICAgICAgIGlmIChzdHIgIT09ICcnKSB7XG4gICAgICAgICAgICByZXR1cm4gJz8nICsgc3RyXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gJydcbiAgICB9XG59XG4iXX0=
|
|
@@ -22,5 +22,23 @@ export class ApiResponse {
|
|
|
22
22
|
}
|
|
23
23
|
return this;
|
|
24
24
|
}
|
|
25
|
+
isSuccess() {
|
|
26
|
+
return this.status === 'ok';
|
|
27
|
+
}
|
|
28
|
+
isError() {
|
|
29
|
+
return this.status === 'error' || this.status === 'not ok';
|
|
30
|
+
}
|
|
31
|
+
getData() {
|
|
32
|
+
return this.data || null;
|
|
33
|
+
}
|
|
34
|
+
getError() {
|
|
35
|
+
return this.message || 'Unknown error';
|
|
36
|
+
}
|
|
37
|
+
getStatus() {
|
|
38
|
+
return this.status;
|
|
39
|
+
}
|
|
40
|
+
getMessage() {
|
|
41
|
+
return this.message;
|
|
42
|
+
}
|
|
25
43
|
}
|
|
26
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
44
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpLXJlc3BvbnNlLm1vZGVsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXN0b25lc2NyaXB0cGhwLWNsaWVudC9zcmMvbGliL2FwaS1yZXNwb25zZS5tb2RlbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLE9BQU8sV0FBVztJQUtwQixZQUFZLE1BQWMsRUFBRSxPQUFZLEVBQUUsRUFBRSxVQUFrQixFQUFFO1FBQzVELElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFBO1FBQ3BCLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFBO1FBQ2hCLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFBO0lBQzFCLENBQUM7SUFFRCxJQUFJLENBQUMsUUFBa0M7UUFDbkMsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLElBQUksRUFBRTtZQUN0QixRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFBO1NBQ3RCO1FBQ0QsT0FBTyxJQUFJLENBQUE7SUFDZixDQUFDO0lBRUQsT0FBTyxDQUFDLFFBQW1EO1FBQ3ZELElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxRQUFRLEVBQUU7WUFDMUIsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFBO1NBQ3BDO1FBQ0QsT0FBTyxJQUFJLENBQUE7SUFDZixDQUFDO0lBRUQsT0FBTyxDQUFDLFFBQW9CO1FBQ3hCLElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxPQUFPLEVBQUU7WUFDekIsUUFBUSxFQUFFLENBQUE7U0FDYjtRQUNELE9BQU8sSUFBSSxDQUFBO0lBQ2YsQ0FBQztJQUVELFNBQVM7UUFDTCxPQUFPLElBQUksQ0FBQyxNQUFNLEtBQUssSUFBSSxDQUFBO0lBQy9CLENBQUM7SUFFRCxPQUFPO1FBQ0gsT0FBTyxJQUFJLENBQUMsTUFBTSxLQUFLLE9BQU8sSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLFFBQVEsQ0FBQTtJQUM5RCxDQUFDO0lBRUQsT0FBTztRQUNILE9BQU8sSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUE7SUFDNUIsQ0FBQztJQUVELFFBQVE7UUFDSixPQUFPLElBQUksQ0FBQyxPQUFPLElBQUksZUFBZSxDQUFBO0lBQzFDLENBQUM7SUFFRCxTQUFTO1FBQ0wsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFBO0lBQ3RCLENBQUM7SUFFRCxVQUFVO1FBQ04sT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFBO0lBQ3ZCLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjbGFzcyBBcGlSZXNwb25zZTxEYXRhVHlwZT4ge1xuICAgIHByaXZhdGUgc3RhdHVzOiBzdHJpbmdcbiAgICBwcml2YXRlIGRhdGE6IGFueVxuICAgIHByaXZhdGUgbWVzc2FnZTogc3RyaW5nXG5cbiAgICBjb25zdHJ1Y3RvcihzdGF0dXM6IHN0cmluZywgZGF0YTogYW55ID0ge30sIG1lc3NhZ2U6IHN0cmluZyA9ICcnKSB7XG4gICAgICAgIHRoaXMuc3RhdHVzID0gc3RhdHVzXG4gICAgICAgIHRoaXMuZGF0YSA9IGRhdGFcbiAgICAgICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZVxuICAgIH1cblxuICAgIG9uT2soY2FsbGJhY2s6IChkYXRhOiBEYXRhVHlwZSkgPT4gdm9pZCk6IEFwaVJlc3BvbnNlPERhdGFUeXBlPiB7XG4gICAgICAgIGlmICh0aGlzLnN0YXR1cyA9PT0gJ29rJykge1xuICAgICAgICAgICAgY2FsbGJhY2sodGhpcy5kYXRhKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuXG4gICAgb25Ob3RPayhjYWxsYmFjazogKG1lc3NhZ2U6IHN0cmluZywgZGF0YTogRGF0YVR5cGUpID0+IHZvaWQpOiBBcGlSZXNwb25zZTxEYXRhVHlwZT4ge1xuICAgICAgICBpZiAodGhpcy5zdGF0dXMgPT09ICdub3Qgb2snKSB7XG4gICAgICAgICAgICBjYWxsYmFjayh0aGlzLm1lc3NhZ2UsIHRoaXMuZGF0YSlcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIG9uRXJyb3IoY2FsbGJhY2s6ICgpID0+IHZvaWQpOiBBcGlSZXNwb25zZTxEYXRhVHlwZT4ge1xuICAgICAgICBpZiAodGhpcy5zdGF0dXMgPT09ICdlcnJvcicpIHtcbiAgICAgICAgICAgIGNhbGxiYWNrKClcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIGlzU3VjY2VzcygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RhdHVzID09PSAnb2snXG4gICAgfVxuXG4gICAgaXNFcnJvcigpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RhdHVzID09PSAnZXJyb3InIHx8IHRoaXMuc3RhdHVzID09PSAnbm90IG9rJ1xuICAgIH1cblxuICAgIGdldERhdGEoKTogRGF0YVR5cGUgfCBudWxsIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YSB8fCBudWxsXG4gICAgfVxuXG4gICAgZ2V0RXJyb3IoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWVzc2FnZSB8fCAnVW5rbm93biBlcnJvcidcbiAgICB9XG5cbiAgICBnZXRTdGF0dXMoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RhdHVzXG4gICAgfVxuXG4gICAgZ2V0TWVzc2FnZSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5tZXNzYWdlXG4gICAgfVxufSJdfQ==
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { Injectable } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
/**
|
|
4
|
+
* CSRF Token Service
|
|
5
|
+
*
|
|
6
|
+
* Manages CSRF tokens for cookie-based authentication.
|
|
7
|
+
* Reads CSRF token from cookies and provides it for request headers.
|
|
8
|
+
*/
|
|
9
|
+
export class CsrfService {
|
|
10
|
+
/**
|
|
11
|
+
* Get CSRF token from cookie
|
|
12
|
+
*/
|
|
13
|
+
getCsrfToken(cookieName = 'csrf_token') {
|
|
14
|
+
const cookies = document.cookie.split(';');
|
|
15
|
+
for (const cookie of cookies) {
|
|
16
|
+
const [name, value] = cookie.trim().split('=');
|
|
17
|
+
if (name === cookieName) {
|
|
18
|
+
return decodeURIComponent(value);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
return null;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Check if CSRF token exists
|
|
25
|
+
*/
|
|
26
|
+
hasCsrfToken(cookieName = 'csrf_token') {
|
|
27
|
+
return this.getCsrfToken(cookieName) !== null;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Clear CSRF token (for logout)
|
|
31
|
+
* Note: Client-side deletion is limited for httpOnly cookies
|
|
32
|
+
*/
|
|
33
|
+
clearCsrfToken(cookieName = 'csrf_token') {
|
|
34
|
+
// Can only clear non-httpOnly cookies
|
|
35
|
+
document.cookie = `${cookieName}=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;`;
|
|
36
|
+
}
|
|
37
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: CsrfService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
38
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: CsrfService, providedIn: 'root' }); }
|
|
39
|
+
}
|
|
40
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: CsrfService, decorators: [{
|
|
41
|
+
type: Injectable,
|
|
42
|
+
args: [{
|
|
43
|
+
providedIn: 'root'
|
|
44
|
+
}]
|
|
45
|
+
}] });
|
|
46
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3NyZi5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXN0b25lc2NyaXB0cGhwLWNsaWVudC9zcmMvbGliL2NzcmYuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDOztBQUUzQzs7Ozs7R0FLRztBQUlILE1BQU0sT0FBTyxXQUFXO0lBRXBCOztPQUVHO0lBQ0gsWUFBWSxDQUFDLGFBQXFCLFlBQVk7UUFDMUMsTUFBTSxPQUFPLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDM0MsS0FBSyxNQUFNLE1BQU0sSUFBSSxPQUFPLEVBQUU7WUFDMUIsTUFBTSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsR0FBRyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQy9DLElBQUksSUFBSSxLQUFLLFVBQVUsRUFBRTtnQkFDckIsT0FBTyxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUNwQztTQUNKO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUVEOztPQUVHO0lBQ0gsWUFBWSxDQUFDLGFBQXFCLFlBQVk7UUFDMUMsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxLQUFLLElBQUksQ0FBQztJQUNsRCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsY0FBYyxDQUFDLGFBQXFCLFlBQVk7UUFDNUMsc0NBQXNDO1FBQ3RDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsR0FBRyxVQUFVLG1EQUFtRCxDQUFDO0lBQ3ZGLENBQUM7K0dBOUJRLFdBQVc7bUhBQVgsV0FBVyxjQUZSLE1BQU07OzRGQUVULFdBQVc7a0JBSHZCLFVBQVU7bUJBQUM7b0JBQ1IsVUFBVSxFQUFFLE1BQU07aUJBQ3JCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG4vKipcbiAqIENTUkYgVG9rZW4gU2VydmljZVxuICpcbiAqIE1hbmFnZXMgQ1NSRiB0b2tlbnMgZm9yIGNvb2tpZS1iYXNlZCBhdXRoZW50aWNhdGlvbi5cbiAqIFJlYWRzIENTUkYgdG9rZW4gZnJvbSBjb29raWVzIGFuZCBwcm92aWRlcyBpdCBmb3IgcmVxdWVzdCBoZWFkZXJzLlxuICovXG5ASW5qZWN0YWJsZSh7XG4gICAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIENzcmZTZXJ2aWNlIHtcblxuICAgIC8qKlxuICAgICAqIEdldCBDU1JGIHRva2VuIGZyb20gY29va2llXG4gICAgICovXG4gICAgZ2V0Q3NyZlRva2VuKGNvb2tpZU5hbWU6IHN0cmluZyA9ICdjc3JmX3Rva2VuJyk6IHN0cmluZyB8IG51bGwge1xuICAgICAgICBjb25zdCBjb29raWVzID0gZG9jdW1lbnQuY29va2llLnNwbGl0KCc7Jyk7XG4gICAgICAgIGZvciAoY29uc3QgY29va2llIG9mIGNvb2tpZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IFtuYW1lLCB2YWx1ZV0gPSBjb29raWUudHJpbSgpLnNwbGl0KCc9Jyk7XG4gICAgICAgICAgICBpZiAobmFtZSA9PT0gY29va2llTmFtZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBkZWNvZGVVUklDb21wb25lbnQodmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrIGlmIENTUkYgdG9rZW4gZXhpc3RzXG4gICAgICovXG4gICAgaGFzQ3NyZlRva2VuKGNvb2tpZU5hbWU6IHN0cmluZyA9ICdjc3JmX3Rva2VuJyk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRDc3JmVG9rZW4oY29va2llTmFtZSkgIT09IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2xlYXIgQ1NSRiB0b2tlbiAoZm9yIGxvZ291dClcbiAgICAgKiBOb3RlOiBDbGllbnQtc2lkZSBkZWxldGlvbiBpcyBsaW1pdGVkIGZvciBodHRwT25seSBjb29raWVzXG4gICAgICovXG4gICAgY2xlYXJDc3JmVG9rZW4oY29va2llTmFtZTogc3RyaW5nID0gJ2NzcmZfdG9rZW4nKTogdm9pZCB7XG4gICAgICAgIC8vIENhbiBvbmx5IGNsZWFyIG5vbi1odHRwT25seSBjb29raWVzXG4gICAgICAgIGRvY3VtZW50LmNvb2tpZSA9IGAke2Nvb2tpZU5hbWV9PTsgZXhwaXJlcz1UaHUsIDAxIEphbiAxOTcwIDAwOjAwOjAwIFVUQzsgcGF0aD0vO2A7XG4gICAgfVxufVxuIl19
|
|
@@ -14,6 +14,18 @@ export class MyEnvironmentModel {
|
|
|
14
14
|
};
|
|
15
15
|
this.apiServer = { host: '' };
|
|
16
16
|
this.chatServer = { host: '' };
|
|
17
|
+
/**
|
|
18
|
+
* Authentication configuration
|
|
19
|
+
* @default { mode: 'cookie', refreshEndpoint: '/auth/refresh', useCsrf: true }
|
|
20
|
+
*/
|
|
21
|
+
this.auth = {
|
|
22
|
+
mode: 'cookie',
|
|
23
|
+
refreshEndpoint: '/auth/refresh',
|
|
24
|
+
useCsrf: true,
|
|
25
|
+
refreshTokenCookieName: 'refresh_token',
|
|
26
|
+
csrfTokenCookieName: 'csrf_token',
|
|
27
|
+
csrfHeaderName: 'X-CSRF-Token'
|
|
28
|
+
};
|
|
17
29
|
}
|
|
18
30
|
}
|
|
19
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
31
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXktZW52aXJvbm1lbnQubW9kZWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtc3RvbmVzY3JpcHRwaHAtY2xpZW50L3NyYy9saWIvbXktZW52aXJvbm1lbnQubW9kZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBMENBLE1BQU0sT0FBTyxrQkFBa0I7SUFBL0I7UUFDSSxlQUFVLEdBQVksSUFBSSxDQUFBO1FBQzFCLGFBQVEsR0FVSjtZQUNJLFNBQVMsRUFBRSxFQUFFO1lBQ2IsS0FBSyxFQUFFLEVBQUU7WUFDVCxXQUFXLEVBQUUsRUFBRTtZQUNmLGFBQWEsRUFBRSxFQUFFO1lBQ2pCLFVBQVUsRUFBRSxFQUFFO1lBQ2QsTUFBTSxFQUFFLEVBQUU7WUFDVixVQUFVLEVBQUUsRUFBRTtZQUNkLGlCQUFpQixFQUFFLEVBQUU7WUFDckIsYUFBYSxFQUFFLEVBQUU7U0FDcEIsQ0FBQTtRQUNMLGNBQVMsR0FFTCxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsQ0FBQTtRQUNoQixlQUFVLEdBRU4sRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLENBQUE7UUFFaEI7OztXQUdHO1FBQ0gsU0FBSSxHQUFnQjtZQUNoQixJQUFJLEVBQUUsUUFBUTtZQUNkLGVBQWUsRUFBRSxlQUFlO1lBQ2hDLE9BQU8sRUFBRSxJQUFJO1lBQ2Isc0JBQXNCLEVBQUUsZUFBZTtZQUN2QyxtQkFBbUIsRUFBRSxZQUFZO1lBQ2pDLGNBQWMsRUFBRSxjQUFjO1NBQ2pDLENBQUM7SUFDTixDQUFDO0NBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgdHlwZSBBdXRoTW9kZSA9ICdjb29raWUnIHwgJ2JvZHknIHwgJ25vbmUnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEF1dGhDb25maWcge1xuICAgIC8qKlxuICAgICAqIEF1dGhlbnRpY2F0aW9uIG1vZGU6XG4gICAgICogLSAnY29va2llJzogVXNlIGh0dHBPbmx5IGNvb2tpZXMgKyBDU1JGIHRva2VucyAocmVjb21tZW5kZWQsIG1hdGNoZXMgU3RvbmVTY3JpcHRQSFAgdjIuMS54KVxuICAgICAqIC0gJ2JvZHknOiBTZW5kIHRva2VucyBpbiByZXF1ZXN0IGJvZHkgKGxlZ2FjeSBtb2RlKVxuICAgICAqIC0gJ25vbmUnOiBObyBhdXRvbWF0aWMgdG9rZW4gcmVmcmVzaFxuICAgICAqL1xuICAgIG1vZGU6IEF1dGhNb2RlO1xuXG4gICAgLyoqXG4gICAgICogVG9rZW4gcmVmcmVzaCBlbmRwb2ludCBwYXRoXG4gICAgICogQGRlZmF1bHQgJy9hdXRoL3JlZnJlc2gnIGZvciBjb29raWUgbW9kZSwgJy91c2VyL3JlZnJlc2hfYWNjZXNzJyBmb3IgYm9keSBtb2RlXG4gICAgICovXG4gICAgcmVmcmVzaEVuZHBvaW50Pzogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogRW5hYmxlIENTUkYgdG9rZW4gc3VwcG9ydCAocmVxdWlyZWQgZm9yIGNvb2tpZSBtb2RlKVxuICAgICAqIEBkZWZhdWx0IHRydWUgZm9yIGNvb2tpZSBtb2RlLCBmYWxzZSBmb3IgYm9keSBtb2RlXG4gICAgICovXG4gICAgdXNlQ3NyZj86IGJvb2xlYW47XG5cbiAgICAvKipcbiAgICAgKiBDb29raWUgbmFtZSBmb3IgcmVmcmVzaCB0b2tlblxuICAgICAqIEBkZWZhdWx0ICdyZWZyZXNoX3Rva2VuJ1xuICAgICAqL1xuICAgIHJlZnJlc2hUb2tlbkNvb2tpZU5hbWU/OiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBDb29raWUgbmFtZSBmb3IgQ1NSRiB0b2tlblxuICAgICAqIEBkZWZhdWx0ICdjc3JmX3Rva2VuJ1xuICAgICAqL1xuICAgIGNzcmZUb2tlbkNvb2tpZU5hbWU/OiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBDU1JGIGhlYWRlciBuYW1lXG4gICAgICogQGRlZmF1bHQgJ1gtQ1NSRi1Ub2tlbidcbiAgICAgKi9cbiAgICBjc3JmSGVhZGVyTmFtZT86IHN0cmluZztcbn1cblxuZXhwb3J0IGNsYXNzIE15RW52aXJvbm1lbnRNb2RlbCB7XG4gICAgcHJvZHVjdGlvbjogYm9vbGVhbiA9IHRydWVcbiAgICBmaXJlYmFzZToge1xuICAgICAgICBwcm9qZWN0SWQ6IHN0cmluZ1xuICAgICAgICBhcHBJZDogc3RyaW5nXG4gICAgICAgIGRhdGFiYXNlVVJMOiBzdHJpbmdcbiAgICAgICAgc3RvcmFnZUJ1Y2tldDogc3RyaW5nXG4gICAgICAgIGxvY2F0aW9uSWQ6IHN0cmluZ1xuICAgICAgICBhcGlLZXk6IHN0cmluZ1xuICAgICAgICBhdXRoRG9tYWluOiBzdHJpbmdcbiAgICAgICAgbWVzc2FnaW5nU2VuZGVySWQ6IHN0cmluZ1xuICAgICAgICBtZWFzdXJlbWVudElkOiBzdHJpbmdcbiAgICB9ID0ge1xuICAgICAgICAgICAgcHJvamVjdElkOiAnJyxcbiAgICAgICAgICAgIGFwcElkOiAnJyxcbiAgICAgICAgICAgIGRhdGFiYXNlVVJMOiAnJyxcbiAgICAgICAgICAgIHN0b3JhZ2VCdWNrZXQ6ICcnLFxuICAgICAgICAgICAgbG9jYXRpb25JZDogJycsXG4gICAgICAgICAgICBhcGlLZXk6ICcnLFxuICAgICAgICAgICAgYXV0aERvbWFpbjogJycsXG4gICAgICAgICAgICBtZXNzYWdpbmdTZW5kZXJJZDogJycsXG4gICAgICAgICAgICBtZWFzdXJlbWVudElkOiAnJ1xuICAgICAgICB9XG4gICAgYXBpU2VydmVyOiB7XG4gICAgICAgIGhvc3Q6IHN0cmluZ1xuICAgIH0gPSB7IGhvc3Q6ICcnIH1cbiAgICBjaGF0U2VydmVyOiB7XG4gICAgICAgIGhvc3Q6IHN0cmluZ1xuICAgIH0gPSB7IGhvc3Q6ICcnIH1cblxuICAgIC8qKlxuICAgICAqIEF1dGhlbnRpY2F0aW9uIGNvbmZpZ3VyYXRpb25cbiAgICAgKiBAZGVmYXVsdCB7IG1vZGU6ICdjb29raWUnLCByZWZyZXNoRW5kcG9pbnQ6ICcvYXV0aC9yZWZyZXNoJywgdXNlQ3NyZjogdHJ1ZSB9XG4gICAgICovXG4gICAgYXV0aD86IEF1dGhDb25maWcgPSB7XG4gICAgICAgIG1vZGU6ICdjb29raWUnLFxuICAgICAgICByZWZyZXNoRW5kcG9pbnQ6ICcvYXV0aC9yZWZyZXNoJyxcbiAgICAgICAgdXNlQ3NyZjogdHJ1ZSxcbiAgICAgICAgcmVmcmVzaFRva2VuQ29va2llTmFtZTogJ3JlZnJlc2hfdG9rZW4nLFxuICAgICAgICBjc3JmVG9rZW5Db29raWVOYW1lOiAnY3NyZl90b2tlbicsXG4gICAgICAgIGNzcmZIZWFkZXJOYW1lOiAnWC1DU1JGLVRva2VuJ1xuICAgIH07XG59Il19
|
|
@@ -13,6 +13,14 @@ export class TokenService {
|
|
|
13
13
|
localStorage.setItem(this.lsAccessTokenKey, accessToken);
|
|
14
14
|
localStorage.setItem(this.lsRefreshTokenKey, refreshToken);
|
|
15
15
|
}
|
|
16
|
+
setAccessToken(accessToken) {
|
|
17
|
+
this.accessToken = accessToken;
|
|
18
|
+
localStorage.setItem(this.lsAccessTokenKey, accessToken);
|
|
19
|
+
}
|
|
20
|
+
setRefreshToken(refreshToken) {
|
|
21
|
+
this.refreshToken = refreshToken;
|
|
22
|
+
localStorage.setItem(this.lsRefreshTokenKey, refreshToken);
|
|
23
|
+
}
|
|
16
24
|
getAccessToken() {
|
|
17
25
|
if (this.accessToken) {
|
|
18
26
|
return this.accessToken;
|
|
@@ -52,4 +60,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
|
|
|
52
60
|
providedIn: 'root'
|
|
53
61
|
}]
|
|
54
62
|
}], ctorParameters: function () { return []; } });
|
|
55
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
63
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9rZW4uc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1zdG9uZXNjcmlwdHBocC1jbGllbnQvc3JjL2xpYi90b2tlbi5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7O0FBSzNDLE1BQU0sT0FBTyxZQUFZO0lBT3JCO1FBTlEsZ0JBQVcsR0FBRyxFQUFFLENBQUE7UUFDaEIsaUJBQVksR0FBRyxFQUFFLENBQUE7UUFFakIscUJBQWdCLEdBQUcsMkJBQTJCLENBQUE7UUFDOUMsc0JBQWlCLEdBQUcsNEJBQTRCLENBQUE7SUFFeEMsQ0FBQztJQUVqQixTQUFTLENBQUMsV0FBbUIsRUFBRSxZQUFvQjtRQUMvQyxJQUFJLENBQUMsV0FBVyxHQUFHLFdBQVcsQ0FBQTtRQUM5QixJQUFJLENBQUMsWUFBWSxHQUFHLFlBQVksQ0FBQTtRQUNoQyxZQUFZLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxXQUFXLENBQUMsQ0FBQTtRQUN4RCxZQUFZLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxZQUFZLENBQUMsQ0FBQTtJQUM5RCxDQUFDO0lBRUQsY0FBYyxDQUFDLFdBQW1CO1FBQzlCLElBQUksQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFBO1FBQzlCLFlBQVksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLFdBQVcsQ0FBQyxDQUFBO0lBQzVELENBQUM7SUFFRCxlQUFlLENBQUMsWUFBb0I7UUFDaEMsSUFBSSxDQUFDLFlBQVksR0FBRyxZQUFZLENBQUE7UUFDaEMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsWUFBWSxDQUFDLENBQUE7SUFDOUQsQ0FBQztJQUVELGNBQWM7UUFDVixJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDbEIsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFBO1NBQzFCO1FBRUQsTUFBTSxpQkFBaUIsR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFBO1FBQ3JFLElBQUksaUJBQWlCLEVBQUU7WUFDbkIsT0FBTyxpQkFBaUIsQ0FBQTtTQUMzQjthQUFNO1lBQ0gsT0FBTyxFQUFFLENBQUE7U0FDWjtJQUNMLENBQUM7SUFFRCxlQUFlO1FBQ1gsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQ25CLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQTtTQUMzQjtRQUVELE1BQU0sa0JBQWtCLEdBQUcsWUFBWSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQTtRQUN2RSxJQUFJLGtCQUFrQixFQUFFO1lBQ3BCLE9BQU8sa0JBQWtCLENBQUE7U0FDNUI7YUFBTTtZQUNILE9BQU8sRUFBRSxDQUFBO1NBQ1o7SUFDTCxDQUFDO0lBRUQsS0FBSztRQUNELElBQUksQ0FBQyxXQUFXLEdBQUcsRUFBRSxDQUFBO1FBQ3JCLElBQUksQ0FBQyxZQUFZLEdBQUcsRUFBRSxDQUFBO1FBQ3RCLFlBQVksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUE7UUFDOUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQTtJQUNuRCxDQUFDOytHQXpEUSxZQUFZO21IQUFaLFlBQVksY0FGVCxNQUFNOzs0RkFFVCxZQUFZO2tCQUh4QixVQUFVO21CQUFDO29CQUNSLFVBQVUsRUFBRSxNQUFNO2lCQUNyQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuQEluamVjdGFibGUoe1xuICAgIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBUb2tlblNlcnZpY2Uge1xuICAgIHByaXZhdGUgYWNjZXNzVG9rZW4gPSAnJ1xuICAgIHByaXZhdGUgcmVmcmVzaFRva2VuID0gJydcblxuICAgIHByaXZhdGUgbHNBY2Nlc3NUb2tlbktleSA9ICdwcm9nYWxheHlhcGlfYWNjZXNzX3Rva2VuJ1xuICAgIHByaXZhdGUgbHNSZWZyZXNoVG9rZW5LZXkgPSAncHJvZ2FsYXh5YXBpX3JlZnJlc2hfdG9rZW4nXG5cbiAgICBjb25zdHJ1Y3RvcigpIHsgfVxuXG4gICAgc2V0VG9rZW5zKGFjY2Vzc1Rva2VuOiBzdHJpbmcsIHJlZnJlc2hUb2tlbjogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuYWNjZXNzVG9rZW4gPSBhY2Nlc3NUb2tlblxuICAgICAgICB0aGlzLnJlZnJlc2hUb2tlbiA9IHJlZnJlc2hUb2tlblxuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSh0aGlzLmxzQWNjZXNzVG9rZW5LZXksIGFjY2Vzc1Rva2VuKVxuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSh0aGlzLmxzUmVmcmVzaFRva2VuS2V5LCByZWZyZXNoVG9rZW4pXG4gICAgfVxuXG4gICAgc2V0QWNjZXNzVG9rZW4oYWNjZXNzVG9rZW46IHN0cmluZykge1xuICAgICAgICB0aGlzLmFjY2Vzc1Rva2VuID0gYWNjZXNzVG9rZW5cbiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0odGhpcy5sc0FjY2Vzc1Rva2VuS2V5LCBhY2Nlc3NUb2tlbilcbiAgICB9XG5cbiAgICBzZXRSZWZyZXNoVG9rZW4ocmVmcmVzaFRva2VuOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5yZWZyZXNoVG9rZW4gPSByZWZyZXNoVG9rZW5cbiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0odGhpcy5sc1JlZnJlc2hUb2tlbktleSwgcmVmcmVzaFRva2VuKVxuICAgIH1cblxuICAgIGdldEFjY2Vzc1Rva2VuKCkge1xuICAgICAgICBpZiAodGhpcy5hY2Nlc3NUb2tlbikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYWNjZXNzVG9rZW5cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHN0b3JlZEFjY2Vzc1Rva2VuID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0odGhpcy5sc0FjY2Vzc1Rva2VuS2V5KVxuICAgICAgICBpZiAoc3RvcmVkQWNjZXNzVG9rZW4pIHtcbiAgICAgICAgICAgIHJldHVybiBzdG9yZWRBY2Nlc3NUb2tlblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuICcnXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXRSZWZyZXNoVG9rZW4oKSB7XG4gICAgICAgIGlmICh0aGlzLnJlZnJlc2hUb2tlbikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVmcmVzaFRva2VuXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzdG9yZWRSZWZyZXNoVG9rZW4gPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSh0aGlzLmxzUmVmcmVzaFRva2VuS2V5KVxuICAgICAgICBpZiAoc3RvcmVkUmVmcmVzaFRva2VuKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RvcmVkUmVmcmVzaFRva2VuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gJydcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNsZWFyKCkge1xuICAgICAgICB0aGlzLmFjY2Vzc1Rva2VuID0gJydcbiAgICAgICAgdGhpcy5yZWZyZXNoVG9rZW4gPSAnJ1xuICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSh0aGlzLmxzQWNjZXNzVG9rZW5LZXkpXG4gICAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKHRoaXMubHNSZWZyZXNoVG9rZW5LZXkpXG4gICAgfVxufVxuIl19
|
package/esm2022/public-api.mjs
CHANGED
|
@@ -6,7 +6,8 @@ export * from './lib/auth.service';
|
|
|
6
6
|
export * from './lib/db.service';
|
|
7
7
|
export * from './lib/signin-status.service';
|
|
8
8
|
export * from './lib/token.service';
|
|
9
|
+
export * from './lib/csrf.service';
|
|
9
10
|
export * from './lib/api-response.model';
|
|
10
11
|
export * from './lib/my-environment.model';
|
|
11
12
|
export * from './lib/ngx-stonescriptphp-client/ngx-stonescriptphp-client.module';
|
|
12
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
13
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Byb2plY3RzL25neC1zdG9uZXNjcmlwdHBocC1jbGllbnQvc3JjL3B1YmxpYy1hcGkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLDhCQUE4QixDQUFDO0FBQzdDLGNBQWMsb0JBQW9CLENBQUM7QUFDbkMsY0FBYyxrQkFBa0IsQ0FBQztBQUNqQyxjQUFjLDZCQUE2QixDQUFDO0FBQzVDLGNBQWMscUJBQXFCLENBQUM7QUFDcEMsY0FBYyxvQkFBb0IsQ0FBQztBQUNuQyxjQUFjLDBCQUEwQixDQUFDO0FBQ3pDLGNBQWMsNEJBQTRCLENBQUM7QUFDM0MsY0FBYyxrRUFBa0UsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBQdWJsaWMgQVBJIFN1cmZhY2Ugb2Ygbmd4LXN0b25lc2NyaXB0cGhwLWNsaWVudFxuICovXG5cbmV4cG9ydCAqIGZyb20gJy4vbGliL2FwaS1jb25uZWN0aW9uLnNlcnZpY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvYXV0aC5zZXJ2aWNlJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL2RiLnNlcnZpY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvc2lnbmluLXN0YXR1cy5zZXJ2aWNlJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL3Rva2VuLnNlcnZpY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvY3NyZi5zZXJ2aWNlJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL2FwaS1yZXNwb25zZS5tb2RlbCc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9teS1lbnZpcm9ubWVudC5tb2RlbCc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9uZ3gtc3RvbmVzY3JpcHRwaHAtY2xpZW50L25neC1zdG9uZXNjcmlwdHBocC1jbGllbnQubW9kdWxlJztcbiJdfQ==
|
|
@@ -27,6 +27,24 @@ class ApiResponse {
|
|
|
27
27
|
}
|
|
28
28
|
return this;
|
|
29
29
|
}
|
|
30
|
+
isSuccess() {
|
|
31
|
+
return this.status === 'ok';
|
|
32
|
+
}
|
|
33
|
+
isError() {
|
|
34
|
+
return this.status === 'error' || this.status === 'not ok';
|
|
35
|
+
}
|
|
36
|
+
getData() {
|
|
37
|
+
return this.data || null;
|
|
38
|
+
}
|
|
39
|
+
getError() {
|
|
40
|
+
return this.message || 'Unknown error';
|
|
41
|
+
}
|
|
42
|
+
getStatus() {
|
|
43
|
+
return this.status;
|
|
44
|
+
}
|
|
45
|
+
getMessage() {
|
|
46
|
+
return this.message;
|
|
47
|
+
}
|
|
30
48
|
}
|
|
31
49
|
|
|
32
50
|
class TokenService {
|
|
@@ -42,6 +60,14 @@ class TokenService {
|
|
|
42
60
|
localStorage.setItem(this.lsAccessTokenKey, accessToken);
|
|
43
61
|
localStorage.setItem(this.lsRefreshTokenKey, refreshToken);
|
|
44
62
|
}
|
|
63
|
+
setAccessToken(accessToken) {
|
|
64
|
+
this.accessToken = accessToken;
|
|
65
|
+
localStorage.setItem(this.lsAccessTokenKey, accessToken);
|
|
66
|
+
}
|
|
67
|
+
setRefreshToken(refreshToken) {
|
|
68
|
+
this.refreshToken = refreshToken;
|
|
69
|
+
localStorage.setItem(this.lsRefreshTokenKey, refreshToken);
|
|
70
|
+
}
|
|
45
71
|
getAccessToken() {
|
|
46
72
|
if (this.accessToken) {
|
|
47
73
|
return this.accessToken;
|
|
@@ -118,17 +144,93 @@ class MyEnvironmentModel {
|
|
|
118
144
|
};
|
|
119
145
|
this.apiServer = { host: '' };
|
|
120
146
|
this.chatServer = { host: '' };
|
|
147
|
+
/**
|
|
148
|
+
* Authentication configuration
|
|
149
|
+
* @default { mode: 'cookie', refreshEndpoint: '/auth/refresh', useCsrf: true }
|
|
150
|
+
*/
|
|
151
|
+
this.auth = {
|
|
152
|
+
mode: 'cookie',
|
|
153
|
+
refreshEndpoint: '/auth/refresh',
|
|
154
|
+
useCsrf: true,
|
|
155
|
+
refreshTokenCookieName: 'refresh_token',
|
|
156
|
+
csrfTokenCookieName: 'csrf_token',
|
|
157
|
+
csrfHeaderName: 'X-CSRF-Token'
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
/**
|
|
163
|
+
* CSRF Token Service
|
|
164
|
+
*
|
|
165
|
+
* Manages CSRF tokens for cookie-based authentication.
|
|
166
|
+
* Reads CSRF token from cookies and provides it for request headers.
|
|
167
|
+
*/
|
|
168
|
+
class CsrfService {
|
|
169
|
+
/**
|
|
170
|
+
* Get CSRF token from cookie
|
|
171
|
+
*/
|
|
172
|
+
getCsrfToken(cookieName = 'csrf_token') {
|
|
173
|
+
const cookies = document.cookie.split(';');
|
|
174
|
+
for (const cookie of cookies) {
|
|
175
|
+
const [name, value] = cookie.trim().split('=');
|
|
176
|
+
if (name === cookieName) {
|
|
177
|
+
return decodeURIComponent(value);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
return null;
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Check if CSRF token exists
|
|
184
|
+
*/
|
|
185
|
+
hasCsrfToken(cookieName = 'csrf_token') {
|
|
186
|
+
return this.getCsrfToken(cookieName) !== null;
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Clear CSRF token (for logout)
|
|
190
|
+
* Note: Client-side deletion is limited for httpOnly cookies
|
|
191
|
+
*/
|
|
192
|
+
clearCsrfToken(cookieName = 'csrf_token') {
|
|
193
|
+
// Can only clear non-httpOnly cookies
|
|
194
|
+
document.cookie = `${cookieName}=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;`;
|
|
121
195
|
}
|
|
196
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: CsrfService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
197
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: CsrfService, providedIn: 'root' }); }
|
|
122
198
|
}
|
|
199
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: CsrfService, decorators: [{
|
|
200
|
+
type: Injectable,
|
|
201
|
+
args: [{
|
|
202
|
+
providedIn: 'root'
|
|
203
|
+
}]
|
|
204
|
+
}] });
|
|
123
205
|
|
|
124
206
|
class ApiConnectionService {
|
|
125
|
-
constructor(tokens, signinStatus, environment) {
|
|
207
|
+
constructor(tokens, signinStatus, environment, csrf) {
|
|
126
208
|
this.tokens = tokens;
|
|
127
209
|
this.signinStatus = signinStatus;
|
|
128
210
|
this.environment = environment;
|
|
211
|
+
this.csrf = csrf;
|
|
129
212
|
this.host = ''; // contains trailing slash
|
|
130
213
|
this.accessToken = '';
|
|
131
214
|
this.host = environment.apiServer.host;
|
|
215
|
+
// Set default auth config based on mode
|
|
216
|
+
this.authConfig = {
|
|
217
|
+
mode: environment.auth?.mode || 'cookie',
|
|
218
|
+
refreshEndpoint: environment.auth?.refreshEndpoint,
|
|
219
|
+
useCsrf: environment.auth?.useCsrf,
|
|
220
|
+
refreshTokenCookieName: environment.auth?.refreshTokenCookieName || 'refresh_token',
|
|
221
|
+
csrfTokenCookieName: environment.auth?.csrfTokenCookieName || 'csrf_token',
|
|
222
|
+
csrfHeaderName: environment.auth?.csrfHeaderName || 'X-CSRF-Token'
|
|
223
|
+
};
|
|
224
|
+
// Set default refresh endpoint based on mode if not specified
|
|
225
|
+
if (!this.authConfig.refreshEndpoint) {
|
|
226
|
+
this.authConfig.refreshEndpoint = this.authConfig.mode === 'cookie'
|
|
227
|
+
? '/auth/refresh'
|
|
228
|
+
: '/user/refresh_access';
|
|
229
|
+
}
|
|
230
|
+
// Set default CSRF setting based on mode if not specified
|
|
231
|
+
if (this.authConfig.useCsrf === undefined) {
|
|
232
|
+
this.authConfig.useCsrf = this.authConfig.mode === 'cookie';
|
|
233
|
+
}
|
|
132
234
|
}
|
|
133
235
|
async request(url, options, data) {
|
|
134
236
|
try {
|
|
@@ -185,6 +287,41 @@ class ApiConnectionService {
|
|
|
185
287
|
};
|
|
186
288
|
return this.request(url, fetchOptions, data);
|
|
187
289
|
}
|
|
290
|
+
async put(pathWithQueryParams, data) {
|
|
291
|
+
const url = this.host + pathWithQueryParams.replace(/^\/+/, '');
|
|
292
|
+
const fetchOptions = {
|
|
293
|
+
method: 'PUT',
|
|
294
|
+
mode: 'cors',
|
|
295
|
+
redirect: 'error',
|
|
296
|
+
headers: {
|
|
297
|
+
'Content-Type': 'application/json'
|
|
298
|
+
},
|
|
299
|
+
body: JSON.stringify(data)
|
|
300
|
+
};
|
|
301
|
+
return this.request(url, fetchOptions, data);
|
|
302
|
+
}
|
|
303
|
+
async patch(pathWithQueryParams, data) {
|
|
304
|
+
const url = this.host + pathWithQueryParams.replace(/^\/+/, '');
|
|
305
|
+
const fetchOptions = {
|
|
306
|
+
method: 'PATCH',
|
|
307
|
+
mode: 'cors',
|
|
308
|
+
redirect: 'error',
|
|
309
|
+
headers: {
|
|
310
|
+
'Content-Type': 'application/json'
|
|
311
|
+
},
|
|
312
|
+
body: JSON.stringify(data)
|
|
313
|
+
};
|
|
314
|
+
return this.request(url, fetchOptions, data);
|
|
315
|
+
}
|
|
316
|
+
async delete(endpoint, queryParamsObj) {
|
|
317
|
+
const url = this.host + endpoint.replace(/^\/+/, '') + this.buildQueryString(queryParamsObj);
|
|
318
|
+
const fetchOptions = {
|
|
319
|
+
method: 'DELETE',
|
|
320
|
+
mode: 'cors',
|
|
321
|
+
redirect: 'error'
|
|
322
|
+
};
|
|
323
|
+
return this.request(url, fetchOptions, null);
|
|
324
|
+
}
|
|
188
325
|
// async postFormWithFiles(pathWithQueryParams: string, formData: FormData): Promise<ApiResponse | null> {
|
|
189
326
|
// const url = this.host + pathWithQueryParams.replace(/^\/+/, '')
|
|
190
327
|
// try {
|
|
@@ -228,35 +365,114 @@ class ApiConnectionService {
|
|
|
228
365
|
return response;
|
|
229
366
|
}
|
|
230
367
|
async refreshAccessToken() {
|
|
231
|
-
|
|
232
|
-
if (!refreshToken) {
|
|
368
|
+
if (this.authConfig.mode === 'none') {
|
|
233
369
|
return false;
|
|
234
370
|
}
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
371
|
+
if (this.authConfig.mode === 'cookie') {
|
|
372
|
+
return await this.refreshAccessTokenCookieMode();
|
|
373
|
+
}
|
|
374
|
+
else {
|
|
375
|
+
return await this.refreshAccessTokenBodyMode();
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
/**
|
|
379
|
+
* Refresh access token using cookie-based auth (StoneScriptPHP v2.1.x default)
|
|
380
|
+
*/
|
|
381
|
+
async refreshAccessTokenCookieMode() {
|
|
382
|
+
try {
|
|
383
|
+
const refreshTokenUrl = this.host + this.authConfig.refreshEndpoint.replace(/^\/+/, '');
|
|
384
|
+
const headers = {
|
|
241
385
|
'Content-Type': 'application/json'
|
|
242
|
-
}
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
386
|
+
};
|
|
387
|
+
// Add CSRF token if enabled
|
|
388
|
+
if (this.authConfig.useCsrf) {
|
|
389
|
+
const csrfToken = this.csrf.getCsrfToken(this.authConfig.csrfTokenCookieName);
|
|
390
|
+
if (!csrfToken) {
|
|
391
|
+
console.error('CSRF token not found in cookie');
|
|
392
|
+
return false;
|
|
393
|
+
}
|
|
394
|
+
headers[this.authConfig.csrfHeaderName] = csrfToken;
|
|
395
|
+
}
|
|
396
|
+
let refreshTokenResponse = await fetch(refreshTokenUrl, {
|
|
397
|
+
method: 'POST',
|
|
398
|
+
mode: 'cors',
|
|
399
|
+
credentials: 'include',
|
|
400
|
+
redirect: 'error',
|
|
401
|
+
headers: headers
|
|
402
|
+
});
|
|
403
|
+
if (!refreshTokenResponse.ok) {
|
|
404
|
+
this.accessToken = '';
|
|
405
|
+
this.tokens.clear();
|
|
406
|
+
return false;
|
|
407
|
+
}
|
|
408
|
+
let refreshAccessData = await refreshTokenResponse.json();
|
|
409
|
+
if (!refreshAccessData || refreshAccessData.status !== 'ok') {
|
|
410
|
+
return false;
|
|
411
|
+
}
|
|
412
|
+
// Extract access token from response
|
|
413
|
+
const newAccessToken = refreshAccessData.data?.access_token || refreshAccessData.access_token;
|
|
414
|
+
if (!newAccessToken) {
|
|
415
|
+
console.error('No access token in refresh response');
|
|
416
|
+
return false;
|
|
417
|
+
}
|
|
418
|
+
// Store new access token (refresh token is in httpOnly cookie)
|
|
419
|
+
this.tokens.setAccessToken(newAccessToken);
|
|
420
|
+
this.accessToken = newAccessToken;
|
|
421
|
+
return true;
|
|
422
|
+
}
|
|
423
|
+
catch (error) {
|
|
424
|
+
console.error('Token refresh failed (cookie mode):', error);
|
|
249
425
|
this.accessToken = '';
|
|
250
426
|
this.tokens.clear();
|
|
251
427
|
return false;
|
|
252
428
|
}
|
|
253
|
-
|
|
254
|
-
|
|
429
|
+
}
|
|
430
|
+
/**
|
|
431
|
+
* Refresh access token using body-based auth (legacy mode)
|
|
432
|
+
*/
|
|
433
|
+
async refreshAccessTokenBodyMode() {
|
|
434
|
+
try {
|
|
435
|
+
const refreshToken = this.tokens.getRefreshToken();
|
|
436
|
+
if (!refreshToken) {
|
|
437
|
+
return false;
|
|
438
|
+
}
|
|
439
|
+
const refreshTokenUrl = this.host + this.authConfig.refreshEndpoint.replace(/^\/+/, '');
|
|
440
|
+
let refreshTokenResponse = await fetch(refreshTokenUrl, {
|
|
441
|
+
method: 'POST',
|
|
442
|
+
mode: 'cors',
|
|
443
|
+
redirect: 'error',
|
|
444
|
+
headers: {
|
|
445
|
+
'Content-Type': 'application/json'
|
|
446
|
+
},
|
|
447
|
+
body: JSON.stringify({
|
|
448
|
+
access_token: this.accessToken,
|
|
449
|
+
refresh_token: refreshToken
|
|
450
|
+
})
|
|
451
|
+
});
|
|
452
|
+
if (!refreshTokenResponse.ok) {
|
|
453
|
+
this.accessToken = '';
|
|
454
|
+
this.tokens.clear();
|
|
455
|
+
return false;
|
|
456
|
+
}
|
|
457
|
+
let refreshAccessData = await refreshTokenResponse.json();
|
|
458
|
+
if (!refreshAccessData) {
|
|
459
|
+
return false;
|
|
460
|
+
}
|
|
461
|
+
const newAccessToken = refreshAccessData.data?.access_token || refreshAccessData.access_token;
|
|
462
|
+
if (!newAccessToken) {
|
|
463
|
+
console.error('No access token in refresh response');
|
|
464
|
+
return false;
|
|
465
|
+
}
|
|
466
|
+
this.tokens.setTokens(newAccessToken, refreshToken);
|
|
467
|
+
this.accessToken = newAccessToken;
|
|
468
|
+
return true;
|
|
469
|
+
}
|
|
470
|
+
catch (error) {
|
|
471
|
+
console.error('Token refresh failed (body mode):', error);
|
|
472
|
+
this.accessToken = '';
|
|
473
|
+
this.tokens.clear();
|
|
255
474
|
return false;
|
|
256
475
|
}
|
|
257
|
-
this.tokens.setTokens(refreshAccessData.data.access_token, refreshToken);
|
|
258
|
-
this.accessToken = refreshAccessData.data.access_token;
|
|
259
|
-
return true;
|
|
260
476
|
}
|
|
261
477
|
buildQueryString(options) {
|
|
262
478
|
if (options === undefined) {
|
|
@@ -274,7 +490,7 @@ class ApiConnectionService {
|
|
|
274
490
|
}
|
|
275
491
|
return '';
|
|
276
492
|
}
|
|
277
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ApiConnectionService, deps: [{ token: TokenService }, { token: SigninStatusService }, { token: MyEnvironmentModel }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
493
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ApiConnectionService, deps: [{ token: TokenService }, { token: SigninStatusService }, { token: MyEnvironmentModel }, { token: CsrfService }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
278
494
|
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ApiConnectionService, providedIn: 'root' }); }
|
|
279
495
|
}
|
|
280
496
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ApiConnectionService, decorators: [{
|
|
@@ -282,7 +498,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
|
|
|
282
498
|
args: [{
|
|
283
499
|
providedIn: 'root'
|
|
284
500
|
}]
|
|
285
|
-
}], ctorParameters: function () { return [{ type: TokenService }, { type: SigninStatusService }, { type: MyEnvironmentModel }]; } });
|
|
501
|
+
}], ctorParameters: function () { return [{ type: TokenService }, { type: SigninStatusService }, { type: MyEnvironmentModel }, { type: CsrfService }]; } });
|
|
286
502
|
|
|
287
503
|
class AuthService {
|
|
288
504
|
constructor() { }
|
|
@@ -339,5 +555,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
|
|
|
339
555
|
* Generated bundle index. Do not edit.
|
|
340
556
|
*/
|
|
341
557
|
|
|
342
|
-
export { ApiConnectionService, ApiResponse, AuthService, DbService, MyEnvironmentModel, NgxStoneScriptPhpClientModule, SigninStatusService, TokenService };
|
|
558
|
+
export { ApiConnectionService, ApiResponse, AuthService, CsrfService, DbService, MyEnvironmentModel, NgxStoneScriptPhpClientModule, SigninStatusService, TokenService };
|
|
343
559
|
//# sourceMappingURL=progalaxyelabs-ngx-stonescriptphp-client.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"progalaxyelabs-ngx-stonescriptphp-client.mjs","sources":["../../../projects/ngx-stonescriptphp-client/src/lib/api-response.model.ts","../../../projects/ngx-stonescriptphp-client/src/lib/token.service.ts","../../../projects/ngx-stonescriptphp-client/src/lib/signin-status.service.ts","../../../projects/ngx-stonescriptphp-client/src/lib/my-environment.model.ts","../../../projects/ngx-stonescriptphp-client/src/lib/api-connection.service.ts","../../../projects/ngx-stonescriptphp-client/src/lib/auth.service.ts","../../../projects/ngx-stonescriptphp-client/src/lib/db.service.ts","../../../projects/ngx-stonescriptphp-client/src/lib/ngx-stonescriptphp-client/ngx-stonescriptphp-client.module.ts","../../../projects/ngx-stonescriptphp-client/src/public-api.ts","../../../projects/ngx-stonescriptphp-client/src/progalaxyelabs-ngx-stonescriptphp-client.ts"],"sourcesContent":["export class ApiResponse<DataType> {\n private status: string\n private data: any\n private message: string\n\n constructor(status: string, data: any = {}, message: string = '') {\n this.status = status\n this.data = data\n this.message = message\n }\n\n onOk(callback: (data: DataType) => void): ApiResponse<DataType> {\n if (this.status === 'ok') {\n callback(this.data)\n }\n return this\n }\n\n onNotOk(callback: (message: string, data: DataType) => void): ApiResponse<DataType> {\n if (this.status === 'not ok') {\n callback(this.message, this.data)\n }\n return this\n }\n\n onError(callback: () => void): ApiResponse<DataType> {\n if (this.status === 'error') {\n callback()\n }\n return this\n }\n}","import { Injectable } from '@angular/core';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class TokenService {\n private accessToken = ''\n private refreshToken = ''\n\n private lsAccessTokenKey = 'progalaxyapi_access_token'\n private lsRefreshTokenKey = 'progalaxyapi_refresh_token'\n\n constructor() { }\n\n setTokens(accessToken: string, refreshToken: string) {\n this.accessToken = accessToken\n this.refreshToken = refreshToken\n localStorage.setItem(this.lsAccessTokenKey, accessToken)\n localStorage.setItem(this.lsRefreshTokenKey, refreshToken)\n }\n\n getAccessToken() {\n if (this.accessToken) {\n return this.accessToken\n }\n\n const storedAccessToken = localStorage.getItem(this.lsAccessTokenKey)\n if (storedAccessToken) {\n return storedAccessToken\n } else {\n return ''\n }\n }\n\n getRefreshToken() {\n if (this.refreshToken) {\n return this.refreshToken\n }\n\n const storedRefreshToken = localStorage.getItem(this.lsRefreshTokenKey)\n if (storedRefreshToken) {\n return storedRefreshToken\n } else {\n return ''\n }\n }\n\n clear() {\n this.accessToken = ''\n this.refreshToken = ''\n localStorage.removeItem(this.lsAccessTokenKey)\n localStorage.removeItem(this.lsRefreshTokenKey)\n }\n}\n","import { Injectable } from '@angular/core';\nimport { BehaviorSubject } from 'rxjs';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class SigninStatusService {\n public status: BehaviorSubject<boolean>\n\n constructor() {\n this.status = new BehaviorSubject<boolean>(false)\n }\n\n signedOut(): void {\n this.status.next(false)\n }\n\n signedIn(): void {\n this.status.next(true)\n }\n}\n","export class MyEnvironmentModel {\n production: boolean = true\n firebase: {\n projectId: string\n appId: string\n databaseURL: string\n storageBucket: string\n locationId: string\n apiKey: string\n authDomain: string\n messagingSenderId: string\n measurementId: string\n } = {\n projectId: '',\n appId: '',\n databaseURL: '',\n storageBucket: '',\n locationId: '',\n apiKey: '',\n authDomain: '',\n messagingSenderId: '',\n measurementId: ''\n }\n apiServer: {\n host: string\n } = { host: '' }\n chatServer: {\n host: string\n } = { host: '' };\n}","import { Injectable } from '@angular/core';\nimport { TokenService } from './token.service';\nimport { SigninStatusService } from './signin-status.service';\nimport { ApiResponse } from './api-response.model';\nimport { MyEnvironmentModel } from './my-environment.model';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class ApiConnectionService {\n\n private host = '' // contains trailing slash\n\n private accessToken = ''\n\n constructor(\n private tokens: TokenService,\n private signinStatus: SigninStatusService,\n private environment: MyEnvironmentModel\n ) {\n this.host = environment.apiServer.host\n }\n\n\n private async request<DataType>(url: string, options: any, data: any | null): Promise<ApiResponse<DataType>> {\n try {\n \n if(data !== null) {\n const body = JSON.stringify(data)\n if(body) {\n options.body = body\n } else {\n options.body = {}\n }\n }\n\n const accessTokenIncluded = this.includeAccessToken(options)\n\n let response: Response = await fetch(url, options)\n\n if ((response.status === 401) && accessTokenIncluded) {\n response = await this.refreshAccessTokenAndRetry(url, options, response)\n }\n\n if (response.ok) {\n const json = await (response.json())\n return (new ApiResponse<DataType>(json.status, json.data, json.message))\n }\n\n if (response.status === 401) {\n this.signinStatus.signedOut()\n }\n\n return this.handleError<DataType>(response)\n } catch (error) {\n return this.handleError<DataType>(error)\n }\n }\n\n private handleError<DataType>(error: any): ApiResponse<DataType> {\n console.error(\n `Backend returned code ${error.status}, ` +\n `full error: `, error);\n return new ApiResponse<DataType>('error')\n }\n\n async get<DataType>(endpoint: string, queryParamsObj?: any ): Promise<ApiResponse<DataType>> {\n const url = this.host + endpoint.replace(/^\\/+/, '') + this.buildQueryString(queryParamsObj)\n const fetchOptions: RequestInit = {\n mode: 'cors',\n redirect: 'error'\n }\n return this.request(url, fetchOptions, null)\n }\n\n async post<DataType>(pathWithQueryParams: string, data: any): Promise<ApiResponse<DataType>> {\n const url = this.host + pathWithQueryParams.replace(/^\\/+/, '')\n const fetchOptions: RequestInit = {\n method: 'POST',\n mode: 'cors',\n redirect: 'error',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(data)\n }\n return this.request(url, fetchOptions, data) \n }\n\n // async postFormWithFiles(pathWithQueryParams: string, formData: FormData): Promise<ApiResponse | null> {\n // const url = this.host + pathWithQueryParams.replace(/^\\/+/, '')\n // try {\n // const fetchOptions: RequestInit = {\n // method: 'POST',\n // mode: 'cors',\n // redirect: 'error',\n // body: formData\n // }\n\n // const accessTokenIncluded = this.includeAccessToken(fetchOptions)\n\n // let response: Response = await fetch(url, fetchOptions)\n\n // if ((response.status === 401) && accessTokenIncluded) {\n // response = await this.refreshAccessTokenAndRetry(url, fetchOptions, response)\n // }\n\n // if (response.ok) {\n // return ((await (response.json()) as ApiResponse))\n // }\n\n // return this.handleError(response)\n // } catch (error) {\n // return this.handleError(error)\n // }\n // }\n\n private includeAccessToken(options: any): boolean {\n this.accessToken = this.tokens.getAccessToken()\n if (!this.accessToken) {\n return false\n }\n\n if (!options.headers) {\n options.headers = {}\n }\n options.headers['Authorization'] = 'Bearer ' + this.accessToken\n return true\n }\n\n private async refreshAccessTokenAndRetry(url: string, fetchOptions: any, response: Response): Promise<Response> {\n\n const refreshStatusOk = await this.refreshAccessToken()\n if (!refreshStatusOk) {\n return response\n }\n\n fetchOptions.headers['Authorization'] = 'Bearer ' + this.accessToken\n response = await fetch(url, fetchOptions)\n return response\n }\n\n async refreshAccessToken(): Promise<boolean> {\n const refreshToken = this.tokens.getRefreshToken()\n if (!refreshToken) {\n return false\n }\n\n const refreshTokenUrl = this.host + 'user/refresh_access'\n let refreshTokenResponse = await fetch(refreshTokenUrl, {\n method: 'POST',\n mode: 'cors',\n redirect: 'error',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n access_token: this.accessToken,\n refresh_token: refreshToken\n })\n })\n if (!refreshTokenResponse.ok) {\n this.accessToken = ''\n this.tokens.clear()\n return false\n }\n\n let refreshAccessData = await refreshTokenResponse.json()\n if (!refreshAccessData) {\n return false\n }\n this.tokens.setTokens(refreshAccessData.data.access_token, refreshToken)\n this.accessToken = refreshAccessData.data.access_token\n\n return true\n }\n\n buildQueryString(options?: any): string {\n if (options === undefined) {\n return ''\n }\n\n const array = []\n for (let key in options) {\n if (options.hasOwnProperty(key) && (options[key] !== null) && (options[key] !== undefined)) {\n array.push(encodeURIComponent(key) + \"=\" + encodeURIComponent(options[key]))\n }\n }\n const str = array.join('&')\n if (str !== '') {\n return '?' + str\n }\n\n return ''\n }\n}\n","import { Injectable } from '@angular/core';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class AuthService {\n\n constructor() { }\n}\n","import { Injectable } from '@angular/core';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class DbService {\n\n constructor() { }\n}\n","import { ModuleWithProviders, NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { MyEnvironmentModel } from '../my-environment.model';\n\n\n\n@NgModule({\n declarations: [],\n imports: [\n CommonModule\n ]\n})\nexport class NgxStoneScriptPhpClientModule {\n public static forRoot(environment: MyEnvironmentModel): ModuleWithProviders<NgxStoneScriptPhpClientModule> {\n return {\n ngModule: NgxStoneScriptPhpClientModule,\n providers: [\n { provide: MyEnvironmentModel, useValue: environment }\n ]\n }\n }\n}\n","/*\n * Public API Surface of ngx-stonescriptphp-client\n */\n\nexport * from './lib/api-connection.service';\nexport * from './lib/auth.service';\nexport * from './lib/db.service';\nexport * from './lib/signin-status.service';\nexport * from './lib/token.service';\nexport * from './lib/api-response.model';\nexport * from './lib/my-environment.model';\nexport * from './lib/ngx-stonescriptphp-client/ngx-stonescriptphp-client.module';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.TokenService","i2.SigninStatusService","i3.MyEnvironmentModel"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"progalaxyelabs-ngx-stonescriptphp-client.mjs","sources":["../../../projects/ngx-stonescriptphp-client/src/lib/api-response.model.ts","../../../projects/ngx-stonescriptphp-client/src/lib/token.service.ts","../../../projects/ngx-stonescriptphp-client/src/lib/signin-status.service.ts","../../../projects/ngx-stonescriptphp-client/src/lib/my-environment.model.ts","../../../projects/ngx-stonescriptphp-client/src/lib/csrf.service.ts","../../../projects/ngx-stonescriptphp-client/src/lib/api-connection.service.ts","../../../projects/ngx-stonescriptphp-client/src/lib/auth.service.ts","../../../projects/ngx-stonescriptphp-client/src/lib/db.service.ts","../../../projects/ngx-stonescriptphp-client/src/lib/ngx-stonescriptphp-client/ngx-stonescriptphp-client.module.ts","../../../projects/ngx-stonescriptphp-client/src/public-api.ts","../../../projects/ngx-stonescriptphp-client/src/progalaxyelabs-ngx-stonescriptphp-client.ts"],"sourcesContent":["export class ApiResponse<DataType> {\n private status: string\n private data: any\n private message: string\n\n constructor(status: string, data: any = {}, message: string = '') {\n this.status = status\n this.data = data\n this.message = message\n }\n\n onOk(callback: (data: DataType) => void): ApiResponse<DataType> {\n if (this.status === 'ok') {\n callback(this.data)\n }\n return this\n }\n\n onNotOk(callback: (message: string, data: DataType) => void): ApiResponse<DataType> {\n if (this.status === 'not ok') {\n callback(this.message, this.data)\n }\n return this\n }\n\n onError(callback: () => void): ApiResponse<DataType> {\n if (this.status === 'error') {\n callback()\n }\n return this\n }\n\n isSuccess(): boolean {\n return this.status === 'ok'\n }\n\n isError(): boolean {\n return this.status === 'error' || this.status === 'not ok'\n }\n\n getData(): DataType | null {\n return this.data || null\n }\n\n getError(): string {\n return this.message || 'Unknown error'\n }\n\n getStatus(): string {\n return this.status\n }\n\n getMessage(): string {\n return this.message\n }\n}","import { Injectable } from '@angular/core';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class TokenService {\n private accessToken = ''\n private refreshToken = ''\n\n private lsAccessTokenKey = 'progalaxyapi_access_token'\n private lsRefreshTokenKey = 'progalaxyapi_refresh_token'\n\n constructor() { }\n\n setTokens(accessToken: string, refreshToken: string) {\n this.accessToken = accessToken\n this.refreshToken = refreshToken\n localStorage.setItem(this.lsAccessTokenKey, accessToken)\n localStorage.setItem(this.lsRefreshTokenKey, refreshToken)\n }\n\n setAccessToken(accessToken: string) {\n this.accessToken = accessToken\n localStorage.setItem(this.lsAccessTokenKey, accessToken)\n }\n\n setRefreshToken(refreshToken: string) {\n this.refreshToken = refreshToken\n localStorage.setItem(this.lsRefreshTokenKey, refreshToken)\n }\n\n getAccessToken() {\n if (this.accessToken) {\n return this.accessToken\n }\n\n const storedAccessToken = localStorage.getItem(this.lsAccessTokenKey)\n if (storedAccessToken) {\n return storedAccessToken\n } else {\n return ''\n }\n }\n\n getRefreshToken() {\n if (this.refreshToken) {\n return this.refreshToken\n }\n\n const storedRefreshToken = localStorage.getItem(this.lsRefreshTokenKey)\n if (storedRefreshToken) {\n return storedRefreshToken\n } else {\n return ''\n }\n }\n\n clear() {\n this.accessToken = ''\n this.refreshToken = ''\n localStorage.removeItem(this.lsAccessTokenKey)\n localStorage.removeItem(this.lsRefreshTokenKey)\n }\n}\n","import { Injectable } from '@angular/core';\nimport { BehaviorSubject } from 'rxjs';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class SigninStatusService {\n public status: BehaviorSubject<boolean>\n\n constructor() {\n this.status = new BehaviorSubject<boolean>(false)\n }\n\n signedOut(): void {\n this.status.next(false)\n }\n\n signedIn(): void {\n this.status.next(true)\n }\n}\n","export type AuthMode = 'cookie' | 'body' | 'none';\n\nexport interface AuthConfig {\n /**\n * Authentication mode:\n * - 'cookie': Use httpOnly cookies + CSRF tokens (recommended, matches StoneScriptPHP v2.1.x)\n * - 'body': Send tokens in request body (legacy mode)\n * - 'none': No automatic token refresh\n */\n mode: AuthMode;\n\n /**\n * Token refresh endpoint path\n * @default '/auth/refresh' for cookie mode, '/user/refresh_access' for body mode\n */\n refreshEndpoint?: string;\n\n /**\n * Enable CSRF token support (required for cookie mode)\n * @default true for cookie mode, false for body mode\n */\n useCsrf?: boolean;\n\n /**\n * Cookie name for refresh token\n * @default 'refresh_token'\n */\n refreshTokenCookieName?: string;\n\n /**\n * Cookie name for CSRF token\n * @default 'csrf_token'\n */\n csrfTokenCookieName?: string;\n\n /**\n * CSRF header name\n * @default 'X-CSRF-Token'\n */\n csrfHeaderName?: string;\n}\n\nexport class MyEnvironmentModel {\n production: boolean = true\n firebase: {\n projectId: string\n appId: string\n databaseURL: string\n storageBucket: string\n locationId: string\n apiKey: string\n authDomain: string\n messagingSenderId: string\n measurementId: string\n } = {\n projectId: '',\n appId: '',\n databaseURL: '',\n storageBucket: '',\n locationId: '',\n apiKey: '',\n authDomain: '',\n messagingSenderId: '',\n measurementId: ''\n }\n apiServer: {\n host: string\n } = { host: '' }\n chatServer: {\n host: string\n } = { host: '' }\n\n /**\n * Authentication configuration\n * @default { mode: 'cookie', refreshEndpoint: '/auth/refresh', useCsrf: true }\n */\n auth?: AuthConfig = {\n mode: 'cookie',\n refreshEndpoint: '/auth/refresh',\n useCsrf: true,\n refreshTokenCookieName: 'refresh_token',\n csrfTokenCookieName: 'csrf_token',\n csrfHeaderName: 'X-CSRF-Token'\n };\n}","import { Injectable } from '@angular/core';\n\n/**\n * CSRF Token Service\n *\n * Manages CSRF tokens for cookie-based authentication.\n * Reads CSRF token from cookies and provides it for request headers.\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class CsrfService {\n\n /**\n * Get CSRF token from cookie\n */\n getCsrfToken(cookieName: string = 'csrf_token'): string | null {\n const cookies = document.cookie.split(';');\n for (const cookie of cookies) {\n const [name, value] = cookie.trim().split('=');\n if (name === cookieName) {\n return decodeURIComponent(value);\n }\n }\n return null;\n }\n\n /**\n * Check if CSRF token exists\n */\n hasCsrfToken(cookieName: string = 'csrf_token'): boolean {\n return this.getCsrfToken(cookieName) !== null;\n }\n\n /**\n * Clear CSRF token (for logout)\n * Note: Client-side deletion is limited for httpOnly cookies\n */\n clearCsrfToken(cookieName: string = 'csrf_token'): void {\n // Can only clear non-httpOnly cookies\n document.cookie = `${cookieName}=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;`;\n }\n}\n","import { Injectable } from '@angular/core';\nimport { TokenService } from './token.service';\nimport { SigninStatusService } from './signin-status.service';\nimport { ApiResponse } from './api-response.model';\nimport { MyEnvironmentModel, AuthConfig } from './my-environment.model';\nimport { CsrfService } from './csrf.service';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class ApiConnectionService {\n\n private host = '' // contains trailing slash\n\n private accessToken = ''\n\n private authConfig: AuthConfig\n\n constructor(\n private tokens: TokenService,\n private signinStatus: SigninStatusService,\n private environment: MyEnvironmentModel,\n private csrf: CsrfService\n ) {\n this.host = environment.apiServer.host\n\n // Set default auth config based on mode\n this.authConfig = {\n mode: environment.auth?.mode || 'cookie',\n refreshEndpoint: environment.auth?.refreshEndpoint,\n useCsrf: environment.auth?.useCsrf,\n refreshTokenCookieName: environment.auth?.refreshTokenCookieName || 'refresh_token',\n csrfTokenCookieName: environment.auth?.csrfTokenCookieName || 'csrf_token',\n csrfHeaderName: environment.auth?.csrfHeaderName || 'X-CSRF-Token'\n }\n\n // Set default refresh endpoint based on mode if not specified\n if (!this.authConfig.refreshEndpoint) {\n this.authConfig.refreshEndpoint = this.authConfig.mode === 'cookie'\n ? '/auth/refresh'\n : '/user/refresh_access'\n }\n\n // Set default CSRF setting based on mode if not specified\n if (this.authConfig.useCsrf === undefined) {\n this.authConfig.useCsrf = this.authConfig.mode === 'cookie'\n }\n }\n\n\n private async request<DataType>(url: string, options: any, data: any | null): Promise<ApiResponse<DataType>> {\n try {\n \n if(data !== null) {\n const body = JSON.stringify(data)\n if(body) {\n options.body = body\n } else {\n options.body = {}\n }\n }\n\n const accessTokenIncluded = this.includeAccessToken(options)\n\n let response: Response = await fetch(url, options)\n\n if ((response.status === 401) && accessTokenIncluded) {\n response = await this.refreshAccessTokenAndRetry(url, options, response)\n }\n\n if (response.ok) {\n const json = await (response.json())\n return (new ApiResponse<DataType>(json.status, json.data, json.message))\n }\n\n if (response.status === 401) {\n this.signinStatus.signedOut()\n }\n\n return this.handleError<DataType>(response)\n } catch (error) {\n return this.handleError<DataType>(error)\n }\n }\n\n private handleError<DataType>(error: any): ApiResponse<DataType> {\n console.error(\n `Backend returned code ${error.status}, ` +\n `full error: `, error);\n return new ApiResponse<DataType>('error')\n }\n\n async get<DataType>(endpoint: string, queryParamsObj?: any ): Promise<ApiResponse<DataType>> {\n const url = this.host + endpoint.replace(/^\\/+/, '') + this.buildQueryString(queryParamsObj)\n const fetchOptions: RequestInit = {\n mode: 'cors',\n redirect: 'error'\n }\n return this.request(url, fetchOptions, null)\n }\n\n async post<DataType>(pathWithQueryParams: string, data: any): Promise<ApiResponse<DataType>> {\n const url = this.host + pathWithQueryParams.replace(/^\\/+/, '')\n const fetchOptions: RequestInit = {\n method: 'POST',\n mode: 'cors',\n redirect: 'error',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(data)\n }\n return this.request(url, fetchOptions, data)\n }\n\n async put<DataType>(pathWithQueryParams: string, data: any): Promise<ApiResponse<DataType>> {\n const url = this.host + pathWithQueryParams.replace(/^\\/+/, '')\n const fetchOptions: RequestInit = {\n method: 'PUT',\n mode: 'cors',\n redirect: 'error',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(data)\n }\n return this.request(url, fetchOptions, data)\n }\n\n async patch<DataType>(pathWithQueryParams: string, data: any): Promise<ApiResponse<DataType>> {\n const url = this.host + pathWithQueryParams.replace(/^\\/+/, '')\n const fetchOptions: RequestInit = {\n method: 'PATCH',\n mode: 'cors',\n redirect: 'error',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(data)\n }\n return this.request(url, fetchOptions, data)\n }\n\n async delete<DataType>(endpoint: string, queryParamsObj?: any): Promise<ApiResponse<DataType>> {\n const url = this.host + endpoint.replace(/^\\/+/, '') + this.buildQueryString(queryParamsObj)\n const fetchOptions: RequestInit = {\n method: 'DELETE',\n mode: 'cors',\n redirect: 'error'\n }\n return this.request(url, fetchOptions, null)\n }\n\n // async postFormWithFiles(pathWithQueryParams: string, formData: FormData): Promise<ApiResponse | null> {\n // const url = this.host + pathWithQueryParams.replace(/^\\/+/, '')\n // try {\n // const fetchOptions: RequestInit = {\n // method: 'POST',\n // mode: 'cors',\n // redirect: 'error',\n // body: formData\n // }\n\n // const accessTokenIncluded = this.includeAccessToken(fetchOptions)\n\n // let response: Response = await fetch(url, fetchOptions)\n\n // if ((response.status === 401) && accessTokenIncluded) {\n // response = await this.refreshAccessTokenAndRetry(url, fetchOptions, response)\n // }\n\n // if (response.ok) {\n // return ((await (response.json()) as ApiResponse))\n // }\n\n // return this.handleError(response)\n // } catch (error) {\n // return this.handleError(error)\n // }\n // }\n\n private includeAccessToken(options: any): boolean {\n this.accessToken = this.tokens.getAccessToken()\n if (!this.accessToken) {\n return false\n }\n\n if (!options.headers) {\n options.headers = {}\n }\n options.headers['Authorization'] = 'Bearer ' + this.accessToken\n return true\n }\n\n private async refreshAccessTokenAndRetry(url: string, fetchOptions: any, response: Response): Promise<Response> {\n\n const refreshStatusOk = await this.refreshAccessToken()\n if (!refreshStatusOk) {\n return response\n }\n\n fetchOptions.headers['Authorization'] = 'Bearer ' + this.accessToken\n response = await fetch(url, fetchOptions)\n return response\n }\n\n async refreshAccessToken(): Promise<boolean> {\n if (this.authConfig.mode === 'none') {\n return false\n }\n\n if (this.authConfig.mode === 'cookie') {\n return await this.refreshAccessTokenCookieMode()\n } else {\n return await this.refreshAccessTokenBodyMode()\n }\n }\n\n /**\n * Refresh access token using cookie-based auth (StoneScriptPHP v2.1.x default)\n */\n private async refreshAccessTokenCookieMode(): Promise<boolean> {\n try {\n const refreshTokenUrl = this.host + this.authConfig.refreshEndpoint!.replace(/^\\/+/, '')\n const headers: any = {\n 'Content-Type': 'application/json'\n }\n\n // Add CSRF token if enabled\n if (this.authConfig.useCsrf) {\n const csrfToken = this.csrf.getCsrfToken(this.authConfig.csrfTokenCookieName!)\n if (!csrfToken) {\n console.error('CSRF token not found in cookie')\n return false\n }\n headers[this.authConfig.csrfHeaderName!] = csrfToken\n }\n\n let refreshTokenResponse = await fetch(refreshTokenUrl, {\n method: 'POST',\n mode: 'cors',\n credentials: 'include', // Important: send cookies\n redirect: 'error',\n headers: headers\n })\n\n if (!refreshTokenResponse.ok) {\n this.accessToken = ''\n this.tokens.clear()\n return false\n }\n\n let refreshAccessData = await refreshTokenResponse.json()\n if (!refreshAccessData || refreshAccessData.status !== 'ok') {\n return false\n }\n\n // Extract access token from response\n const newAccessToken = refreshAccessData.data?.access_token || refreshAccessData.access_token\n if (!newAccessToken) {\n console.error('No access token in refresh response')\n return false\n }\n\n // Store new access token (refresh token is in httpOnly cookie)\n this.tokens.setAccessToken(newAccessToken)\n this.accessToken = newAccessToken\n\n return true\n } catch (error) {\n console.error('Token refresh failed (cookie mode):', error)\n this.accessToken = ''\n this.tokens.clear()\n return false\n }\n }\n\n /**\n * Refresh access token using body-based auth (legacy mode)\n */\n private async refreshAccessTokenBodyMode(): Promise<boolean> {\n try {\n const refreshToken = this.tokens.getRefreshToken()\n if (!refreshToken) {\n return false\n }\n\n const refreshTokenUrl = this.host + this.authConfig.refreshEndpoint!.replace(/^\\/+/, '')\n let refreshTokenResponse = await fetch(refreshTokenUrl, {\n method: 'POST',\n mode: 'cors',\n redirect: 'error',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n access_token: this.accessToken,\n refresh_token: refreshToken\n })\n })\n\n if (!refreshTokenResponse.ok) {\n this.accessToken = ''\n this.tokens.clear()\n return false\n }\n\n let refreshAccessData = await refreshTokenResponse.json()\n if (!refreshAccessData) {\n return false\n }\n\n const newAccessToken = refreshAccessData.data?.access_token || refreshAccessData.access_token\n if (!newAccessToken) {\n console.error('No access token in refresh response')\n return false\n }\n\n this.tokens.setTokens(newAccessToken, refreshToken)\n this.accessToken = newAccessToken\n\n return true\n } catch (error) {\n console.error('Token refresh failed (body mode):', error)\n this.accessToken = ''\n this.tokens.clear()\n return false\n }\n }\n\n buildQueryString(options?: any): string {\n if (options === undefined) {\n return ''\n }\n\n const array = []\n for (let key in options) {\n if (options.hasOwnProperty(key) && (options[key] !== null) && (options[key] !== undefined)) {\n array.push(encodeURIComponent(key) + \"=\" + encodeURIComponent(options[key]))\n }\n }\n const str = array.join('&')\n if (str !== '') {\n return '?' + str\n }\n\n return ''\n }\n}\n","import { Injectable } from '@angular/core';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class AuthService {\n\n constructor() { }\n}\n","import { Injectable } from '@angular/core';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class DbService {\n\n constructor() { }\n}\n","import { ModuleWithProviders, NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { MyEnvironmentModel } from '../my-environment.model';\n\n\n\n@NgModule({\n declarations: [],\n imports: [\n CommonModule\n ]\n})\nexport class NgxStoneScriptPhpClientModule {\n public static forRoot(environment: MyEnvironmentModel): ModuleWithProviders<NgxStoneScriptPhpClientModule> {\n return {\n ngModule: NgxStoneScriptPhpClientModule,\n providers: [\n { provide: MyEnvironmentModel, useValue: environment }\n ]\n }\n }\n}\n","/*\n * Public API Surface of ngx-stonescriptphp-client\n */\n\nexport * from './lib/api-connection.service';\nexport * from './lib/auth.service';\nexport * from './lib/db.service';\nexport * from './lib/signin-status.service';\nexport * from './lib/token.service';\nexport * from './lib/csrf.service';\nexport * from './lib/api-response.model';\nexport * from './lib/my-environment.model';\nexport * from './lib/ngx-stonescriptphp-client/ngx-stonescriptphp-client.module';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.TokenService","i2.SigninStatusService","i3.MyEnvironmentModel","i4.CsrfService"],"mappings":";;;;;MAAa,WAAW,CAAA;AAKpB,IAAA,WAAA,CAAY,MAAc,EAAE,IAAA,GAAY,EAAE,EAAE,UAAkB,EAAE,EAAA;AAC5D,QAAA,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;AACpB,QAAA,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;AAChB,QAAA,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;KACzB;AAED,IAAA,IAAI,CAAC,QAAkC,EAAA;AACnC,QAAA,IAAI,IAAI,CAAC,MAAM,KAAK,IAAI,EAAE;AACtB,YAAA,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACtB,SAAA;AACD,QAAA,OAAO,IAAI,CAAA;KACd;AAED,IAAA,OAAO,CAAC,QAAmD,EAAA;AACvD,QAAA,IAAI,IAAI,CAAC,MAAM,KAAK,QAAQ,EAAE;YAC1B,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,CAAA;AACpC,SAAA;AACD,QAAA,OAAO,IAAI,CAAA;KACd;AAED,IAAA,OAAO,CAAC,QAAoB,EAAA;AACxB,QAAA,IAAI,IAAI,CAAC,MAAM,KAAK,OAAO,EAAE;AACzB,YAAA,QAAQ,EAAE,CAAA;AACb,SAAA;AACD,QAAA,OAAO,IAAI,CAAA;KACd;IAED,SAAS,GAAA;AACL,QAAA,OAAO,IAAI,CAAC,MAAM,KAAK,IAAI,CAAA;KAC9B;IAED,OAAO,GAAA;QACH,OAAO,IAAI,CAAC,MAAM,KAAK,OAAO,IAAI,IAAI,CAAC,MAAM,KAAK,QAAQ,CAAA;KAC7D;IAED,OAAO,GAAA;AACH,QAAA,OAAO,IAAI,CAAC,IAAI,IAAI,IAAI,CAAA;KAC3B;IAED,QAAQ,GAAA;AACJ,QAAA,OAAO,IAAI,CAAC,OAAO,IAAI,eAAe,CAAA;KACzC;IAED,SAAS,GAAA;QACL,OAAO,IAAI,CAAC,MAAM,CAAA;KACrB;IAED,UAAU,GAAA;QACN,OAAO,IAAI,CAAC,OAAO,CAAA;KACtB;AACJ;;MClDY,YAAY,CAAA;AAOrB,IAAA,WAAA,GAAA;QANQ,IAAW,CAAA,WAAA,GAAG,EAAE,CAAA;QAChB,IAAY,CAAA,YAAA,GAAG,EAAE,CAAA;QAEjB,IAAgB,CAAA,gBAAA,GAAG,2BAA2B,CAAA;QAC9C,IAAiB,CAAA,iBAAA,GAAG,4BAA4B,CAAA;KAEvC;IAEjB,SAAS,CAAC,WAAmB,EAAE,YAAoB,EAAA;AAC/C,QAAA,IAAI,CAAC,WAAW,GAAG,WAAW,CAAA;AAC9B,QAAA,IAAI,CAAC,YAAY,GAAG,YAAY,CAAA;QAChC,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,gBAAgB,EAAE,WAAW,CAAC,CAAA;QACxD,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,iBAAiB,EAAE,YAAY,CAAC,CAAA;KAC7D;AAED,IAAA,cAAc,CAAC,WAAmB,EAAA;AAC9B,QAAA,IAAI,CAAC,WAAW,GAAG,WAAW,CAAA;QAC9B,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,gBAAgB,EAAE,WAAW,CAAC,CAAA;KAC3D;AAED,IAAA,eAAe,CAAC,YAAoB,EAAA;AAChC,QAAA,IAAI,CAAC,YAAY,GAAG,YAAY,CAAA;QAChC,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,iBAAiB,EAAE,YAAY,CAAC,CAAA;KAC7D;IAED,cAAc,GAAA;QACV,IAAI,IAAI,CAAC,WAAW,EAAE;YAClB,OAAO,IAAI,CAAC,WAAW,CAAA;AAC1B,SAAA;QAED,MAAM,iBAAiB,GAAG,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAA;AACrE,QAAA,IAAI,iBAAiB,EAAE;AACnB,YAAA,OAAO,iBAAiB,CAAA;AAC3B,SAAA;AAAM,aAAA;AACH,YAAA,OAAO,EAAE,CAAA;AACZ,SAAA;KACJ;IAED,eAAe,GAAA;QACX,IAAI,IAAI,CAAC,YAAY,EAAE;YACnB,OAAO,IAAI,CAAC,YAAY,CAAA;AAC3B,SAAA;QAED,MAAM,kBAAkB,GAAG,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAA;AACvE,QAAA,IAAI,kBAAkB,EAAE;AACpB,YAAA,OAAO,kBAAkB,CAAA;AAC5B,SAAA;AAAM,aAAA;AACH,YAAA,OAAO,EAAE,CAAA;AACZ,SAAA;KACJ;IAED,KAAK,GAAA;AACD,QAAA,IAAI,CAAC,WAAW,GAAG,EAAE,CAAA;AACrB,QAAA,IAAI,CAAC,YAAY,GAAG,EAAE,CAAA;AACtB,QAAA,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAA;AAC9C,QAAA,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAA;KAClD;+GAzDQ,YAAY,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA,EAAA;AAAZ,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,YAAY,cAFT,MAAM,EAAA,CAAA,CAAA,EAAA;;4FAET,YAAY,EAAA,UAAA,EAAA,CAAA;kBAHxB,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACR,oBAAA,UAAU,EAAE,MAAM;AACrB,iBAAA,CAAA;;;MCEY,mBAAmB,CAAA;AAG5B,IAAA,WAAA,GAAA;QACI,IAAI,CAAC,MAAM,GAAG,IAAI,eAAe,CAAU,KAAK,CAAC,CAAA;KACpD;IAED,SAAS,GAAA;AACL,QAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;KAC1B;IAED,QAAQ,GAAA;AACJ,QAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;KACzB;+GAbQ,mBAAmB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA,EAAA;AAAnB,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,mBAAmB,cAFhB,MAAM,EAAA,CAAA,CAAA,EAAA;;4FAET,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAH/B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACR,oBAAA,UAAU,EAAE,MAAM;AACrB,iBAAA,CAAA;;;MCqCY,kBAAkB,CAAA;AAA/B,IAAA,WAAA,GAAA;QACI,IAAU,CAAA,UAAA,GAAY,IAAI,CAAA;AAC1B,QAAA,IAAA,CAAA,QAAQ,GAUJ;AACI,YAAA,SAAS,EAAE,EAAE;AACb,YAAA,KAAK,EAAE,EAAE;AACT,YAAA,WAAW,EAAE,EAAE;AACf,YAAA,aAAa,EAAE,EAAE;AACjB,YAAA,UAAU,EAAE,EAAE;AACd,YAAA,MAAM,EAAE,EAAE;AACV,YAAA,UAAU,EAAE,EAAE;AACd,YAAA,iBAAiB,EAAE,EAAE;AACrB,YAAA,aAAa,EAAE,EAAE;SACpB,CAAA;AACL,QAAA,IAAA,CAAA,SAAS,GAEL,EAAE,IAAI,EAAE,EAAE,EAAE,CAAA;AAChB,QAAA,IAAA,CAAA,UAAU,GAEN,EAAE,IAAI,EAAE,EAAE,EAAE,CAAA;AAEhB;;;AAGG;AACH,QAAA,IAAA,CAAA,IAAI,GAAgB;AAChB,YAAA,IAAI,EAAE,QAAQ;AACd,YAAA,eAAe,EAAE,eAAe;AAChC,YAAA,OAAO,EAAE,IAAI;AACb,YAAA,sBAAsB,EAAE,eAAe;AACvC,YAAA,mBAAmB,EAAE,YAAY;AACjC,YAAA,cAAc,EAAE,cAAc;SACjC,CAAC;KACL;AAAA;;AClFD;;;;;AAKG;MAIU,WAAW,CAAA;AAEpB;;AAEG;IACH,YAAY,CAAC,aAAqB,YAAY,EAAA;QAC1C,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;AAC3C,QAAA,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE;AAC1B,YAAA,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC/C,IAAI,IAAI,KAAK,UAAU,EAAE;AACrB,gBAAA,OAAO,kBAAkB,CAAC,KAAK,CAAC,CAAC;AACpC,aAAA;AACJ,SAAA;AACD,QAAA,OAAO,IAAI,CAAC;KACf;AAED;;AAEG;IACH,YAAY,CAAC,aAAqB,YAAY,EAAA;QAC1C,OAAO,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,KAAK,IAAI,CAAC;KACjD;AAED;;;AAGG;IACH,cAAc,CAAC,aAAqB,YAAY,EAAA;;AAE5C,QAAA,QAAQ,CAAC,MAAM,GAAG,CAAG,EAAA,UAAU,mDAAmD,CAAC;KACtF;+GA9BQ,WAAW,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA,EAAA;AAAX,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAW,cAFR,MAAM,EAAA,CAAA,CAAA,EAAA;;4FAET,WAAW,EAAA,UAAA,EAAA,CAAA;kBAHvB,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACR,oBAAA,UAAU,EAAE,MAAM;AACrB,iBAAA,CAAA;;;MCAY,oBAAoB,CAAA;AAQ7B,IAAA,WAAA,CACY,MAAoB,EACpB,YAAiC,EACjC,WAA+B,EAC/B,IAAiB,EAAA;QAHjB,IAAM,CAAA,MAAA,GAAN,MAAM,CAAc;QACpB,IAAY,CAAA,YAAA,GAAZ,YAAY,CAAqB;QACjC,IAAW,CAAA,WAAA,GAAX,WAAW,CAAoB;QAC/B,IAAI,CAAA,IAAA,GAAJ,IAAI,CAAa;AAVrB,QAAA,IAAA,CAAA,IAAI,GAAG,EAAE,CAAA;QAET,IAAW,CAAA,WAAA,GAAG,EAAE,CAAA;QAUpB,IAAI,CAAC,IAAI,GAAG,WAAW,CAAC,SAAS,CAAC,IAAI,CAAA;;QAGtC,IAAI,CAAC,UAAU,GAAG;AACd,YAAA,IAAI,EAAE,WAAW,CAAC,IAAI,EAAE,IAAI,IAAI,QAAQ;AACxC,YAAA,eAAe,EAAE,WAAW,CAAC,IAAI,EAAE,eAAe;AAClD,YAAA,OAAO,EAAE,WAAW,CAAC,IAAI,EAAE,OAAO;AAClC,YAAA,sBAAsB,EAAE,WAAW,CAAC,IAAI,EAAE,sBAAsB,IAAI,eAAe;AACnF,YAAA,mBAAmB,EAAE,WAAW,CAAC,IAAI,EAAE,mBAAmB,IAAI,YAAY;AAC1E,YAAA,cAAc,EAAE,WAAW,CAAC,IAAI,EAAE,cAAc,IAAI,cAAc;SACrE,CAAA;;AAGD,QAAA,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,eAAe,EAAE;YAClC,IAAI,CAAC,UAAU,CAAC,eAAe,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,KAAK,QAAQ;AAC/D,kBAAE,eAAe;kBACf,sBAAsB,CAAA;AAC/B,SAAA;;AAGD,QAAA,IAAI,IAAI,CAAC,UAAU,CAAC,OAAO,KAAK,SAAS,EAAE;AACvC,YAAA,IAAI,CAAC,UAAU,CAAC,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,KAAK,QAAQ,CAAA;AAC9D,SAAA;KACJ;AAGO,IAAA,MAAM,OAAO,CAAW,GAAW,EAAE,OAAY,EAAE,IAAgB,EAAA;QACvE,IAAI;YAEA,IAAG,IAAI,KAAK,IAAI,EAAE;gBACd,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAA;AACjC,gBAAA,IAAG,IAAI,EAAE;AACL,oBAAA,OAAO,CAAC,IAAI,GAAG,IAAI,CAAA;AACtB,iBAAA;AAAM,qBAAA;AACH,oBAAA,OAAO,CAAC,IAAI,GAAG,EAAE,CAAA;AACpB,iBAAA;AACJ,aAAA;YAED,MAAM,mBAAmB,GAAG,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAA;YAE5D,IAAI,QAAQ,GAAa,MAAM,KAAK,CAAC,GAAG,EAAE,OAAO,CAAC,CAAA;YAElD,IAAI,CAAC,QAAQ,CAAC,MAAM,KAAK,GAAG,KAAK,mBAAmB,EAAE;AAClD,gBAAA,QAAQ,GAAG,MAAM,IAAI,CAAC,0BAA0B,CAAC,GAAG,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAA;AAC3E,aAAA;YAED,IAAI,QAAQ,CAAC,EAAE,EAAE;gBACb,MAAM,IAAI,GAAG,OAAO,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAA;AACpC,gBAAA,QAAQ,IAAI,WAAW,CAAW,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,EAAC;AAC3E,aAAA;AAED,YAAA,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE;AACzB,gBAAA,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,CAAA;AAChC,aAAA;AAED,YAAA,OAAO,IAAI,CAAC,WAAW,CAAW,QAAQ,CAAC,CAAA;AAC9C,SAAA;AAAC,QAAA,OAAO,KAAK,EAAE;AACZ,YAAA,OAAO,IAAI,CAAC,WAAW,CAAW,KAAK,CAAC,CAAA;AAC3C,SAAA;KACJ;AAEO,IAAA,WAAW,CAAW,KAAU,EAAA;AACpC,QAAA,OAAO,CAAC,KAAK,CACT,yBAAyB,KAAK,CAAC,MAAM,CAAI,EAAA,CAAA;YACzC,CAAc,YAAA,CAAA,EAAE,KAAK,CAAC,CAAC;AAC3B,QAAA,OAAO,IAAI,WAAW,CAAW,OAAO,CAAC,CAAA;KAC5C;AAED,IAAA,MAAM,GAAG,CAAW,QAAgB,EAAE,cAAoB,EAAA;QACtD,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,gBAAgB,CAAC,cAAc,CAAC,CAAA;AAC5F,QAAA,MAAM,YAAY,GAAgB;AAC9B,YAAA,IAAI,EAAE,MAAM;AACZ,YAAA,QAAQ,EAAE,OAAO;SACpB,CAAA;QACD,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,YAAY,EAAE,IAAI,CAAC,CAAA;KAC/C;AAED,IAAA,MAAM,IAAI,CAAW,mBAA2B,EAAE,IAAS,EAAA;AACvD,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAA;AAC/D,QAAA,MAAM,YAAY,GAAgB;AAC9B,YAAA,MAAM,EAAE,MAAM;AACd,YAAA,IAAI,EAAE,MAAM;AACZ,YAAA,QAAQ,EAAE,OAAO;AACjB,YAAA,OAAO,EAAE;AACL,gBAAA,cAAc,EAAE,kBAAkB;AACrC,aAAA;AACD,YAAA,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;SAC7B,CAAA;QACD,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,YAAY,EAAE,IAAI,CAAC,CAAA;KAC/C;AAED,IAAA,MAAM,GAAG,CAAW,mBAA2B,EAAE,IAAS,EAAA;AACtD,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAA;AAC/D,QAAA,MAAM,YAAY,GAAgB;AAC9B,YAAA,MAAM,EAAE,KAAK;AACb,YAAA,IAAI,EAAE,MAAM;AACZ,YAAA,QAAQ,EAAE,OAAO;AACjB,YAAA,OAAO,EAAE;AACL,gBAAA,cAAc,EAAE,kBAAkB;AACrC,aAAA;AACD,YAAA,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;SAC7B,CAAA;QACD,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,YAAY,EAAE,IAAI,CAAC,CAAA;KAC/C;AAED,IAAA,MAAM,KAAK,CAAW,mBAA2B,EAAE,IAAS,EAAA;AACxD,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAA;AAC/D,QAAA,MAAM,YAAY,GAAgB;AAC9B,YAAA,MAAM,EAAE,OAAO;AACf,YAAA,IAAI,EAAE,MAAM;AACZ,YAAA,QAAQ,EAAE,OAAO;AACjB,YAAA,OAAO,EAAE;AACL,gBAAA,cAAc,EAAE,kBAAkB;AACrC,aAAA;AACD,YAAA,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;SAC7B,CAAA;QACD,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,YAAY,EAAE,IAAI,CAAC,CAAA;KAC/C;AAED,IAAA,MAAM,MAAM,CAAW,QAAgB,EAAE,cAAoB,EAAA;QACzD,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,gBAAgB,CAAC,cAAc,CAAC,CAAA;AAC5F,QAAA,MAAM,YAAY,GAAgB;AAC9B,YAAA,MAAM,EAAE,QAAQ;AAChB,YAAA,IAAI,EAAE,MAAM;AACZ,YAAA,QAAQ,EAAE,OAAO;SACpB,CAAA;QACD,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,YAAY,EAAE,IAAI,CAAC,CAAA;KAC/C;;;;;;;;;;;;;;;;;;;;;;;AA8BO,IAAA,kBAAkB,CAAC,OAAY,EAAA;QACnC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,CAAA;AAC/C,QAAA,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;AACnB,YAAA,OAAO,KAAK,CAAA;AACf,SAAA;AAED,QAAA,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE;AAClB,YAAA,OAAO,CAAC,OAAO,GAAG,EAAE,CAAA;AACvB,SAAA;QACD,OAAO,CAAC,OAAO,CAAC,eAAe,CAAC,GAAG,SAAS,GAAG,IAAI,CAAC,WAAW,CAAA;AAC/D,QAAA,OAAO,IAAI,CAAA;KACd;AAEO,IAAA,MAAM,0BAA0B,CAAC,GAAW,EAAE,YAAiB,EAAE,QAAkB,EAAA;AAEvF,QAAA,MAAM,eAAe,GAAG,MAAM,IAAI,CAAC,kBAAkB,EAAE,CAAA;QACvD,IAAI,CAAC,eAAe,EAAE;AAClB,YAAA,OAAO,QAAQ,CAAA;AAClB,SAAA;QAED,YAAY,CAAC,OAAO,CAAC,eAAe,CAAC,GAAG,SAAS,GAAG,IAAI,CAAC,WAAW,CAAA;QACpE,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,YAAY,CAAC,CAAA;AACzC,QAAA,OAAO,QAAQ,CAAA;KAClB;AAED,IAAA,MAAM,kBAAkB,GAAA;AACpB,QAAA,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,KAAK,MAAM,EAAE;AACjC,YAAA,OAAO,KAAK,CAAA;AACf,SAAA;AAED,QAAA,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,KAAK,QAAQ,EAAE;AACnC,YAAA,OAAO,MAAM,IAAI,CAAC,4BAA4B,EAAE,CAAA;AACnD,SAAA;AAAM,aAAA;AACH,YAAA,OAAO,MAAM,IAAI,CAAC,0BAA0B,EAAE,CAAA;AACjD,SAAA;KACJ;AAED;;AAEG;AACK,IAAA,MAAM,4BAA4B,GAAA;QACtC,IAAI;AACA,YAAA,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,eAAgB,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAA;AACxF,YAAA,MAAM,OAAO,GAAQ;AACjB,gBAAA,cAAc,EAAE,kBAAkB;aACrC,CAAA;;AAGD,YAAA,IAAI,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE;AACzB,gBAAA,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,mBAAoB,CAAC,CAAA;gBAC9E,IAAI,CAAC,SAAS,EAAE;AACZ,oBAAA,OAAO,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAA;AAC/C,oBAAA,OAAO,KAAK,CAAA;AACf,iBAAA;gBACD,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,cAAe,CAAC,GAAG,SAAS,CAAA;AACvD,aAAA;AAED,YAAA,IAAI,oBAAoB,GAAG,MAAM,KAAK,CAAC,eAAe,EAAE;AACpD,gBAAA,MAAM,EAAE,MAAM;AACd,gBAAA,IAAI,EAAE,MAAM;AACZ,gBAAA,WAAW,EAAE,SAAS;AACtB,gBAAA,QAAQ,EAAE,OAAO;AACjB,gBAAA,OAAO,EAAE,OAAO;AACnB,aAAA,CAAC,CAAA;AAEF,YAAA,IAAI,CAAC,oBAAoB,CAAC,EAAE,EAAE;AAC1B,gBAAA,IAAI,CAAC,WAAW,GAAG,EAAE,CAAA;AACrB,gBAAA,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAA;AACnB,gBAAA,OAAO,KAAK,CAAA;AACf,aAAA;AAED,YAAA,IAAI,iBAAiB,GAAG,MAAM,oBAAoB,CAAC,IAAI,EAAE,CAAA;YACzD,IAAI,CAAC,iBAAiB,IAAI,iBAAiB,CAAC,MAAM,KAAK,IAAI,EAAE;AACzD,gBAAA,OAAO,KAAK,CAAA;AACf,aAAA;;YAGD,MAAM,cAAc,GAAG,iBAAiB,CAAC,IAAI,EAAE,YAAY,IAAI,iBAAiB,CAAC,YAAY,CAAA;YAC7F,IAAI,CAAC,cAAc,EAAE;AACjB,gBAAA,OAAO,CAAC,KAAK,CAAC,qCAAqC,CAAC,CAAA;AACpD,gBAAA,OAAO,KAAK,CAAA;AACf,aAAA;;AAGD,YAAA,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,cAAc,CAAC,CAAA;AAC1C,YAAA,IAAI,CAAC,WAAW,GAAG,cAAc,CAAA;AAEjC,YAAA,OAAO,IAAI,CAAA;AACd,SAAA;AAAC,QAAA,OAAO,KAAK,EAAE;AACZ,YAAA,OAAO,CAAC,KAAK,CAAC,qCAAqC,EAAE,KAAK,CAAC,CAAA;AAC3D,YAAA,IAAI,CAAC,WAAW,GAAG,EAAE,CAAA;AACrB,YAAA,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAA;AACnB,YAAA,OAAO,KAAK,CAAA;AACf,SAAA;KACJ;AAED;;AAEG;AACK,IAAA,MAAM,0BAA0B,GAAA;QACpC,IAAI;YACA,MAAM,YAAY,GAAG,IAAI,CAAC,MAAM,CAAC,eAAe,EAAE,CAAA;YAClD,IAAI,CAAC,YAAY,EAAE;AACf,gBAAA,OAAO,KAAK,CAAA;AACf,aAAA;AAED,YAAA,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,eAAgB,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAA;AACxF,YAAA,IAAI,oBAAoB,GAAG,MAAM,KAAK,CAAC,eAAe,EAAE;AACpD,gBAAA,MAAM,EAAE,MAAM;AACd,gBAAA,IAAI,EAAE,MAAM;AACZ,gBAAA,QAAQ,EAAE,OAAO;AACjB,gBAAA,OAAO,EAAE;AACL,oBAAA,cAAc,EAAE,kBAAkB;AACrC,iBAAA;AACD,gBAAA,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;oBACjB,YAAY,EAAE,IAAI,CAAC,WAAW;AAC9B,oBAAA,aAAa,EAAE,YAAY;iBAC9B,CAAC;AACL,aAAA,CAAC,CAAA;AAEF,YAAA,IAAI,CAAC,oBAAoB,CAAC,EAAE,EAAE;AAC1B,gBAAA,IAAI,CAAC,WAAW,GAAG,EAAE,CAAA;AACrB,gBAAA,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAA;AACnB,gBAAA,OAAO,KAAK,CAAA;AACf,aAAA;AAED,YAAA,IAAI,iBAAiB,GAAG,MAAM,oBAAoB,CAAC,IAAI,EAAE,CAAA;YACzD,IAAI,CAAC,iBAAiB,EAAE;AACpB,gBAAA,OAAO,KAAK,CAAA;AACf,aAAA;YAED,MAAM,cAAc,GAAG,iBAAiB,CAAC,IAAI,EAAE,YAAY,IAAI,iBAAiB,CAAC,YAAY,CAAA;YAC7F,IAAI,CAAC,cAAc,EAAE;AACjB,gBAAA,OAAO,CAAC,KAAK,CAAC,qCAAqC,CAAC,CAAA;AACpD,gBAAA,OAAO,KAAK,CAAA;AACf,aAAA;YAED,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,cAAc,EAAE,YAAY,CAAC,CAAA;AACnD,YAAA,IAAI,CAAC,WAAW,GAAG,cAAc,CAAA;AAEjC,YAAA,OAAO,IAAI,CAAA;AACd,SAAA;AAAC,QAAA,OAAO,KAAK,EAAE;AACZ,YAAA,OAAO,CAAC,KAAK,CAAC,mCAAmC,EAAE,KAAK,CAAC,CAAA;AACzD,YAAA,IAAI,CAAC,WAAW,GAAG,EAAE,CAAA;AACrB,YAAA,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAA;AACnB,YAAA,OAAO,KAAK,CAAA;AACf,SAAA;KACJ;AAED,IAAA,gBAAgB,CAAC,OAAa,EAAA;QAC1B,IAAI,OAAO,KAAK,SAAS,EAAE;AACvB,YAAA,OAAO,EAAE,CAAA;AACZ,SAAA;QAED,MAAM,KAAK,GAAG,EAAE,CAAA;AAChB,QAAA,KAAK,IAAI,GAAG,IAAI,OAAO,EAAE;YACrB,IAAI,OAAO,CAAC,cAAc,CAAC,GAAG,CAAC,KAAK,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,KAAK,OAAO,CAAC,GAAG,CAAC,KAAK,SAAS,CAAC,EAAE;AACxF,gBAAA,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,kBAAkB,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;AAC/E,aAAA;AACJ,SAAA;QACD,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QAC3B,IAAI,GAAG,KAAK,EAAE,EAAE;YACZ,OAAO,GAAG,GAAG,GAAG,CAAA;AACnB,SAAA;AAED,QAAA,OAAO,EAAE,CAAA;KACZ;+GAjVQ,oBAAoB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAA,YAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,mBAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,kBAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,WAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA,EAAA;AAApB,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,oBAAoB,cAFjB,MAAM,EAAA,CAAA,CAAA,EAAA;;4FAET,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBAHhC,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACR,oBAAA,UAAU,EAAE,MAAM;AACrB,iBAAA,CAAA;;;MCJY,WAAW,CAAA;AAEtB,IAAA,WAAA,GAAA,GAAiB;+GAFN,WAAW,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA,EAAA;AAAX,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAW,cAFV,MAAM,EAAA,CAAA,CAAA,EAAA;;4FAEP,WAAW,EAAA,UAAA,EAAA,CAAA;kBAHvB,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA,CAAA;;;MCCY,SAAS,CAAA;AAEpB,IAAA,WAAA,GAAA,GAAiB;+GAFN,SAAS,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA,EAAA;AAAT,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,SAAS,cAFR,MAAM,EAAA,CAAA,CAAA,EAAA;;4FAEP,SAAS,EAAA,UAAA,EAAA,CAAA;kBAHrB,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA,CAAA;;;MCQY,6BAA6B,CAAA;IAC/B,OAAO,OAAO,CAAC,WAA+B,EAAA;QACjD,OAAO;AACH,YAAA,QAAQ,EAAE,6BAA6B;AACvC,YAAA,SAAS,EAAE;AACP,gBAAA,EAAE,OAAO,EAAE,kBAAkB,EAAE,QAAQ,EAAE,WAAW,EAAE;AACzD,aAAA;SACJ,CAAA;KACJ;+GARQ,6BAA6B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA,CAAA,EAAA;AAA7B,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,6BAA6B,YAHlC,YAAY,CAAA,EAAA,CAAA,CAAA,EAAA;AAGP,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,6BAA6B,YAHlC,YAAY,CAAA,EAAA,CAAA,CAAA,EAAA;;4FAGP,6BAA6B,EAAA,UAAA,EAAA,CAAA;kBANzC,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;AACN,oBAAA,YAAY,EAAE,EAAE;AAChB,oBAAA,OAAO,EAAE;wBACL,YAAY;AACf,qBAAA;AACJ,iBAAA,CAAA;;;ACXD;;AAEG;;ACFH;;AAEG;;;;"}
|
|
@@ -2,21 +2,35 @@ import { TokenService } from './token.service';
|
|
|
2
2
|
import { SigninStatusService } from './signin-status.service';
|
|
3
3
|
import { ApiResponse } from './api-response.model';
|
|
4
4
|
import { MyEnvironmentModel } from './my-environment.model';
|
|
5
|
+
import { CsrfService } from './csrf.service';
|
|
5
6
|
import * as i0 from "@angular/core";
|
|
6
7
|
export declare class ApiConnectionService {
|
|
7
8
|
private tokens;
|
|
8
9
|
private signinStatus;
|
|
9
10
|
private environment;
|
|
11
|
+
private csrf;
|
|
10
12
|
private host;
|
|
11
13
|
private accessToken;
|
|
12
|
-
|
|
14
|
+
private authConfig;
|
|
15
|
+
constructor(tokens: TokenService, signinStatus: SigninStatusService, environment: MyEnvironmentModel, csrf: CsrfService);
|
|
13
16
|
private request;
|
|
14
17
|
private handleError;
|
|
15
18
|
get<DataType>(endpoint: string, queryParamsObj?: any): Promise<ApiResponse<DataType>>;
|
|
16
19
|
post<DataType>(pathWithQueryParams: string, data: any): Promise<ApiResponse<DataType>>;
|
|
20
|
+
put<DataType>(pathWithQueryParams: string, data: any): Promise<ApiResponse<DataType>>;
|
|
21
|
+
patch<DataType>(pathWithQueryParams: string, data: any): Promise<ApiResponse<DataType>>;
|
|
22
|
+
delete<DataType>(endpoint: string, queryParamsObj?: any): Promise<ApiResponse<DataType>>;
|
|
17
23
|
private includeAccessToken;
|
|
18
24
|
private refreshAccessTokenAndRetry;
|
|
19
25
|
refreshAccessToken(): Promise<boolean>;
|
|
26
|
+
/**
|
|
27
|
+
* Refresh access token using cookie-based auth (StoneScriptPHP v2.1.x default)
|
|
28
|
+
*/
|
|
29
|
+
private refreshAccessTokenCookieMode;
|
|
30
|
+
/**
|
|
31
|
+
* Refresh access token using body-based auth (legacy mode)
|
|
32
|
+
*/
|
|
33
|
+
private refreshAccessTokenBodyMode;
|
|
20
34
|
buildQueryString(options?: any): string;
|
|
21
35
|
static ɵfac: i0.ɵɵFactoryDeclaration<ApiConnectionService, never>;
|
|
22
36
|
static ɵprov: i0.ɵɵInjectableDeclaration<ApiConnectionService>;
|
|
@@ -6,4 +6,10 @@ export declare class ApiResponse<DataType> {
|
|
|
6
6
|
onOk(callback: (data: DataType) => void): ApiResponse<DataType>;
|
|
7
7
|
onNotOk(callback: (message: string, data: DataType) => void): ApiResponse<DataType>;
|
|
8
8
|
onError(callback: () => void): ApiResponse<DataType>;
|
|
9
|
+
isSuccess(): boolean;
|
|
10
|
+
isError(): boolean;
|
|
11
|
+
getData(): DataType | null;
|
|
12
|
+
getError(): string;
|
|
13
|
+
getStatus(): string;
|
|
14
|
+
getMessage(): string;
|
|
9
15
|
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import * as i0 from "@angular/core";
|
|
2
|
+
/**
|
|
3
|
+
* CSRF Token Service
|
|
4
|
+
*
|
|
5
|
+
* Manages CSRF tokens for cookie-based authentication.
|
|
6
|
+
* Reads CSRF token from cookies and provides it for request headers.
|
|
7
|
+
*/
|
|
8
|
+
export declare class CsrfService {
|
|
9
|
+
/**
|
|
10
|
+
* Get CSRF token from cookie
|
|
11
|
+
*/
|
|
12
|
+
getCsrfToken(cookieName?: string): string | null;
|
|
13
|
+
/**
|
|
14
|
+
* Check if CSRF token exists
|
|
15
|
+
*/
|
|
16
|
+
hasCsrfToken(cookieName?: string): boolean;
|
|
17
|
+
/**
|
|
18
|
+
* Clear CSRF token (for logout)
|
|
19
|
+
* Note: Client-side deletion is limited for httpOnly cookies
|
|
20
|
+
*/
|
|
21
|
+
clearCsrfToken(cookieName?: string): void;
|
|
22
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<CsrfService, never>;
|
|
23
|
+
static ɵprov: i0.ɵɵInjectableDeclaration<CsrfService>;
|
|
24
|
+
}
|
|
@@ -1,3 +1,38 @@
|
|
|
1
|
+
export type AuthMode = 'cookie' | 'body' | 'none';
|
|
2
|
+
export interface AuthConfig {
|
|
3
|
+
/**
|
|
4
|
+
* Authentication mode:
|
|
5
|
+
* - 'cookie': Use httpOnly cookies + CSRF tokens (recommended, matches StoneScriptPHP v2.1.x)
|
|
6
|
+
* - 'body': Send tokens in request body (legacy mode)
|
|
7
|
+
* - 'none': No automatic token refresh
|
|
8
|
+
*/
|
|
9
|
+
mode: AuthMode;
|
|
10
|
+
/**
|
|
11
|
+
* Token refresh endpoint path
|
|
12
|
+
* @default '/auth/refresh' for cookie mode, '/user/refresh_access' for body mode
|
|
13
|
+
*/
|
|
14
|
+
refreshEndpoint?: string;
|
|
15
|
+
/**
|
|
16
|
+
* Enable CSRF token support (required for cookie mode)
|
|
17
|
+
* @default true for cookie mode, false for body mode
|
|
18
|
+
*/
|
|
19
|
+
useCsrf?: boolean;
|
|
20
|
+
/**
|
|
21
|
+
* Cookie name for refresh token
|
|
22
|
+
* @default 'refresh_token'
|
|
23
|
+
*/
|
|
24
|
+
refreshTokenCookieName?: string;
|
|
25
|
+
/**
|
|
26
|
+
* Cookie name for CSRF token
|
|
27
|
+
* @default 'csrf_token'
|
|
28
|
+
*/
|
|
29
|
+
csrfTokenCookieName?: string;
|
|
30
|
+
/**
|
|
31
|
+
* CSRF header name
|
|
32
|
+
* @default 'X-CSRF-Token'
|
|
33
|
+
*/
|
|
34
|
+
csrfHeaderName?: string;
|
|
35
|
+
}
|
|
1
36
|
export declare class MyEnvironmentModel {
|
|
2
37
|
production: boolean;
|
|
3
38
|
firebase: {
|
|
@@ -17,4 +52,9 @@ export declare class MyEnvironmentModel {
|
|
|
17
52
|
chatServer: {
|
|
18
53
|
host: string;
|
|
19
54
|
};
|
|
55
|
+
/**
|
|
56
|
+
* Authentication configuration
|
|
57
|
+
* @default { mode: 'cookie', refreshEndpoint: '/auth/refresh', useCsrf: true }
|
|
58
|
+
*/
|
|
59
|
+
auth?: AuthConfig;
|
|
20
60
|
}
|
package/lib/token.service.d.ts
CHANGED
|
@@ -6,6 +6,8 @@ export declare class TokenService {
|
|
|
6
6
|
private lsRefreshTokenKey;
|
|
7
7
|
constructor();
|
|
8
8
|
setTokens(accessToken: string, refreshToken: string): void;
|
|
9
|
+
setAccessToken(accessToken: string): void;
|
|
10
|
+
setRefreshToken(refreshToken: string): void;
|
|
9
11
|
getAccessToken(): string;
|
|
10
12
|
getRefreshToken(): string;
|
|
11
13
|
clear(): void;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@progalaxyelabs/ngx-stonescriptphp-client",
|
|
3
|
-
"version": "0.0
|
|
3
|
+
"version": "1.0.0",
|
|
4
4
|
"peerDependencies": {
|
|
5
5
|
"@angular/common": "^16.2.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^20.0.0",
|
|
6
6
|
"@angular/core": "^16.2.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^20.0.0"
|
package/public-api.d.ts
CHANGED
|
@@ -3,6 +3,7 @@ export * from './lib/auth.service';
|
|
|
3
3
|
export * from './lib/db.service';
|
|
4
4
|
export * from './lib/signin-status.service';
|
|
5
5
|
export * from './lib/token.service';
|
|
6
|
+
export * from './lib/csrf.service';
|
|
6
7
|
export * from './lib/api-response.model';
|
|
7
8
|
export * from './lib/my-environment.model';
|
|
8
9
|
export * from './lib/ngx-stonescriptphp-client/ngx-stonescriptphp-client.module';
|