valtech-components 4.0.170 → 4.0.171

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.
@@ -1,11 +1,18 @@
1
1
  import { inject } from '@angular/core';
2
2
  import { throwError, BehaviorSubject } from 'rxjs';
3
- import { catchError, filter, take, switchMap, finalize } from 'rxjs/operators';
3
+ import { catchError, filter, take, switchMap, finalize, timeout } from 'rxjs/operators';
4
4
  import { AuthService } from './auth.service';
5
5
  import { VALTECH_AUTH_CONFIG } from './config';
6
6
  // Control de estado de refresco (singleton a nivel de módulo)
7
7
  let isRefreshing = false;
8
8
  const refreshTokenSubject = new BehaviorSubject(null);
9
+ /**
10
+ * Tope de espera para una request encolada detrás de un refresh en curso. Si el
11
+ * refresh se cuelga (red/Lambda fría), sin este límite la request encolada espera
12
+ * para siempre y la navegación post-login se atasca. Levemente mayor al timeout
13
+ * del propio refresh (REFRESH_TIMEOUT_MS=10s) para darle margen a resolver.
14
+ */
15
+ const QUEUED_REQUEST_TIMEOUT_MS = 12000;
9
16
  /**
10
17
  * Interceptor HTTP que:
11
18
  * 1. Agrega header Authorization con Bearer token a requests API
@@ -120,7 +127,13 @@ function handle401Error(request, next, authService) {
120
127
  isRefreshing = false;
121
128
  }));
122
129
  }
123
- // Esperar a que termine el refresco en curso
124
- return refreshTokenSubject.pipe(filter((token) => token !== null), take(1), switchMap(token => next(addAuthHeader(request, token))));
130
+ // Esperar a que termine el refresco en curso. Con timeout: si el refresh
131
+ // se cuelga, la request encolada no espera para siempre (evita el atasco de
132
+ // navegación post-login). Al expirar, reseteamos el flag para no dejar el
133
+ // interceptor bloqueado de forma permanente.
134
+ return refreshTokenSubject.pipe(filter((token) => token !== null), take(1), timeout(QUEUED_REQUEST_TIMEOUT_MS), switchMap(token => next(addAuthHeader(request, token))), catchError(error => {
135
+ isRefreshing = false;
136
+ return throwError(() => error);
137
+ }));
125
138
  }
126
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZXJjZXB0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3NlcnZpY2VzL2F1dGgvaW50ZXJjZXB0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQVF2QyxPQUFPLEVBQWMsVUFBVSxFQUFFLGVBQWUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMvRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQy9FLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFFL0MsOERBQThEO0FBQzlELElBQUksWUFBWSxHQUFHLEtBQUssQ0FBQztBQUN6QixNQUFNLG1CQUFtQixHQUFHLElBQUksZUFBZSxDQUFnQixJQUFJLENBQUMsQ0FBQztBQUVyRTs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW1CRztBQUNILE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBc0IsQ0FDaEQsT0FBNkIsRUFDN0IsSUFBbUIsRUFDYSxFQUFFO0lBQ2xDLE1BQU0sV0FBVyxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUN4QyxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsbUJBQW1CLENBQUMsQ0FBQztJQUUzQywyQ0FBMkM7SUFDM0MsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFDMUMsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDdkIsQ0FBQztJQUVELG1EQUFtRDtJQUNuRCxJQUFJLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsVUFBVyxDQUFDLEVBQUUsQ0FBQztRQUNsRCxP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TyxXQUFXLENBQUMsa0JBQWtCLEVBQUUsQ0FBQyxJQUFJLENBQzFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsRUFBRTtZQUNuQixtQkFBbUIsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQy9DLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLEVBQUUsUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7UUFDNUQsQ0FBQyxDQUFDLEVBQ0YsVUFBVSxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQ2pCLFdBQVcsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNyQixPQUFPLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNqQyxDQUFDLENBQUMsRUFDRixRQUFRLENBQUMsR0FBRyxFQUFFO1lBQ1osWUFBWSxHQUFHLEtBQUssQ0FBQztRQUN2QixDQUFDLENBQUMsQ0FDSCxDQUFDO0lBQ0osQ0FBQztJQUVELDZDQUE2QztJQUM3QyxPQUFPLG1CQUFtQixDQUFDLElBQUksQ0FDN0IsTUFBTSxDQUFDLENBQUMsS0FBSyxFQUFtQixFQUFFLENBQUMsS0FBSyxLQUFLLElBQUksQ0FBQyxFQUNsRCxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQ1AsU0FBUyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUN4RCxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgSHR0cEludGVyY2VwdG9yRm4sXG4gIEh0dHBSZXF1ZXN0LFxuICBIdHRwSGFuZGxlckZuLFxuICBIdHRwRXZlbnQsXG4gIEh0dHBFcnJvclJlc3BvbnNlLFxufSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCB0aHJvd0Vycm9yLCBCZWhhdmlvclN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGNhdGNoRXJyb3IsIGZpbHRlciwgdGFrZSwgc3dpdGNoTWFwLCBmaW5hbGl6ZSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IEF1dGhTZXJ2aWNlIH0gZnJvbSAnLi9hdXRoLnNlcnZpY2UnO1xuaW1wb3J0IHsgVkFMVEVDSF9BVVRIX0NPTkZJRyB9IGZyb20gJy4vY29uZmlnJztcblxuLy8gQ29udHJvbCBkZSBlc3RhZG8gZGUgcmVmcmVzY28gKHNpbmdsZXRvbiBhIG5pdmVsIGRlIG3Ds2R1bG8pXG5sZXQgaXNSZWZyZXNoaW5nID0gZmFsc2U7XG5jb25zdCByZWZyZXNoVG9rZW5TdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxzdHJpbmcgfCBudWxsPihudWxsKTtcblxuLyoqXG4gKiBJbnRlcmNlcHRvciBIVFRQIHF1ZTpcbiAqIDEuIEFncmVnYSBoZWFkZXIgQXV0aG9yaXphdGlvbiBjb24gQmVhcmVyIHRva2VuIGEgcmVxdWVzdHMgQVBJXG4gKiAyLiBNYW5lamEgZXJyb3JlcyA0MDEgcmVmcmVzY2FuZG8gZWwgdG9rZW4gYXV0b23DoXRpY2FtZW50ZVxuICogMy4gRW5jb2xhIHJlcXVlc3RzIGR1cmFudGUgZWwgcmVmcmVzY28gcGFyYSBldml0YXIgbcO6bHRpcGxlcyByZWZyZXNoXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIEluY2x1aWRvIGF1dG9tw6F0aWNhbWVudGUgcG9yIHByb3ZpZGVWYWx0ZWNoQXV0aCgpXG4gKiAvLyBQYXJhIHVzbyBtYW51YWw6XG4gKiBpbXBvcnQgeyBwcm92aWRlSHR0cENsaWVudCwgd2l0aEludGVyY2VwdG9ycyB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbiAqIGltcG9ydCB7IGF1dGhJbnRlcmNlcHRvciB9IGZyb20gJ3ZhbHRlY2gtY29tcG9uZW50cyc7XG4gKlxuICogYm9vdHN0cmFwQXBwbGljYXRpb24oQXBwQ29tcG9uZW50LCB7XG4gKiAgIHByb3ZpZGVyczogW1xuICogICAgIHByb3ZpZGVIdHRwQ2xpZW50KHdpdGhJbnRlcmNlcHRvcnMoW2F1dGhJbnRlcmNlcHRvcl0pKSxcbiAqICAgXSxcbiAqIH0pO1xuICogYGBgXG4gKi9cbmV4cG9ydCBjb25zdCBhdXRoSW50ZXJjZXB0b3I6IEh0dHBJbnRlcmNlcHRvckZuID0gKFxuICByZXF1ZXN0OiBIdHRwUmVxdWVzdDx1bmtub3duPixcbiAgbmV4dDogSHR0cEhhbmRsZXJGblxuKTogT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8dW5rbm93bj4+ID0+IHtcbiAgY29uc3QgYXV0aFNlcnZpY2UgPSBpbmplY3QoQXV0aFNlcnZpY2UpO1xuICBjb25zdCBjb25maWcgPSBpbmplY3QoVkFMVEVDSF9BVVRIX0NPTkZJRyk7XG5cbiAgLy8gT21pdGlyIHJlcXVlc3RzIHF1ZSBubyBzb24gYSBudWVzdHJhIEFQSVxuICBpZiAoIWlzQXBpUmVxdWVzdChyZXF1ZXN0LCBjb25maWcuYXBpVXJsKSkge1xuICAgIHJldHVybiBuZXh0KHJlcXVlc3QpO1xuICB9XG5cbiAgLy8gT21pdGlyIGVuZHBvaW50cyBww7pibGljb3MgcXVlIG5vIG5lY2VzaXRhbiB0b2tlblxuICBpZiAoaXNQdWJsaWNFbmRwb2ludChyZXF1ZXN0LCBjb25maWcuYXV0aFByZWZpeCEpKSB7XG4gICAgcmV0dXJuIG5leHQocmVxdWVzdCk7XG4gIH1cblxuICBjb25zdCBhY2Nlc3NUb2tlbiA9IGF1dGhTZXJ2aWNlLmFjY2Vzc1Rva2VuKCk7XG5cbiAgLy8gQWdyZWdhciBoZWFkZXIgZGUgYXV0b3JpemFjacOzbiBzaSBoYXkgdG9rZW5cbiAgaWYgKGFjY2Vzc1Rva2VuKSB7XG4gICAgcmVxdWVzdCA9IGFkZEF1dGhIZWFkZXIocmVxdWVzdCwgYWNjZXNzVG9rZW4pO1xuICB9XG5cbiAgcmV0dXJuIG5leHQocmVxdWVzdCkucGlwZShcbiAgICBjYXRjaEVycm9yKChlcnJvcjogSHR0cEVycm9yUmVzcG9uc2UpID0+IHtcbiAgICAgIGlmIChlcnJvci5zdGF0dXMgPT09IDQwMSAmJiAhaXNOb1JlZnJlc2hFbmRwb2ludChyZXF1ZXN0LCBjb25maWcuYXV0aFByZWZpeCEpKSB7XG4gICAgICAgIHJldHVybiBoYW5kbGU0MDFFcnJvcihyZXF1ZXN0LCBuZXh0LCBhdXRoU2VydmljZSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChlcnJvci5zdGF0dXMgPT09IDQwMykge1xuICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICdbVmFsdGVjaEF1dGhdIFBlcm1pc28gZGVuZWdhZG86JyxcbiAgICAgICAgICBlcnJvci5lcnJvcj8ubWVzc2FnZSB8fCAnQWNjZXNvIHByb2hpYmlkbydcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gZXJyb3IpO1xuICAgIH0pXG4gICk7XG59O1xuXG4vKipcbiAqIEFncmVnYSBoZWFkZXIgZGUgYXV0b3JpemFjacOzbiBhIGxhIHJlcXVlc3QuXG4gKi9cbmZ1bmN0aW9uIGFkZEF1dGhIZWFkZXIocmVxdWVzdDogSHR0cFJlcXVlc3Q8dW5rbm93bj4sIHRva2VuOiBzdHJpbmcpOiBIdHRwUmVxdWVzdDx1bmtub3duPiB7XG4gIHJldHVybiByZXF1ZXN0LmNsb25lKHtcbiAgICBzZXRIZWFkZXJzOiB7XG4gICAgICBBdXRob3JpemF0aW9uOiBgQmVhcmVyICR7dG9rZW59YCxcbiAgICB9LFxuICB9KTtcbn1cblxuLyoqXG4gKiBWZXJpZmljYSBzaSBsYSByZXF1ZXN0IGVzIGEgbnVlc3RyYSBBUEkuXG4gKi9cbmZ1bmN0aW9uIGlzQXBpUmVxdWVzdChyZXF1ZXN0OiBIdHRwUmVxdWVzdDx1bmtub3duPiwgYXBpVXJsOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIHJlcXVlc3QudXJsLnN0YXJ0c1dpdGgoYXBpVXJsKSB8fCByZXF1ZXN0LnVybC5pbmNsdWRlcygnL3YyL2F1dGgnKTtcbn1cblxuLyoqXG4gKiBWZXJpZmljYSBzaSBsYSByZXF1ZXN0IGVzIGEgdW4gZW5kcG9pbnQgcMO6YmxpY28gcXVlIE5PIHJlcXVpZXJlIHRva2VuLlxuICovXG5mdW5jdGlvbiBpc1B1YmxpY0VuZHBvaW50KHJlcXVlc3Q6IEh0dHBSZXF1ZXN0PHVua25vd24+LCBhdXRoUHJlZml4OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgcHVibGljRW5kcG9pbnRzID0gW1xuICAgICcvc2lnbmluJyxcbiAgICAnL3NpZ251cCcsXG4gICAgJy9yZWZyZXNoJyxcbiAgICAnL2xvZ291dCcsXG4gICAgJy9tZmEvdmVyaWZ5JywgLy8gU29sbyBkdXJhbnRlIGxvZ2luXG4gIF07XG4gIHJldHVybiBwdWJsaWNFbmRwb2ludHMuc29tZShlbmRwb2ludCA9PiByZXF1ZXN0LnVybC5pbmNsdWRlcyhgJHthdXRoUHJlZml4fSR7ZW5kcG9pbnR9YCkpO1xufVxuXG4vKipcbiAqIFZlcmlmaWNhIHNpIGxhIHJlcXVlc3QgZXMgYSB1biBlbmRwb2ludCBxdWUgTk8gZGViZSByZWludGVudGFyIHJlZnJlc2ggZW4gNDAxLlxuICovXG5mdW5jdGlvbiBpc05vUmVmcmVzaEVuZHBvaW50KHJlcXVlc3Q6IEh0dHBSZXF1ZXN0PHVua25vd24+LCBhdXRoUHJlZml4OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgLy8gRW5kcG9pbnRzIHF1ZSBubyBkZWJlbiBpbnRlbnRhciByZWZyZXNoIGVuIDQwMTpcbiAgLy8gLSBQw7pibGljb3M6IHNpZ25pbiwgc2lnbnVwLCByZWZyZXNoLCBsb2dvdXRcbiAgLy8gLSBNRkE6IHZlcmlmeSAoZHVyYW50ZSBsb2dpbiksIGNvbmZpcm0gKDQwMSA9IGPDs2RpZ28gaW5jb3JyZWN0byksIGRpc2FibGUgKDQwMSA9IGNvbnRyYXNlw7FhIGluY29ycmVjdGEpXG4gIC8vIC0gY2hhbmdlLXBhc3N3b3JkOiA0MDEgPSBjb250cmFzZcOxYSBhY3R1YWwgaW5jb3JyZWN0YSwgTk8gdG9rZW4gZXhwaXJhZG8uXG4gIC8vICAgU2luIGVzdGEgZXhjbHVzacOzbiwgZWwgcmV0cnkgdHJhcyByZWZyZXNoIHZ1ZWx2ZSBhIGRhciA0MDEgeSBlbFxuICAvLyAgIGNhdGNoRXJyb3IgZGUgaGFuZGxlNDAxRXJyb3IgZGlzcGFyYSBsb2dvdXQuXG4gIGNvbnN0IG5vUmVmcmVzaEVuZHBvaW50cyA9IFtcbiAgICAnL3NpZ25pbicsXG4gICAgJy9zaWdudXAnLFxuICAgICcvcmVmcmVzaCcsXG4gICAgJy9sb2dvdXQnLFxuICAgICcvbWZhL3ZlcmlmeScsXG4gICAgJy9tZmEvY29uZmlybScsXG4gICAgJy9tZmEvZGlzYWJsZScsXG4gICAgJy9jaGFuZ2UtcGFzc3dvcmQnLFxuICBdO1xuICByZXR1cm4gbm9SZWZyZXNoRW5kcG9pbnRzLnNvbWUoZW5kcG9pbnQgPT4gcmVxdWVzdC51cmwuaW5jbHVkZXMoYCR7YXV0aFByZWZpeH0ke2VuZHBvaW50fWApKTtcbn1cblxuLyoqXG4gKiBNYW5lamEgZXJyb3JlcyA0MDEgcmVmcmVzY2FuZG8gZWwgdG9rZW4uXG4gKi9cbmZ1bmN0aW9uIGhhbmRsZTQwMUVycm9yKFxuICByZXF1ZXN0OiBIdHRwUmVxdWVzdDx1bmtub3duPixcbiAgbmV4dDogSHR0cEhhbmRsZXJGbixcbiAgYXV0aFNlcnZpY2U6IEF1dGhTZXJ2aWNlXG4pOiBPYnNlcnZhYmxlPEh0dHBFdmVudDx1bmtub3duPj4ge1xuICBpZiAoIWlzUmVmcmVzaGluZykge1xuICAgIGlzUmVmcmVzaGluZyA9IHRydWU7XG4gICAgcmVmcmVzaFRva2VuU3ViamVjdC5uZXh0KG51bGwpO1xuXG4gICAgcmV0dXJuIGF1dGhTZXJ2aWNlLnJlZnJlc2hBY2Nlc3NUb2tlbigpLnBpcGUoXG4gICAgICBzd2l0Y2hNYXAocmVzcG9uc2UgPT4ge1xuICAgICAgICByZWZyZXNoVG9rZW5TdWJqZWN0Lm5leHQocmVzcG9uc2UuYWNjZXNzVG9rZW4pO1xuICAgICAgICByZXR1cm4gbmV4dChhZGRBdXRoSGVhZGVyKHJlcXVlc3QsIHJlc3BvbnNlLmFjY2Vzc1Rva2VuKSk7XG4gICAgICB9KSxcbiAgICAgIGNhdGNoRXJyb3IoZXJyb3IgPT4ge1xuICAgICAgICBhdXRoU2VydmljZS5sb2dvdXQoKTtcbiAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gZXJyb3IpO1xuICAgICAgfSksXG4gICAgICBmaW5hbGl6ZSgoKSA9PiB7XG4gICAgICAgIGlzUmVmcmVzaGluZyA9IGZhbHNlO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgLy8gRXNwZXJhciBhIHF1ZSB0ZXJtaW5lIGVsIHJlZnJlc2NvIGVuIGN1cnNvXG4gIHJldHVybiByZWZyZXNoVG9rZW5TdWJqZWN0LnBpcGUoXG4gICAgZmlsdGVyKCh0b2tlbik6IHRva2VuIGlzIHN0cmluZyA9PiB0b2tlbiAhPT0gbnVsbCksXG4gICAgdGFrZSgxKSxcbiAgICBzd2l0Y2hNYXAodG9rZW4gPT4gbmV4dChhZGRBdXRoSGVhZGVyKHJlcXVlc3QsIHRva2VuKSkpXG4gICk7XG59XG4iXX0=
139
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZXJjZXB0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3NlcnZpY2VzL2F1dGgvaW50ZXJjZXB0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQVF2QyxPQUFPLEVBQWMsVUFBVSxFQUFFLGVBQWUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMvRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4RixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sVUFBVSxDQUFDO0FBRS9DLDhEQUE4RDtBQUM5RCxJQUFJLFlBQVksR0FBRyxLQUFLLENBQUM7QUFDekIsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLGVBQWUsQ0FBZ0IsSUFBSSxDQUFDLENBQUM7QUFFckU7Ozs7O0dBS0c7QUFDSCxNQUFNLHlCQUF5QixHQUFHLEtBQUssQ0FBQztBQUV4Qzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW1CRztBQUNILE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBc0IsQ0FDaEQsT0FBNkIsRUFDN0IsSUFBbUIsRUFDYSxFQUFFO0lBQ2xDLE1BQU0sV0FBVyxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUN4QyxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsbUJBQW1CLENBQUMsQ0FBQztJQUUzQywyQ0FBMkM7SUFDM0MsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFDMUMsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDdkIsQ0FBQztJQUVELG1EQUFtRDtJQUNuRCxJQUFJLGdC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LCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIEh0dHBJbnRlcmNlcHRvckZuLFxuICBIdHRwUmVxdWVzdCxcbiAgSHR0cEhhbmRsZXJGbixcbiAgSHR0cEV2ZW50LFxuICBIdHRwRXJyb3JSZXNwb25zZSxcbn0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgdGhyb3dFcnJvciwgQmVoYXZpb3JTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBjYXRjaEVycm9yLCBmaWx0ZXIsIHRha2UsIHN3aXRjaE1hcCwgZmluYWxpemUsIHRpbWVvdXQgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBBdXRoU2VydmljZSB9IGZyb20gJy4vYXV0aC5zZXJ2aWNlJztcbmltcG9ydCB7IFZBTFRFQ0hfQVVUSF9DT05GSUcgfSBmcm9tICcuL2NvbmZpZyc7XG5cbi8vIENvbnRyb2wgZGUgZXN0YWRvIGRlIHJlZnJlc2NvIChzaW5nbGV0b24gYSBuaXZlbCBkZSBtw7NkdWxvKVxubGV0IGlzUmVmcmVzaGluZyA9IGZhbHNlO1xuY29uc3QgcmVmcmVzaFRva2VuU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8c3RyaW5nIHwgbnVsbD4obnVsbCk7XG5cbi8qKlxuICogVG9wZSBkZSBlc3BlcmEgcGFyYSB1bmEgcmVxdWVzdCBlbmNvbGFkYSBkZXRyw6FzIGRlIHVuIHJlZnJlc2ggZW4gY3Vyc28uIFNpIGVsXG4gKiByZWZyZXNoIHNlIGN1ZWxnYSAocmVkL0xhbWJkYSBmcsOtYSksIHNpbiBlc3RlIGzDrW1pdGUgbGEgcmVxdWVzdCBlbmNvbGFkYSBlc3BlcmFcbiAqIHBhcmEgc2llbXByZSB5IGxhIG5hdmVnYWNpw7NuIHBvc3QtbG9naW4gc2UgYXRhc2NhLiBMZXZlbWVudGUgbWF5b3IgYWwgdGltZW91dFxuICogZGVsIHByb3BpbyByZWZyZXNoIChSRUZSRVNIX1RJTUVPVVRfTVM9MTBzKSBwYXJhIGRhcmxlIG1hcmdlbiBhIHJlc29sdmVyLlxuICovXG5jb25zdCBRVUVVRURfUkVRVUVTVF9USU1FT1VUX01TID0gMTIwMDA7XG5cbi8qKlxuICogSW50ZXJjZXB0b3IgSFRUUCBxdWU6XG4gKiAxLiBBZ3JlZ2EgaGVhZGVyIEF1dGhvcml6YXRpb24gY29uIEJlYXJlciB0b2tlbiBhIHJlcXVlc3RzIEFQSVxuICogMi4gTWFuZWphIGVycm9yZXMgNDAxIHJlZnJlc2NhbmRvIGVsIHRva2VuIGF1dG9tw6F0aWNhbWVudGVcbiAqIDMuIEVuY29sYSByZXF1ZXN0cyBkdXJhbnRlIGVsIHJlZnJlc2NvIHBhcmEgZXZpdGFyIG3Dumx0aXBsZXMgcmVmcmVzaFxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBJbmNsdWlkbyBhdXRvbcOhdGljYW1lbnRlIHBvciBwcm92aWRlVmFsdGVjaEF1dGgoKVxuICogLy8gUGFyYSB1c28gbWFudWFsOlxuICogaW1wb3J0IHsgcHJvdmlkZUh0dHBDbGllbnQsIHdpdGhJbnRlcmNlcHRvcnMgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG4gKiBpbXBvcnQgeyBhdXRoSW50ZXJjZXB0b3IgfSBmcm9tICd2YWx0ZWNoLWNvbXBvbmVudHMnO1xuICpcbiAqIGJvb3RzdHJhcEFwcGxpY2F0aW9uKEFwcENvbXBvbmVudCwge1xuICogICBwcm92aWRlcnM6IFtcbiAqICAgICBwcm92aWRlSHR0cENsaWVudCh3aXRoSW50ZXJjZXB0b3JzKFthdXRoSW50ZXJjZXB0b3JdKSksXG4gKiAgIF0sXG4gKiB9KTtcbiAqIGBgYFxuICovXG5leHBvcnQgY29uc3QgYXV0aEludGVyY2VwdG9yOiBIdHRwSW50ZXJjZXB0b3JGbiA9IChcbiAgcmVxdWVzdDogSHR0cFJlcXVlc3Q8dW5rbm93bj4sXG4gIG5leHQ6IEh0dHBIYW5kbGVyRm5cbik6IE9ic2VydmFibGU8SHR0cEV2ZW50PHVua25vd24+PiA9PiB7XG4gIGNvbnN0IGF1dGhTZXJ2aWNlID0gaW5qZWN0KEF1dGhTZXJ2aWNlKTtcbiAgY29uc3QgY29uZmlnID0gaW5qZWN0KFZBTFRFQ0hfQVVUSF9DT05GSUcpO1xuXG4gIC8vIE9taXRpciByZXF1ZXN0cyBxdWUgbm8gc29uIGEgbnVlc3RyYSBBUElcbiAgaWYgKCFpc0FwaVJlcXVlc3QocmVxdWVzdCwgY29uZmlnLmFwaVVybCkpIHtcbiAgICByZXR1cm4gbmV4dChyZXF1ZXN0KTtcbiAgfVxuXG4gIC8vIE9taXRpciBlbmRwb2ludHMgcMO6YmxpY29zIHF1ZSBubyBuZWNlc2l0YW4gdG9rZW5cbiAgaWYgKGlzUHVibGljRW5kcG9pbnQocmVxdWVzdCwgY29uZmlnLmF1dGhQcmVmaXghKSkge1xuICAgIHJldHVybiBuZXh0KHJlcXVlc3QpO1xuICB9XG5cbiAgY29uc3QgYWNjZXNzVG9rZW4gPSBhdXRoU2VydmljZS5hY2Nlc3NUb2tlbigpO1xuXG4gIC8vIEFncmVnYXIgaGVhZGVyIGRlIGF1dG9yaXphY2nDs24gc2kgaGF5IHRva2VuXG4gIGlmIChhY2Nlc3NUb2tlbikge1xuICAgIHJlcXVlc3QgPSBhZGRBdXRoSGVhZGVyKHJlcXVlc3QsIGFjY2Vzc1Rva2VuKTtcbiAgfVxuXG4gIHJldHVybiBuZXh0KHJlcXVlc3QpLnBpcGUoXG4gICAgY2F0Y2hFcnJvcigoZXJyb3I6IEh0dHBFcnJvclJlc3BvbnNlKSA9PiB7XG4gICAgICBpZiAoZXJyb3Iuc3RhdHVzID09PSA0MDEgJiYgIWlzTm9SZWZyZXNoRW5kcG9pbnQocmVxdWVzdCwgY29uZmlnLmF1dGhQcmVmaXghKSkge1xuICAgICAgICByZXR1cm4gaGFuZGxlNDAxRXJyb3IocmVxdWVzdCwgbmV4dCwgYXV0aFNlcnZpY2UpO1xuICAgICAgfVxuXG4gICAgICBpZiAoZXJyb3Iuc3RhdHVzID09PSA0MDMpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAnW1ZhbHRlY2hBdXRoXSBQZXJtaXNvIGRlbmVnYWRvOicsXG4gICAgICAgICAgZXJyb3IuZXJyb3I/Lm1lc3NhZ2UgfHwgJ0FjY2VzbyBwcm9oaWJpZG8nXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IGVycm9yKTtcbiAgICB9KVxuICApO1xufTtcblxuLyoqXG4gKiBBZ3JlZ2EgaGVhZGVyIGRlIGF1dG9yaXphY2nDs24gYSBsYSByZXF1ZXN0LlxuICovXG5mdW5jdGlvbiBhZGRBdXRoSGVhZGVyKHJlcXVlc3Q6IEh0dHBSZXF1ZXN0PHVua25vd24+LCB0b2tlbjogc3RyaW5nKTogSHR0cFJlcXVlc3Q8dW5rbm93bj4ge1xuICByZXR1cm4gcmVxdWVzdC5jbG9uZSh7XG4gICAgc2V0SGVhZGVyczoge1xuICAgICAgQXV0aG9yaXphdGlvbjogYEJlYXJlciAke3Rva2VufWAsXG4gICAgfSxcbiAgfSk7XG59XG5cbi8qKlxuICogVmVyaWZpY2Egc2kgbGEgcmVxdWVzdCBlcyBhIG51ZXN0cmEgQVBJLlxuICovXG5mdW5jdGlvbiBpc0FwaVJlcXVlc3QocmVxdWVzdDogSHR0cFJlcXVlc3Q8dW5rbm93bj4sIGFwaVVybDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiByZXF1ZXN0LnVybC5zdGFydHNXaXRoKGFwaVVybCkgfHwgcmVxdWVzdC51cmwuaW5jbHVkZXMoJy92Mi9hdXRoJyk7XG59XG5cbi8qKlxuICogVmVyaWZpY2Egc2kgbGEgcmVxdWVzdCBlcyBhIHVuIGVuZHBvaW50IHDDumJsaWNvIHF1ZSBOTyByZXF1aWVyZSB0b2tlbi5cbiAqL1xuZnVuY3Rpb24gaXNQdWJsaWNFbmRwb2ludChyZXF1ZXN0OiBIdHRwUmVxdWVzdDx1bmtub3duPiwgYXV0aFByZWZpeDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IHB1YmxpY0VuZHBvaW50cyA9IFtcbiAgICAnL3NpZ25pbicsXG4gICAgJy9zaWdudXAnLFxuICAgICcvcmVmcmVzaCcsXG4gICAgJy9sb2dvdXQnLFxuICAgICcvbWZhL3ZlcmlmeScsIC8vIFNvbG8gZHVyYW50ZSBsb2dpblxuICBdO1xuICByZXR1cm4gcHVibGljRW5kcG9pbnRzLnNvbWUoZW5kcG9pbnQgPT4gcmVxdWVzdC51cmwuaW5jbHVkZXMoYCR7YXV0aFByZWZpeH0ke2VuZHBvaW50fWApKTtcbn1cblxuLyoqXG4gKiBWZXJpZmljYSBzaSBsYSByZXF1ZXN0IGVzIGEgdW4gZW5kcG9pbnQgcXVlIE5PIGRlYmUgcmVpbnRlbnRhciByZWZyZXNoIGVuIDQwMS5cbiAqL1xuZnVuY3Rpb24gaXNOb1JlZnJlc2hFbmRwb2ludChyZXF1ZXN0OiBIdHRwUmVxdWVzdDx1bmtub3duPiwgYXV0aFByZWZpeDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIC8vIEVuZHBvaW50cyBxdWUgbm8gZGViZW4gaW50ZW50YXIgcmVmcmVzaCBlbiA0MDE6XG4gIC8vIC0gUMO6YmxpY29zOiBzaWduaW4sIHNpZ251cCwgcmVmcmVzaCwgbG9nb3V0XG4gIC8vIC0gTUZBOiB2ZXJpZnkgKGR1cmFudGUgbG9naW4pLCBjb25maXJtICg0MDEgPSBjw7NkaWdvIGluY29ycmVjdG8pLCBkaXNhYmxlICg0MDEgPSBjb250cmFzZcOxYSBpbmNvcnJlY3RhKVxuICAvLyAtIGNoYW5nZS1wYXNzd29yZDogNDAxID0gY29udHJhc2XDsWEgYWN0dWFsIGluY29ycmVjdGEsIE5PIHRva2VuIGV4cGlyYWRvLlxuICAvLyAgIFNpbiBlc3RhIGV4Y2x1c2nDs24sIGVsIHJldHJ5IHRyYXMgcmVmcmVzaCB2dWVsdmUgYSBkYXIgNDAxIHkgZWxcbiAgLy8gICBjYXRjaEVycm9yIGRlIGhhbmRsZTQwMUVycm9yIGRpc3BhcmEgbG9nb3V0LlxuICBjb25zdCBub1JlZnJlc2hFbmRwb2ludHMgPSBbXG4gICAgJy9zaWduaW4nLFxuICAgICcvc2lnbnVwJyxcbiAgICAnL3JlZnJlc2gnLFxuICAgICcvbG9nb3V0JyxcbiAgICAnL21mYS92ZXJpZnknLFxuICAgICcvbWZhL2NvbmZpcm0nLFxuICAgICcvbWZhL2Rpc2FibGUnLFxuICAgICcvY2hhbmdlLXBhc3N3b3JkJyxcbiAgXTtcbiAgcmV0dXJuIG5vUmVmcmVzaEVuZHBvaW50cy5zb21lKGVuZHBvaW50ID0+IHJlcXVlc3QudXJsLmluY2x1ZGVzKGAke2F1dGhQcmVmaXh9JHtlbmRwb2ludH1gKSk7XG59XG5cbi8qKlxuICogTWFuZWphIGVycm9yZXMgNDAxIHJlZnJlc2NhbmRvIGVsIHRva2VuLlxuICovXG5mdW5jdGlvbiBoYW5kbGU0MDFFcnJvcihcbiAgcmVxdWVzdDogSHR0cFJlcXVlc3Q8dW5rbm93bj4sXG4gIG5leHQ6IEh0dHBIYW5kbGVyRm4sXG4gIGF1dGhTZXJ2aWNlOiBBdXRoU2VydmljZVxuKTogT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8dW5rbm93bj4+IHtcbiAgaWYgKCFpc1JlZnJlc2hpbmcpIHtcbiAgICBpc1JlZnJlc2hpbmcgPSB0cnVlO1xuICAgIHJlZnJlc2hUb2tlblN1YmplY3QubmV4dChudWxsKTtcblxuICAgIHJldHVybiBhdXRoU2VydmljZS5yZWZyZXNoQWNjZXNzVG9rZW4oKS5waXBlKFxuICAgICAgc3dpdGNoTWFwKHJlc3BvbnNlID0+IHtcbiAgICAgICAgcmVmcmVzaFRva2VuU3ViamVjdC5uZXh0KHJlc3BvbnNlLmFjY2Vzc1Rva2VuKTtcbiAgICAgICAgcmV0dXJuIG5leHQoYWRkQXV0aEhlYWRlcihyZXF1ZXN0LCByZXNwb25zZS5hY2Nlc3NUb2tlbikpO1xuICAgICAgfSksXG4gICAgICBjYXRjaEVycm9yKGVycm9yID0+IHtcbiAgICAgICAgYXV0aFNlcnZpY2UubG9nb3V0KCk7XG4gICAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IGVycm9yKTtcbiAgICAgIH0pLFxuICAgICAgZmluYWxpemUoKCkgPT4ge1xuICAgICAgICBpc1JlZnJlc2hpbmcgPSBmYWxzZTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIC8vIEVzcGVyYXIgYSBxdWUgdGVybWluZSBlbCByZWZyZXNjbyBlbiBjdXJzby4gQ29uIHRpbWVvdXQ6IHNpIGVsIHJlZnJlc2hcbiAgLy8gc2UgY3VlbGdhLCBsYSByZXF1ZXN0IGVuY29sYWRhIG5vIGVzcGVyYSBwYXJhIHNpZW1wcmUgKGV2aXRhIGVsIGF0YXNjbyBkZVxuICAvLyBuYXZlZ2FjacOzbiBwb3N0LWxvZ2luKS4gQWwgZXhwaXJhciwgcmVzZXRlYW1vcyBlbCBmbGFnIHBhcmEgbm8gZGVqYXIgZWxcbiAgLy8gaW50ZXJjZXB0b3IgYmxvcXVlYWRvIGRlIGZvcm1hIHBlcm1hbmVudGUuXG4gIHJldHVybiByZWZyZXNoVG9rZW5TdWJqZWN0LnBpcGUoXG4gICAgZmlsdGVyKCh0b2tlbik6IHRva2VuIGlzIHN0cmluZyA9PiB0b2tlbiAhPT0gbnVsbCksXG4gICAgdGFrZSgxKSxcbiAgICB0aW1lb3V0KFFVRVVFRF9SRVFVRVNUX1RJTUVPVVRfTVMpLFxuICAgIHN3aXRjaE1hcCh0b2tlbiA9PiBuZXh0KGFkZEF1dGhIZWFkZXIocmVxdWVzdCwgdG9rZW4pKSksXG4gICAgY2F0Y2hFcnJvcihlcnJvciA9PiB7XG4gICAgICBpc1JlZnJlc2hpbmcgPSBmYWxzZTtcbiAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IGVycm9yKTtcbiAgICB9KVxuICApO1xufVxuIl19
@@ -2,5 +2,5 @@
2
2
  * Current version of valtech-components.
3
3
  * This is automatically updated during the publish process.
4
4
  */
