@progalaxyelabs/ngx-stonescriptphp-client 0.0.9 → 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.
@@ -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
- const refreshToken = this.tokens.getRefreshToken();
115
- if (!refreshToken) {
170
+ if (this.authConfig.mode === 'none') {
116
171
  return false;
117
172
  }
118
- const refreshTokenUrl = this.host + 'user/refresh_access';
119
- let refreshTokenResponse = await fetch(refreshTokenUrl, {
120
- method: 'POST',
121
- mode: 'cors',
122
- redirect: 'error',
123
- headers: {
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
- body: JSON.stringify({
127
- access_token: this.accessToken,
128
- refresh_token: refreshToken
129
- })
130
- });
131
- if (!refreshTokenResponse.ok) {
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
- let refreshAccessData = await refreshTokenResponse.json();
137
- if (!refreshAccessData) {
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpLWNvbm5lY3Rpb24uc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1zdG9uZXNjcmlwdHBocC1jbGllbnQvc3JjL2xpYi9hcGktY29ubmVjdGlvbi5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHM0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHNCQUFzQixDQUFDOzs7Ozs7QUFPbkQsTUFBTSxPQUFPLG9CQUFvQjtJQVE3QixZQUNZLE1BQW9CLEVBQ3BCLFlBQWlDLEVBQ2pDLFdBQStCLEVBQy9CLElBQWlCO1FBSGpCLFdBQU0sR0FBTixNQUFNLENBQWM7UUFDcEIsaUJBQVksR0FBWixZQUFZLENBQXFCO1FBQ2pDLGdCQUFXLEdBQVgsV0FBVyxDQUFvQjtRQUMvQixTQUFJLEdBQUosSUFBSSxDQUFhO1FBVnJCLFNBQUksR0FBRyxFQUFFLENBQUEsQ0FBQywwQkFBMEI7UUFFcEMsZ0JBQVcsR0FBRyxFQUFFLENBQUE7UUFVcEIsSUFBSSxDQUFDLElBQUksR0FBRyxXQUFXLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQTtRQUV0Qyx3Q0FBd0M7UUFDeEMsSUFBSSxDQUFDLFVBQVUsR0FBRztZQUNkLElBQUksRUFBRSxXQUFXLENBQUMsSUFBSSxFQUFFLElBQUksSUFBSSxRQUFRO1lBQ3hDLGVBQWUsRUFBRSxXQUFXLENBQUMsSUFBSSxFQUFFLGVBQWU7WUFDbEQsT0FBTyxFQUFFLFdBQVcsQ0FBQyxJQUFJLEVBQUUsT0FBTztZQUNsQyxzQkFBc0IsRUFBRSxXQUFXLENBQUMsSUFBSSxFQUFFLHNCQUFzQixJQUFJLGVBQWU7WUFDbkYsbUJBQW1CLEVBQUUsV0FBVyxDQUFDLElBQUksRUFBRSxtQkFBbUIsSUFBSSxZQUFZO1lBQzFFLGNBQWMsRUFBRSxXQUFXLENBQUMsSUFBSSxFQUFFLGNBQWMsSUFBSSxjQUFjO1NBQ3JFLENBQUE7UUFFRCw4REFBOEQ7UUFDOUQsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsZUFBZSxFQUFFO1lBQ2xDLElBQUksQ0FBQyxVQUFVLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxLQUFLLFFBQVE7Z0JBQy9ELENBQUMsQ0FBQyxlQUFlO2dCQUNqQixDQUFDLENBQUMsc0JBQXNCLENBQUE7U0FDL0I7UUFFRCwwREFBMEQ7UUFDMUQsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sS0FBSyxTQUFTLEVBQUU7WUFDdkMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEtBQUssUUFBUSxDQUFBO1NBQzlEO0lBQ0wsQ0FBQztJQUdPLEtBQUssQ0FBQyxPQUFPLENBQVcsR0FBVyxFQUFFLE9BQVksRUFBRSxJQUFnQjtRQUN2RSxJQUFJO1lBRUEsSUFBRyxJQUFJLEtBQUssSUFBSSxFQUFFO2dCQUNkLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUE7Z0JBQ2pDLElBQUcsSUFBSSxFQUFFO29CQUNMLE9BQU8sQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFBO2lCQUN0QjtxQkFBTTtvQkFDSCxPQUFPLENBQUMsSUFBSSxHQUFHLEVBQUUsQ0FBQTtpQkFDcEI7YUFDSjtZQUVELE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxDQUFBO1lBRTVELElBQUksUUFBUSxHQUFhLE1BQU0sS0FBSyxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQTtZQUVsRCxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sS0FBSyxHQUFHLENBQUMsSUFBSSxtQkFBbUIsRUFBRTtnQkFDbEQsUUFBUSxHQUFHLE1BQU0sSUFBSSxDQUFDLDBCQUEwQixDQUFDLEdBQUcsRUFBRSxPQUFPLEVBQUUsUUFBUSxDQUFDLENBQUE7YUFDM0U7WUFFRCxJQUFJLFFBQVEsQ0FBQyxFQUFFLEVBQUU7Z0JBQ2IsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFBO2dCQUNwQyxPQUFPLENBQUMsSUFBSSxXQUFXLENBQVcsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFBO2FBQzNFO1lBRUQsSUFBSSxRQUFRLENBQUMsTUFBTSxLQUFLLEdBQUcsRUFBRTtnQkFDekIsSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLEVBQUUsQ0FBQTthQUNoQztZQUVELE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBVyxRQUFRLENBQUMsQ0FBQTtTQUM5QztRQUFDLE9BQU8sS0FBSyxFQUFFO1lBQ1osT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFXLEtBQUssQ0FBQyxDQUFBO1NBQzNDO0lBQ0wsQ0FBQztJQUVPLFdBQVcsQ0FBVyxLQUFVO1FBQ3BDLE9BQU8sQ0FBQyxLQUFLLENBQ1QseUJBQXlCLEtBQUssQ0FBQyxNQUFNLElBQUk7WUFDekMsY0FBYyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQzNCLE9BQU8sSUFBSSxXQUFXLENBQVcsT0FBTyxDQUFDLENBQUE7SUFDN0MsQ0FBQztJQUVELEtBQUssQ0FBQyxHQUFHLENBQVcsUUFBZ0IsRUFBRSxjQUFvQjtRQUN0RCxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsSUFBSSxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxjQUFjLENBQUMsQ0FBQTtRQUM1RixNQUFNLFlBQVksR0FBZ0I7WUFDOUIsSUFBSSxFQUFFLE1BQU07WUFDWixRQUFRLEVBQUUsT0FBTztTQUNwQixDQUFBO1FBQ0QsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxZQUFZLEVBQUUsSUFBSSxDQUFDLENBQUE7SUFDaEQsQ0FBQztJQUVELEtBQUssQ0FBQyxJQUFJLENBQVcsbUJBQTJCLEVBQUUsSUFBUztRQUN2RCxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsSUFBSSxHQUFHLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUE7UUFDL0QsTUFBTSxZQUFZLEdBQWdCO1lBQzlCLE1BQU0sRUFBRSxNQUFNO1lBQ2QsSUFBSSxFQUFFLE1BQU07WUFDWixRQUFRLEVBQUUsT0FBTztZQUNqQixPQUFPLEVBQUU7Z0JBQ0wsY0FBYyxFQUFFLGtCQUFrQjthQUNyQztZQUNELElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQztTQUM3QixDQUFBO1FBQ0QsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxZQUFZLEVBQUUsSUFBSSxDQUFDLENBQUE7SUFDaEQsQ0FBQztJQUVELEtBQUssQ0FBQyxHQUFHLENBQVcsbUJBQTJCLEVBQUUsSUFBUztRQUN0RCxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsSUFBSSxHQUFHLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUE7UUFDL0QsTUFBTSxZQUFZLEdBQWdCO1lBQzlCLE1BQU0sRUFBRSxLQUFLO1lBQ2IsSUFBSSxFQUFFLE1BQU07WUFDWixRQUFRLEVBQUUsT0FBTztZQUNqQixPQUFPLEVBQUU7Z0JBQ0wsY0FBYyxFQUFFLGtCQUFrQjthQUNyQztZQUNELElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQztTQUM3QixDQUFBO1FBQ0QsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxZQUFZLEVBQUUsSUFBSSxDQUFDLENBQUE7SUFDaEQsQ0FBQztJQUVELEtBQUssQ0FBQyxLQUFLLENBQVcsbUJBQTJCLEVBQUUsSUFBUztRQUN4RCxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsSUFBSSxHQUFHLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUE7UUFDL0QsTUFBTSxZQUFZLEdBQWdCO1lBQzlCLE1BQU0sRUFBRSxPQUFPO1lBQ2YsSUFBSSxFQUFFLE1BQU07WUFDWixRQUFRLEVBQUUsT0FBTztZQUNqQixPQUFPLEVBQUU7Z0JBQ0wsY0FBYyxFQUFFLGtCQUFrQjthQUNyQztZQUNELElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQztTQUM3QixDQUFBO1FBQ0QsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxZQUFZLEVBQUUsSUFBSSxDQUFDLENBQUE7SUFDaEQsQ0FBQztJQUVELEtBQUssQ0FBQyxNQUFNLENBQVcsUUFBZ0IsRUFBRSxjQUFvQjtRQUN6RCxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsSUFBSSxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxjQUFjLENBQUMsQ0FBQTtRQUM1RixNQUFNLFlBQVksR0FBZ0I7WUFDOUIsTUFBTSxFQUFFLFFBQVE7WUFDaEIsSUFBSSxFQUFFLE1BQU07WUFDWixRQUFRLEVBQUUsT0FBTztTQUNwQixDQUFBO1FBQ0QsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxZQUFZLEVBQUUsSUFBSSxDQUFDLENBQUE7SUFDaEQsQ0FBQztJQUVELDBHQUEwRztJQUMxRyxzRUFBc0U7SUFDdEUsWUFBWTtJQUNaLDhDQUE4QztJQUM5Qyw4QkFBOEI7SUFDOUIsNEJBQTRCO0lBQzVCLGlDQUFpQztJQUNqQyw2QkFBNkI7SUFDN0IsWUFBWTtJQUVaLDRFQUE0RTtJQUU1RSxrRUFBa0U7SUFFbEUsa0VBQWtFO0lBQ2xFLDRGQUE0RjtJQUM1RixZQUFZO0lBRVosNkJBQTZCO0lBQzdCLGdFQUFnRTtJQUNoRSxZQUFZO0lBRVosNENBQTRDO0lBQzVDLHdCQUF3QjtJQUN4Qix5Q0FBeUM7SUFDekMsUUFBUTtJQUNSLElBQUk7SUFFSSxrQkFBa0IsQ0FBQyxPQUFZO1FBQ25DLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxjQUFjLEVBQUUsQ0FBQTtRQUMvQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRTtZQUNuQixPQUFPLEtBQUssQ0FBQTtTQUNmO1FBRUQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUU7WUFDbEIsT0FBTyxDQUFDLE9BQU8sR0FBRyxFQUFFLENBQUE7U0FDdkI7UUFDRCxPQUFPLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxHQUFHLFNBQVMsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFBO1FBQy9ELE9BQU8sSUFBSSxDQUFBO0lBQ2YsQ0FBQztJQUVPLEtBQUssQ0FBQywwQkFBMEIsQ0FBQyxHQUFXLEVBQUUsWUFBaUIsRUFBRSxRQUFrQjtRQUV2RixNQUFNLGVBQWUsR0FBRyxNQUFNLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFBO1FBQ3ZELElBQUksQ0FBQyxlQUFlLEVBQUU7WUFDbEIsT0FBTyxRQUFRLENBQUE7U0FDbEI7UUFFRCxZQUFZLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxHQUFHLFNBQVMsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFBO1FBQ3BFLFFBQVEsR0FBRyxNQUFNLEtBQUssQ0FBQyxHQUFHLEVBQUUsWUFBWSxDQUFDLENBQUE7UUFDekMsT0FBTyxRQUFRLENBQUE7SUFDbkIsQ0FBQztJQUVELEtBQUssQ0FBQyxrQkFBa0I7UUFDcEIsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksS0FBSyxNQUFNLEVBQUU7WUFDakMsT0FBTyxLQUFLLENBQUE7U0FDZjtRQUVELElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEtBQUssUUFBUSxFQUFFO1lBQ25DLE9BQU8sTUFBTSxJQUFJLENBQUMsNEJBQTRCLEVBQUUsQ0FBQTtTQUNuRDthQUFNO1lBQ0gsT0FBTyxNQUFNLElBQUksQ0FBQywwQkFBMEIsRUFBRSxDQUFBO1NBQ2pEO0lBQ0wsQ0FBQztJQUVEOztPQUVHO0lBQ0ssS0FBSyxDQUFDLDRCQUE0QjtRQUN0QyxJQUFJO1lBQ0EsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLGVBQWdCLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQTtZQUN4RixNQUFNLE9BQU8sR0FBUTtnQkFDakIsY0FBYyxFQUFFLGtCQUFrQjthQUNyQyxDQUFBO1lBRUQsNEJBQTRCO1lBQzVCLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUU7Z0JBQ3pCLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsbUJBQW9CLENBQUMsQ0FBQTtnQkFDOUUsSUFBSSxDQUFDLFNBQVMsRUFBRTtvQkFDWixPQUFPLENBQUMsS0FBSyxDQUFDLGdDQUFnQyxDQUFDLENBQUE7b0JBQy9DLE9BQU8sS0FBSyxDQUFBO2lCQUNmO2dCQUNELE9BQU8sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLGNBQWUsQ0FBQyxHQUFHLFNBQVMsQ0FBQTthQUN2RDtZQUVELElBQUksb0JBQW9CLEdBQUcsTUFBTSxLQUFLLENBQUMsZUFBZSxFQUFFO2dCQUNwRCxNQUFNLEVBQUUsTUFBTTtnQkFDZCxJQUFJLEVBQUUsTUFBTTtnQkFDWixXQUFXLEVBQUUsU0FBUztnQkFDdEIsUUFBUSxFQUFFLE9BQU87Z0JBQ2pCLE9BQU8sRUFBRSxPQUFPO2FBQ25CLENBQUMsQ0FBQTtZQUVGLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxFQUFFLEVBQUU7Z0JBQzFCLElBQUksQ0FBQyxXQUFXLEdBQUcsRUFBRSxDQUFBO2dCQUNyQixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFBO2dCQUNuQixPQUFPLEtBQUssQ0FBQTthQUNmO1lBRUQsSUFBSSxpQkFBaUIsR0FBRyxNQUFNLG9CQUFvQixDQUFDLElBQUksRUFBRSxDQUFBO1lBQ3pELElBQUksQ0FBQyxpQkFBaUIsSUFBSSxpQkFBaUIsQ0FBQyxNQUFNLEtBQUssSUFBSSxFQUFFO2dCQUN6RCxPQUFPLEtBQUssQ0FBQTthQUNmO1lBRUQscUNBQXFDO1lBQ3JDLE1BQU0sY0FBYyxHQUFHLGlCQUFpQixDQUFDLElBQUksRUFBRSxZQUFZLElBQUksaUJBQWlCLENBQUMsWUFBWSxDQUFBO1lBQzdGLElBQUksQ0FBQyxjQUFjLEVBQUU7Z0JBQ2pCLE9BQU8sQ0FBQyxLQUFLLENBQUMscUNBQXFDLENBQUMsQ0FBQTtnQkFDcEQsT0FBTyxLQUFLLENBQUE7YUFDZjtZQUVELCtEQUErRDtZQUMvRCxJQUFJLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxjQUFjLENBQUMsQ0FBQTtZQUMxQyxJQUFJLENBQUMsV0FBVyxHQUFHLGNBQWMsQ0FBQTtZQUVqQyxPQUFPLElBQUksQ0FBQTtTQUNkO1FBQUMsT0FBTyxLQUFLLEVBQUU7WUFDWixPQUFPLENBQUMsS0FBSyxDQUFDLHFDQUFxQyxFQUFFLEtBQUssQ0FBQyxDQUFBO1lBQzNELElBQUksQ0FBQyxXQUFXLEdBQUcsRUFBRSxDQUFBO1lBQ3JCLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUE7WUFDbkIsT0FBTyxLQUFLLENBQUE7U0FDZjtJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNLLEtBQUssQ0FBQywwQkFBMEI7UUFDcEMsSUFBSTtZQUNBLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsZUFBZSxFQUFFLENBQUE7WUFDbEQsSUFBSSxDQUFDLFlBQVksRUFBRTtnQkFDZixPQUFPLEtBQUssQ0FBQTthQUNmO1lBRUQsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLGVBQWdCLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQTtZQUN4RixJQUFJLG9CQUFvQixHQUFHLE1BQU0sS0FBSyxDQUFDLGVBQWUsRUFBRTtnQkFDcEQsTUFBTSxFQUFFLE1BQU07Z0JBQ2QsSUFBSSxFQUFFLE1BQU07Z0JBQ1osUUFBUSxFQUFFLE9BQU87Z0JBQ2pCLE9BQU8sRUFBRTtvQkFDTCxjQUFjLEVBQUUsa0JBQWtCO2lCQUNyQztnQkFDRCxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQztvQkFDakIsWUFBWSxFQUFFLElBQUksQ0FBQyxXQUFXO29CQUM5QixhQUFhLEVBQUUsWUFBWTtpQkFDOUIsQ0FBQzthQUNMLENBQUMsQ0FBQTtZQUVGLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxFQUFFLEVBQUU7Z0JBQzFCLElBQUksQ0FBQyxXQUFXLEdBQUcsRUFBRSxDQUFBO2dCQUNyQixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFBO2dCQUNuQixPQUFPLEtBQUssQ0FBQTthQUNmO1lBRUQsSUFBSSxpQkFBaUIsR0FBRyxNQUFNLG9CQUFvQixDQUFDLElBQUksRUFBRSxDQUFBO1lBQ3pELElBQUksQ0FBQyxpQkFBaUIsRUFBRTtnQkFDcEIsT0FBTyxLQUFLLENBQUE7YUFDZjtZQUVELE1BQU0sY0FBYyxHQUFHLGlCQUFpQixDQUFDLElBQUksRUFBRSxZQUFZLElBQUksaUJBQWlCLENBQUMsWUFBWSxDQUFBO1lBQzdGLElBQUksQ0FBQyxjQUFjLEVBQUU7Z0JBQ2pCLE9BQU8sQ0FBQyxLQUFLLENBQUMscUNBQXFDLENBQUMsQ0FBQTtnQkFDcEQsT0FBTyxLQUFLLENBQUE7YUFDZjtZQUVELElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLGNBQWMsRUFBRSxZQUFZLENBQUMsQ0FBQTtZQUNuRCxJQUFJLENBQUMsV0FBVyxHQUFHLGNBQWMsQ0FBQTtZQUVqQyxPQUFPLElBQUksQ0FBQTtTQUNkO1FBQUMsT0FBTyxLQUFLLEVBQUU7WUFDWixPQUFPLENBQUMsS0FBSyxDQUFDLG1DQUFtQyxFQUFFLEtBQUssQ0FBQyxDQUFBO1lBQ3pELElBQUksQ0FBQyxXQUFXLEdBQUcsRUFBRSxDQUFBO1lBQ3JCLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUE7WUFDbkIsT0FBTyxLQUFLLENBQUE7U0FDZjtJQUNMLENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxPQUFhO1FBQzFCLElBQUksT0FBTyxLQUFLLFNBQVMsRUFBRTtZQUN2QixPQUFPLEVBQUUsQ0FBQTtTQUNaO1FBRUQsTUFBTSxLQUFLLEdBQUcsRUFBRSxDQUFBO1FBQ2hCLEtBQUssSUFBSSxHQUFHLElBQUksT0FBTyxFQUFFO1lBQ3JCLElBQUksT0FBTyxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxTQUFTLENBQUMsRUFBRTtnQkFDeEYsS0FBSyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsa0JBQWtCLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQTthQUMvRTtTQUNKO1FBQ0QsTUFBTSxHQUFHLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQTtRQUMzQixJQUFJLEdBQUcsS0FBSyxFQUFFLEVBQUU7WUFDWixPQUFPLEdBQUcsR0FBRyxHQUFHLENBQUE7U0FDbkI7UUFFRCxPQUFPLEVBQUUsQ0FBQTtJQUNiLENBQUM7K0dBalZRLG9CQUFvQjttSEFBcEIsb0JBQW9CLGNBRmpCLE1BQU07OzRGQUVULG9CQUFvQjtrQkFIaEMsVUFBVTttQkFBQztvQkFDUixVQUFVLEVBQUUsTUFBTTtpQkFDckIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBUb2tlblNlcnZpY2UgfSBmcm9tICcuL3Rva2VuLnNlcnZpY2UnO1xuaW1wb3J0IHsgU2lnbmluU3RhdHVzU2VydmljZSB9IGZyb20gJy4vc2lnbmluLXN0YXR1cy5zZXJ2aWNlJztcbmltcG9ydCB7IEFwaVJlc3BvbnNlIH0gZnJvbSAnLi9hcGktcmVzcG9uc2UubW9kZWwnO1xuaW1wb3J0IHsgTXlFbnZpcm9ubWVudE1vZGVsLCBBdXRoQ29uZmlnIH0gZnJvbSAnLi9teS1lbnZpcm9ubWVudC5tb2RlbCc7XG5pbXBvcnQgeyBDc3JmU2VydmljZSB9IGZyb20gJy4vY3NyZi5zZXJ2aWNlJztcblxuQEluamVjdGFibGUoe1xuICAgIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBBcGlDb25uZWN0aW9uU2VydmljZSB7XG5cbiAgICBwcml2YXRlIGhvc3QgPSAnJyAvLyBjb250YWlucyB0cmFpbGluZyBzbGFzaFxuXG4gICAgcHJpdmF0ZSBhY2Nlc3NUb2tlbiA9ICcnXG5cbiAgICBwcml2YXRlIGF1dGhDb25maWc6IEF1dGhDb25maWdcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIHRva2VuczogVG9rZW5TZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIHNpZ25pblN0YXR1czogU2lnbmluU3RhdHVzU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBlbnZpcm9ubWVudDogTXlFbnZpcm9ubWVudE1vZGVsLFxuICAgICAgICBwcml2YXRlIGNzcmY6IENzcmZTZXJ2aWNlXG4gICAgKSB7XG4gICAgICAgIHRoaXMuaG9zdCA9IGVudmlyb25tZW50LmFwaVNlcnZlci5ob3N0XG5cbiAgICAgICAgLy8gU2V0IGRlZmF1bHQgYXV0aCBjb25maWcgYmFzZWQgb24gbW9kZVxuICAgICAgICB0aGlzLmF1dGhDb25maWcgPSB7XG4gICAgICAgICAgICBtb2RlOiBlbnZpcm9ubWVudC5hdXRoPy5tb2RlIHx8ICdjb29raWUnLFxuICAgICAgICAgICAgcmVmcmVzaEVuZHBvaW50OiBlbnZpcm9ubWVudC5hdXRoPy5yZWZyZXNoRW5kcG9pbnQsXG4gICAgICAgICAgICB1c2VDc3JmOiBlbnZpcm9ubWVudC5hdXRoPy51c2VDc3JmLFxuICAgICAgICAgICAgcmVmcmVzaFRva2VuQ29va2llTmFtZTogZW52aXJvbm1lbnQuYXV0aD8ucmVmcmVzaFRva2VuQ29va2llTmFtZSB8fCAncmVmcmVzaF90b2tlbicsXG4gICAgICAgICAgICBjc3JmVG9rZW5Db29raWVOYW1lOiBlbnZpcm9ubWVudC5hdXRoPy5jc3JmVG9rZW5Db29raWVOYW1lIHx8ICdjc3JmX3Rva2VuJyxcbiAgICAgICAgICAgIGNzcmZIZWFkZXJOYW1lOiBlbnZpcm9ubWVudC5hdXRoPy5jc3JmSGVhZGVyTmFtZSB8fCAnWC1DU1JGLVRva2VuJ1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2V0IGRlZmF1bHQgcmVmcmVzaCBlbmRwb2ludCBiYXNlZCBvbiBtb2RlIGlmIG5vdCBzcGVjaWZpZWRcbiAgICAgICAgaWYgKCF0aGlzLmF1dGhDb25maWcucmVmcmVzaEVuZHBvaW50KSB7XG4gICAgICAgICAgICB0aGlzLmF1dGhDb25maWcucmVmcmVzaEVuZHBvaW50ID0gdGhpcy5hdXRoQ29uZmlnLm1vZGUgPT09ICdjb29raWUnXG4gICAgICAgICAgICAgICAgPyAnL2F1dGgvcmVmcmVzaCdcbiAgICAgICAgICAgICAgICA6ICcvdXNlci9yZWZyZXNoX2FjY2VzcydcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNldCBkZWZhdWx0IENTUkYgc2V0dGluZyBiYXNlZCBvbiBtb2RlIGlmIG5vdCBzcGVjaWZpZWRcbiAgICAgICAgaWYgKHRoaXMuYXV0aENvbmZpZy51c2VDc3JmID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuYXV0aENvbmZpZy51c2VDc3JmID0gdGhpcy5hdXRoQ29uZmlnLm1vZGUgPT09ICdjb29raWUnXG4gICAgICAgIH1cbiAgICB9XG5cblxuICAgIHByaXZhdGUgYXN5bmMgcmVxdWVzdDxEYXRhVHlwZT4odXJsOiBzdHJpbmcsIG9wdGlvbnM6IGFueSwgZGF0YTogYW55IHwgbnVsbCk6IFByb21pc2U8QXBpUmVzcG9uc2U8RGF0YVR5cGU+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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpLXJlc3BvbnNlLm1vZGVsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXN0b25lc2NyaXB0cGhwLWNsaWVudC9zcmMvbGliL2FwaS1yZXNwb25zZS5tb2RlbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLE9BQU8sV0FBVztJQUtwQixZQUFZLE1BQWMsRUFBRSxPQUFZLEVBQUUsRUFBRSxVQUFrQixFQUFFO1FBQzVELElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFBO1FBQ3BCLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFBO1FBQ2hCLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFBO0lBQzFCLENBQUM7SUFFRCxJQUFJLENBQUMsUUFBa0M7UUFDbkMsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLElBQUksRUFBRTtZQUN0QixRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFBO1NBQ3RCO1FBQ0QsT0FBTyxJQUFJLENBQUE7SUFDZixDQUFDO0lBRUQsT0FBTyxDQUFDLFFBQW1EO1FBQ3ZELElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxRQUFRLEVBQUU7WUFDMUIsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFBO1NBQ3BDO1FBQ0QsT0FBTyxJQUFJLENBQUE7SUFDZixDQUFDO0lBRUQsT0FBTyxDQUFDLFFBQW9CO1FBQ3hCLElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxPQUFPLEVBQUU7WUFDekIsUUFBUSxFQUFFLENBQUE7U0FDYjtRQUNELE9BQU8sSUFBSSxDQUFBO0lBQ2YsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGNsYXNzIEFwaVJlc3BvbnNlPERhdGFUeXBlPiB7XG4gICAgcHJpdmF0ZSBzdGF0dXM6IHN0cmluZ1xuICAgIHByaXZhdGUgZGF0YTogYW55XG4gICAgcHJpdmF0ZSBtZXNzYWdlOiBzdHJpbmdcblxuICAgIGNvbnN0cnVjdG9yKHN0YXR1czogc3RyaW5nLCBkYXRhOiBhbnkgPSB7fSwgbWVzc2FnZTogc3RyaW5nID0gJycpIHtcbiAgICAgICAgdGhpcy5zdGF0dXMgPSBzdGF0dXNcbiAgICAgICAgdGhpcy5kYXRhID0gZGF0YVxuICAgICAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlXG4gICAgfVxuXG4gICAgb25PayhjYWxsYmFjazogKGRhdGE6IERhdGFUeXBlKSA9PiB2b2lkKTogQXBpUmVzcG9uc2U8RGF0YVR5cGU+IHtcbiAgICAgICAgaWYgKHRoaXMuc3RhdHVzID09PSAnb2snKSB7XG4gICAgICAgICAgICBjYWxsYmFjayh0aGlzLmRhdGEpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICBvbk5vdE9rKGNhbGxiYWNrOiAobWVzc2FnZTogc3RyaW5nLCBkYXRhOiBEYXRhVHlwZSkgPT4gdm9pZCk6IEFwaVJlc3BvbnNlPERhdGFUeXBlPiB7XG4gICAgICAgIGlmICh0aGlzLnN0YXR1cyA9PT0gJ25vdCBvaycpIHtcbiAgICAgICAgICAgIGNhbGxiYWNrKHRoaXMubWVzc2FnZSwgdGhpcy5kYXRhKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuXG4gICAgb25FcnJvcihjYWxsYmFjazogKCkgPT4gdm9pZCk6IEFwaVJlc3BvbnNlPERhdGFUeXBlPiB7XG4gICAgICAgIGlmICh0aGlzLnN0YXR1cyA9PT0gJ2Vycm9yJykge1xuICAgICAgICAgICAgY2FsbGJhY2soKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzXG4gICAgfVxufSJdfQ==
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXktZW52aXJvbm1lbnQubW9kZWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtc3RvbmVzY3JpcHRwaHAtY2xpZW50L3NyYy9saWIvbXktZW52aXJvbm1lbnQubW9kZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTSxPQUFPLGtCQUFrQjtJQUEvQjtRQUNJLGVBQVUsR0FBWSxJQUFJLENBQUE7UUFDMUIsYUFBUSxHQVVKO1lBQ0ksU0FBUyxFQUFFLEVBQUU7WUFDYixLQUFLLEVBQUUsRUFBRTtZQUNULFdBQVcsRUFBRSxFQUFFO1lBQ2YsYUFBYSxFQUFFLEVBQUU7WUFDakIsVUFBVSxFQUFFLEVBQUU7WUFDZCxNQUFNLEVBQUUsRUFBRTtZQUNWLFVBQVUsRUFBRSxFQUFFO1lBQ2QsaUJBQWlCLEVBQUUsRUFBRTtZQUNyQixhQUFhLEVBQUUsRUFBRTtTQUNwQixDQUFBO1FBQ0wsY0FBUyxHQUVMLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxDQUFBO1FBQ2hCLGVBQVUsR0FFTixFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsQ0FBQztJQUNyQixDQUFDO0NBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgY2xhc3MgTXlFbnZpcm9ubWVudE1vZGVsIHtcbiAgICBwcm9kdWN0aW9uOiBib29sZWFuID0gdHJ1ZVxuICAgIGZpcmViYXNlOiB7XG4gICAgICAgIHByb2plY3RJZDogc3RyaW5nXG4gICAgICAgIGFwcElkOiBzdHJpbmdcbiAgICAgICAgZGF0YWJhc2VVUkw6IHN0cmluZ1xuICAgICAgICBzdG9yYWdlQnVja2V0OiBzdHJpbmdcbiAgICAgICAgbG9jYXRpb25JZDogc3RyaW5nXG4gICAgICAgIGFwaUtleTogc3RyaW5nXG4gICAgICAgIGF1dGhEb21haW46IHN0cmluZ1xuICAgICAgICBtZXNzYWdpbmdTZW5kZXJJZDogc3RyaW5nXG4gICAgICAgIG1lYXN1cmVtZW50SWQ6IHN0cmluZ1xuICAgIH0gPSB7XG4gICAgICAgICAgICBwcm9qZWN0SWQ6ICcnLFxuICAgICAgICAgICAgYXBwSWQ6ICcnLFxuICAgICAgICAgICAgZGF0YWJhc2VVUkw6ICcnLFxuICAgICAgICAgICAgc3RvcmFnZUJ1Y2tldDogJycsXG4gICAgICAgICAgICBsb2NhdGlvbklkOiAnJyxcbiAgICAgICAgICAgIGFwaUtleTogJycsXG4gICAgICAgICAgICBhdXRoRG9tYWluOiAnJyxcbiAgICAgICAgICAgIG1lc3NhZ2luZ1NlbmRlcklkOiAnJyxcbiAgICAgICAgICAgIG1lYXN1cmVtZW50SWQ6ICcnXG4gICAgICAgIH1cbiAgICBhcGlTZXJ2ZXI6IHtcbiAgICAgICAgaG9zdDogc3RyaW5nXG4gICAgfSA9IHsgaG9zdDogJycgfVxuICAgIGNoYXRTZXJ2ZXI6IHtcbiAgICAgICAgaG9zdDogc3RyaW5nXG4gICAgfSA9IHsgaG9zdDogJycgfTtcbn0iXX0=
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9rZW4uc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1zdG9uZXNjcmlwdHBocC1jbGllbnQvc3JjL2xpYi90b2tlbi5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7O0FBSzNDLE1BQU0sT0FBTyxZQUFZO0lBT3JCO1FBTlEsZ0JBQVcsR0FBRyxFQUFFLENBQUE7UUFDaEIsaUJBQVksR0FBRyxFQUFFLENBQUE7UUFFakIscUJBQWdCLEdBQUcsMkJBQTJCLENBQUE7UUFDOUMsc0JBQWlCLEdBQUcsNEJBQTRCLENBQUE7SUFFeEMsQ0FBQztJQUVqQixTQUFTLENBQUMsV0FBbUIsRUFBRSxZQUFvQjtRQUMvQyxJQUFJLENBQUMsV0FBVyxHQUFHLFdBQVcsQ0FBQTtRQUM5QixJQUFJLENBQUMsWUFBWSxHQUFHLFlBQVksQ0FBQTtRQUNoQyxZQUFZLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxXQUFXLENBQUMsQ0FBQTtRQUN4RCxZQUFZLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxZQUFZLENBQUMsQ0FBQTtJQUM5RCxDQUFDO0lBRUQsY0FBYztRQUNWLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRTtZQUNsQixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUE7U0FDMUI7UUFFRCxNQUFNLGlCQUFpQixHQUFHLFlBQVksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUE7UUFDckUsSUFBSSxpQkFBaUIsRUFBRTtZQUNuQixPQUFPLGlCQUFpQixDQUFBO1NBQzNCO2FBQU07WUFDSCxPQUFPLEVBQUUsQ0FBQTtTQUNaO0lBQ0wsQ0FBQztJQUVELGVBQWU7UUFDWCxJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUU7WUFDbkIsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFBO1NBQzNCO1FBRUQsTUFBTSxrQkFBa0IsR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFBO1FBQ3ZFLElBQUksa0JBQWtCLEVBQUU7WUFDcEIsT0FBTyxrQkFBa0IsQ0FBQTtTQUM1QjthQUFNO1lBQ0gsT0FBTyxFQUFFLENBQUE7U0FDWjtJQUNMLENBQUM7SUFFRCxLQUFLO1FBQ0QsSUFBSSxDQUFDLFdBQVcsR0FBRyxFQUFFLENBQUE7UUFDckIsSUFBSSxDQUFDLFlBQVksR0FBRyxFQUFFLENBQUE7UUFDdEIsWUFBWSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQTtRQUM5QyxZQUFZLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFBO0lBQ25ELENBQUM7K0dBL0NRLFlBQVk7bUhBQVosWUFBWSxjQUZULE1BQU07OzRGQUVULFlBQVk7a0JBSHhCLFVBQVU7bUJBQUM7b0JBQ1IsVUFBVSxFQUFFLE1BQU07aUJBQ3JCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5ASW5qZWN0YWJsZSh7XG4gICAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIFRva2VuU2VydmljZSB7XG4gICAgcHJpdmF0ZSBhY2Nlc3NUb2tlbiA9ICcnXG4gICAgcHJpdmF0ZSByZWZyZXNoVG9rZW4gPSAnJ1xuXG4gICAgcHJpdmF0ZSBsc0FjY2Vzc1Rva2VuS2V5ID0gJ3Byb2dhbGF4eWFwaV9hY2Nlc3NfdG9rZW4nXG4gICAgcHJpdmF0ZSBsc1JlZnJlc2hUb2tlbktleSA9ICdwcm9nYWxheHlhcGlfcmVmcmVzaF90b2tlbidcblxuICAgIGNvbnN0cnVjdG9yKCkgeyB9XG5cbiAgICBzZXRUb2tlbnMoYWNjZXNzVG9rZW46IHN0cmluZywgcmVmcmVzaFRva2VuOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5hY2Nlc3NUb2tlbiA9IGFjY2Vzc1Rva2VuXG4gICAgICAgIHRoaXMucmVmcmVzaFRva2VuID0gcmVmcmVzaFRva2VuXG4gICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKHRoaXMubHNBY2Nlc3NUb2tlbktleSwgYWNjZXNzVG9rZW4pXG4gICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKHRoaXMubHNSZWZyZXNoVG9rZW5LZXksIHJlZnJlc2hUb2tlbilcbiAgICB9XG5cbiAgICBnZXRBY2Nlc3NUb2tlbigpIHtcbiAgICAgICAgaWYgKHRoaXMuYWNjZXNzVG9rZW4pIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmFjY2Vzc1Rva2VuXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzdG9yZWRBY2Nlc3NUb2tlbiA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKHRoaXMubHNBY2Nlc3NUb2tlbktleSlcbiAgICAgICAgaWYgKHN0b3JlZEFjY2Vzc1Rva2VuKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RvcmVkQWNjZXNzVG9rZW5cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiAnJ1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0UmVmcmVzaFRva2VuKCkge1xuICAgICAgICBpZiAodGhpcy5yZWZyZXNoVG9rZW4pIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnJlZnJlc2hUb2tlblxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc3RvcmVkUmVmcmVzaFRva2VuID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0odGhpcy5sc1JlZnJlc2hUb2tlbktleSlcbiAgICAgICAgaWYgKHN0b3JlZFJlZnJlc2hUb2tlbikge1xuICAgICAgICAgICAgcmV0dXJuIHN0b3JlZFJlZnJlc2hUb2tlblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuICcnXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjbGVhcigpIHtcbiAgICAgICAgdGhpcy5hY2Nlc3NUb2tlbiA9ICcnXG4gICAgICAgIHRoaXMucmVmcmVzaFRva2VuID0gJydcbiAgICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0odGhpcy5sc0FjY2Vzc1Rva2VuS2V5KVxuICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSh0aGlzLmxzUmVmcmVzaFRva2VuS2V5KVxuICAgIH1cbn1cbiJdfQ==
63
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9rZW4uc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1zdG9uZXNjcmlwdHBocC1jbGllbnQvc3JjL2xpYi90b2tlbi5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7O0FBSzNDLE1BQU0sT0FBTyxZQUFZO0lBT3JCO1FBTlEsZ0JBQVcsR0FBRyxFQUFFLENBQUE7UUFDaEIsaUJBQVksR0FBRyxFQUFFLENBQUE7UUFFakIscUJBQWdCLEdBQUcsMkJBQTJCLENBQUE7UUFDOUMsc0JBQWlCLEdBQUcsNEJBQTRCLENBQUE7SUFFeEMsQ0FBQztJQUVqQixTQUFTLENBQUMsV0FBbUIsRUFBRSxZQUFvQjtRQUMvQyxJQUFJLENBQUMsV0FBVyxHQUFHLFdBQVcsQ0FBQTtRQUM5QixJQUFJLENBQUMsWUFBWSxHQUFHLFlBQVksQ0FBQTtRQUNoQyxZQUFZLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxXQUFXLENBQUMsQ0FBQTtRQUN4RCxZQUFZLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxZQUFZLENBQUMsQ0FBQTtJQUM5RCxDQUFDO0lBRUQsY0FBYyxDQUFDLFdBQW1CO1FBQzlCLElBQUksQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFBO1FBQzlCLFlBQVksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLFdBQVcsQ0FBQyxDQUFBO0lBQzVELENBQUM7SUFFRCxlQUFlLENBQUMsWUFBb0I7UUFDaEMsSUFBSSxDQUFDLFlBQVksR0FBRyxZQUFZLENBQUE7UUFDaEMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsWUFBWSxDQUFDLENBQUE7SUFDOUQsQ0FBQztJQUVELGNBQWM7UUFDVixJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDbEIsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFBO1NBQzFCO1FBRUQsTUFBTSxpQkFBaUIsR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFBO1FBQ3JFLElBQUksaUJBQWlCLEVBQUU7WUFDbkIsT0FBTyxpQkFBaUIsQ0FBQTtTQUMzQjthQUFNO1lBQ0gsT0FBTyxFQUFFLENBQUE7U0FDWjtJQUNMLENBQUM7SUFFRCxlQUFlO1FBQ1gsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQ25CLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQTtTQUMzQjtRQUVELE1BQU0sa0JBQWtCLEdBQUcsWUFBWSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQTtRQUN2RSxJQUFJLGtCQUFrQixFQUFFO1lBQ3BCLE9BQU8sa0JBQWtCLENBQUE7U0FDNUI7YUFBTTtZQUNILE9BQU8sRUFBRSxDQUFBO1NBQ1o7SUFDTCxDQUFDO0lBRUQsS0FBSztRQUNELElBQUksQ0FBQyxXQUFXLEdBQUcsRUFBRSxDQUFBO1FBQ3JCLElBQUksQ0FBQyxZQUFZLEdBQUcsRUFBRSxDQUFBO1FBQ3RCLFlBQVksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUE7UUFDOUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQTtJQUNuRCxDQUFDOytHQXpEUSxZQUFZO21IQUFaLFlBQVksY0FGVCxNQUFNOzs0RkFFVCxZQUFZO2tCQUh4QixVQUFVO21CQUFDO29CQUNSLFVBQVUsRUFBRSxNQUFNO2lCQUNyQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuQEluamVjdGFibGUoe1xuICAgIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBUb2tlblNlcnZpY2Uge1xuICAgIHByaXZhdGUgYWNjZXNzVG9rZW4gPSAnJ1xuICAgIHByaXZhdGUgcmVmcmVzaFRva2VuID0gJydcblxuICAgIHByaXZhdGUgbHNBY2Nlc3NUb2tlbktleSA9ICdwcm9nYWxheHlhcGlfYWNjZXNzX3Rva2VuJ1xuICAgIHByaXZhdGUgbHNSZWZyZXNoVG9rZW5LZXkgPSAncHJvZ2FsYXh5YXBpX3JlZnJlc2hfdG9rZW4nXG5cbiAgICBjb25zdHJ1Y3RvcigpIHsgfVxuXG4gICAgc2V0VG9rZW5zKGFjY2Vzc1Rva2VuOiBzdHJpbmcsIHJlZnJlc2hUb2tlbjogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuYWNjZXNzVG9rZW4gPSBhY2Nlc3NUb2tlblxuICAgICAgICB0aGlzLnJlZnJlc2hUb2tlbiA9IHJlZnJlc2hUb2tlblxuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSh0aGlzLmxzQWNjZXNzVG9rZW5LZXksIGFjY2Vzc1Rva2VuKVxuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSh0aGlzLmxzUmVmcmVzaFRva2VuS2V5LCByZWZyZXNoVG9rZW4pXG4gICAgfVxuXG4gICAgc2V0QWNjZXNzVG9rZW4oYWNjZXNzVG9rZW46IHN0cmluZykge1xuICAgICAgICB0aGlzLmFjY2Vzc1Rva2VuID0gYWNjZXNzVG9rZW5cbiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0odGhpcy5sc0FjY2Vzc1Rva2VuS2V5LCBhY2Nlc3NUb2tlbilcbiAgICB9XG5cbiAgICBzZXRSZWZyZXNoVG9rZW4ocmVmcmVzaFRva2VuOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5yZWZyZXNoVG9rZW4gPSByZWZyZXNoVG9rZW5cbiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0odGhpcy5sc1JlZnJlc2hUb2tlbktleSwgcmVmcmVzaFRva2VuKVxuICAgIH1cblxuICAgIGdldEFjY2Vzc1Rva2VuKCkge1xuICAgICAgICBpZiAodGhpcy5hY2Nlc3NUb2tlbikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYWNjZXNzVG9rZW5cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHN0b3JlZEFjY2Vzc1Rva2VuID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0odGhpcy5sc0FjY2Vzc1Rva2VuS2V5KVxuICAgICAgICBpZiAoc3RvcmVkQWNjZXNzVG9rZW4pIHtcbiAgICAgICAgICAgIHJldHVybiBzdG9yZWRBY2Nlc3NUb2tlblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuICcnXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXRSZWZyZXNoVG9rZW4oKSB7XG4gICAgICAgIGlmICh0aGlzLnJlZnJlc2hUb2tlbikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVmcmVzaFRva2VuXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzdG9yZWRSZWZyZXNoVG9rZW4gPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSh0aGlzLmxzUmVmcmVzaFRva2VuS2V5KVxuICAgICAgICBpZiAoc3RvcmVkUmVmcmVzaFRva2VuKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RvcmVkUmVmcmVzaFRva2VuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gJydcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNsZWFyKCkge1xuICAgICAgICB0aGlzLmFjY2Vzc1Rva2VuID0gJydcbiAgICAgICAgdGhpcy5yZWZyZXNoVG9rZW4gPSAnJ1xuICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSh0aGlzLmxzQWNjZXNzVG9rZW5LZXkpXG4gICAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKHRoaXMubHNSZWZyZXNoVG9rZW5LZXkpXG4gICAgfVxufVxuIl19
@@ -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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Byb2plY3RzL25neC1zdG9uZXNjcmlwdHBocC1jbGllbnQvc3JjL3B1YmxpYy1hcGkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLDhCQUE4QixDQUFDO0FBQzdDLGNBQWMsb0JBQW9CLENBQUM7QUFDbkMsY0FBYyxrQkFBa0IsQ0FBQztBQUNqQyxjQUFjLDZCQUE2QixDQUFDO0FBQzVDLGNBQWMscUJBQXFCLENBQUM7QUFDcEMsY0FBYywwQkFBMEIsQ0FBQztBQUN6QyxjQUFjLDRCQUE0QixDQUFDO0FBQzNDLGNBQWMsa0VBQWtFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogUHVibGljIEFQSSBTdXJmYWNlIG9mIG5neC1zdG9uZXNjcmlwdHBocC1jbGllbnRcbiAqL1xuXG5leHBvcnQgKiBmcm9tICcuL2xpYi9hcGktY29ubmVjdGlvbi5zZXJ2aWNlJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL2F1dGguc2VydmljZSc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9kYi5zZXJ2aWNlJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL3NpZ25pbi1zdGF0dXMuc2VydmljZSc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi90b2tlbi5zZXJ2aWNlJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL2FwaS1yZXNwb25zZS5tb2RlbCc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9teS1lbnZpcm9ubWVudC5tb2RlbCc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9uZ3gtc3RvbmVzY3JpcHRwaHAtY2xpZW50L25neC1zdG9uZXNjcmlwdHBocC1jbGllbnQubW9kdWxlJztcbiJdfQ==
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
- const refreshToken = this.tokens.getRefreshToken();
232
- if (!refreshToken) {
368
+ if (this.authConfig.mode === 'none') {
233
369
  return false;
234
370
  }
235
- const refreshTokenUrl = this.host + 'user/refresh_access';
236
- let refreshTokenResponse = await fetch(refreshTokenUrl, {
237
- method: 'POST',
238
- mode: 'cors',
239
- redirect: 'error',
240
- headers: {
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
- body: JSON.stringify({
244
- access_token: this.accessToken,
245
- refresh_token: refreshToken
246
- })
247
- });
248
- if (!refreshTokenResponse.ok) {
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
- let refreshAccessData = await refreshTokenResponse.json();
254
- if (!refreshAccessData) {
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":"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"}
@@ -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
- constructor(tokens: TokenService, signinStatus: SigninStatusService, environment: MyEnvironmentModel);
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
  }
@@ -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,9 +1,9 @@
1
1
  {
2
2
  "name": "@progalaxyelabs/ngx-stonescriptphp-client",
3
- "version": "0.0.9",
3
+ "version": "1.0.0",
4
4
  "peerDependencies": {
5
- "@angular/common": "^16.2.0",
6
- "@angular/core": "^16.2.0"
5
+ "@angular/common": "^16.2.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^20.0.0",
6
+ "@angular/core": "^16.2.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^20.0.0"
7
7
  },
8
8
  "dependencies": {
9
9
  "tslib": "^2.3.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';