5
- export const VERSION = '4.0.170';
6
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyc2lvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvdmVyc2lvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFDSCxNQUFNLENBQUMsTUFBTSxPQUFPLEdBQUcsU0FBUyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDdXJyZW50IHZlcnNpb24gb2YgdmFsdGVjaC1jb21wb25lbnRzLlxuICogVGhpcyBpcyBhdXRvbWF0aWNhbGx5IHVwZGF0ZWQgZHVyaW5nIHRoZSBwdWJsaXNoIHByb2Nlc3MuXG4gKi9cbmV4cG9ydCBjb25zdCBWRVJTSU9OID0gJzQuMC4xNzAnO1xuIl19
5
+ export const VERSION = '4.0.171';
6
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyc2lvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvdmVyc2lvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFDSCxNQUFNLENBQUMsTUFBTSxPQUFPLEdBQUcsU0FBUyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDdXJyZW50IHZlcnNpb24gb2YgdmFsdGVjaC1jb21wb25lbnRzLlxuICogVGhpcyBpcyBhdXRvbWF0aWNhbGx5IHVwZGF0ZWQgZHVyaW5nIHRoZSBwdWJsaXNoIHByb2Nlc3MuXG4gKi9cbmV4cG9ydCBjb25zdCBWRVJTSU9OID0gJzQuMC4xNzEnO1xuIl19
@@ -1,7 +1,7 @@
1
1
  import * as i0 from '@angular/core';
2
2
  import { inject, InjectionToken, makeEnvironmentProviders, APP_INITIALIZER, ErrorHandler, Injectable, DestroyRef, Inject, signal, computed, PLATFORM_ID, isDevMode, Optional, runInInjectionContext, effect, Pipe, TemplateRef, ViewContainerRef, input, Directive, EventEmitter, Component, Input, Output, ChangeDetectionStrategy, HostBinding, HostListener, SecurityContext, NgZone, ViewChild, ElementRef, ChangeDetectorRef, output, ContentChild, model, ViewEncapsulation, untracked, viewChild, Injector, isSignal } from '@angular/core';
3
3
  import { BehaviorSubject, throwError, Subject, map, distinctUntilChanged, filter as filter$1, take as take$1, firstValueFrom, of, from, EMPTY, Observable, interval, debounceTime, switchMap as switchMap$1, catchError as catchError$1, takeUntil, isObservable, forkJoin, race, timer, shareReplay } from 'rxjs';
4
- import { catchError, switchMap, finalize, filter, take, map as map$1, tap, distinctUntilChanged as distinctUntilChanged$1, retry, timeout, debounceTime as debounceTime$1, takeUntil as takeUntil$1 } from 'rxjs/operators';
4
+ import { catchError, switchMap, finalize, filter, take, timeout, map as map$1, tap, distinctUntilChanged as distinctUntilChanged$1, retry, debounceTime as debounceTime$1, takeUntil as takeUntil$1 } from 'rxjs/operators';
5
5
  import * as i1$3 from '@angular/common/http';
6
6
  import { provideHttpClient, withInterceptors, HttpClient, HttpErrorResponse } from '@angular/common/http';
7
7
  import * as i1$1 from '@angular/fire/firestore';
@@ -56,11 +56,18 @@ import { BrowserMultiFormatReader } from '@zxing/browser';
56
56
  * Current version of valtech-components.
57
57
  * This is automatically updated during the publish process.
58
58
  */
59
- const VERSION = '4.0.170';
59
+ const VERSION = '4.0.171';
60
60
 
61
61
  // Control de estado de refresco (singleton a nivel de módulo)
62
62
  let isRefreshing = false;
63
63
  const refreshTokenSubject = new BehaviorSubject(null);
64
+ /**
65
+ * Tope de espera para una request encolada detrás de un refresh en curso. Si el
66
+ * refresh se cuelga (red/Lambda fría), sin este límite la request encolada espera
67
+ * para siempre y la navegación post-login se atasca. Levemente mayor al timeout
68
+ * del propio refresh (REFRESH_TIMEOUT_MS=10s) para darle margen a resolver.
69
+ */
70
+ const QUEUED_REQUEST_TIMEOUT_MS = 12000;
64
71
  /**
65
72
  * Interceptor HTTP que:
66
73
  * 1. Agrega header Authorization con Bearer token a requests API
@@ -175,8 +182,14 @@ function handle401Error(request, next, authService) {
175
182
  isRefreshing = false;
176
183
  }));
177
184
  }
178
- // Esperar a que termine el refresco en curso
179
- return refreshTokenSubject.pipe(filter((token) => token !== null), take(1), switchMap(token => next(addAuthHeader(request, token))));
185
+ // Esperar a que termine el refresco en curso. Con timeout: si el refresh
186
+ // se cuelga, la request encolada no espera para siempre (evita el atasco de
187
+ // navegación post-login). Al expirar, reseteamos el flag para no dejar el
188
+ // interceptor bloqueado de forma permanente.
189
+ return refreshTokenSubject.pipe(filter((token) => token !== null), take(1), timeout(QUEUED_REQUEST_TIMEOUT_MS), switchMap(token => next(addAuthHeader(request, token))), catchError(error => {
190
+ isRefreshing = false;
191
+ return throwError(() => error);
192
+ }));
180
193
  }
181
194
 
182
195
  /**
@@ -8286,6 +8299,15 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
8286
8299
  }]
8287
8300
  }] });
8288
8301
 
8302
+ /**
8303
+ * Timeout duro para el `/refresh` (ms). Una Lambda fría + red móvil flaky pueden
8304
+ * dejar el POST colgado indefinidamente; sin este límite el `await` de
8305
+ * `initialize()` (APP_INITIALIZER) congela el bootstrap en el skeleton, y el flag
8306
+ * `isRefreshing` del interceptor se queda pegado bloqueando toda request posterior.
8307
+ * Con timeout, el refresh SIEMPRE resuelve (ok o error) → la UI nunca cuelga: el
8308
+ * bootstrap continúa como invitado y el interceptor libera la cola.
8309
+ */
8310
+ const REFRESH_TIMEOUT_MS = 10000;
8289
8311
  /**
8290
8312
  * Servicio principal de autenticación.
8291
8313
  *
@@ -8745,7 +8767,11 @@ class AuthService {
8745
8767
  const body = this.storageService.cookieOnly ? {} : { refreshToken: this.state().refreshToken };
8746
8768
  return this.http
8747
8769
  .post(`${this.baseUrl}/refresh`, body, { withCredentials: true })
8748
- .pipe(tap(response => {
8770
+ .pipe(
8771
+ // Nunca dejar el refresh colgado: si la red/Lambda no responde a tiempo,
8772
+ // emitimos error → los callers (initialize, interceptor) lo manejan y la
8773
+ // UI deja de esperar. Ver REFRESH_TIMEOUT_MS.
8774
+ timeout(REFRESH_TIMEOUT_MS), tap(response => {
8749
8775
  const expiresAt = Date.now() + response.expiresIn * 1000;
8750
8776
  this.stateService.updateAccessToken(response.accessToken, response.expiresIn);
8751
8777
  this.stateService.updateRefreshToken(response.refreshToken);