valtech-components 4.0.170 → 4.0.172

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.172';
6
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyc2lvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvdmVyc2lvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFDSCxNQUFNLENBQUMsTUFBTSxPQUFPLEdBQUcsU0FBUyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDdXJyZW50IHZlcnNpb24gb2YgdmFsdGVjaC1jb21wb25lbnRzLlxuICogVGhpcyBpcyBhdXRvbWF0aWNhbGx5IHVwZGF0ZWQgZHVyaW5nIHRoZSBwdWJsaXNoIHByb2Nlc3MuXG4gKi9cbmV4cG9ydCBjb25zdCBWRVJTSU9OID0gJzQuMC4xNzInO1xuIl19
@@ -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.172';
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);
@@ -35262,20 +35288,21 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
35262
35288
  type: Output
35263
35289
  }] } });
35264
35290
 
35265
- addIcons({ printOutline, downloadOutline });
35291
+ addIcons({ printOutline });
35266
35292
  /**
35267
35293
  * `val-html-viewer-modal` — Modal para visualizar y descargar/imprimir HTML.
35268
35294
  * Se abre como sheet a pantalla completa en móviles.
35269
35295
  *
35270
35296
  * Renderiza HTML embebido en un iframe (los estilos deben estar inline o
35271
- * embebidos en el HTML). Botones de Imprimir (print via iframe) y Descargar
35272
- * (blob export). Toolbar con botón Cerrar.
35297
+ * embebidos en el HTML). Botón Imprimir (print via iframe) + Cerrar. El diálogo
35298
+ * de impresión del SO ya ofrece "Guardar como PDF" y compartir nativo, así que
35299
+ * NO exponemos un "descargar HTML" (un .html suelto no le sirve al usuario).
35273
35300
  *
35274
- * Uso: ModalService.openSheet({ component: HtmlViewerModalComponent, componentProps: { html: "...", title: "..." } })
35301
+ * Uso: ModalService.open({ component: HtmlViewerModalComponent, componentProps: { html: "...", title: "..." }, size: "full" })
35275
35302
  *
35276
35303
  * Props:
35277
35304
  * - html: string — HTML completo con estilos embebidos (requerido)
35278
- * - title: string — Nombre del archivo a descargar (default: "documento")
35305
+ * - title: string — Título del documento (default: "documento")
35279
35306
  *
35280
35307
  * El componente recibe `_modalRef` inyectado por ModalService para cerrar.
35281
35308
  */
@@ -35297,15 +35324,6 @@ class HtmlViewerModalComponent {
35297
35324
  iframe.contentWindow.print();
35298
35325
  }
35299
35326
  }
35300
- downloadContent() {
35301
- const blob = new Blob([this.html], { type: 'text/html;charset=utf-8' });
35302
- const url = window.URL.createObjectURL(blob);
35303
- const link = document.createElement('a');
35304
- link.href = url;
35305
- link.download = `${this.title}-${new Date().getTime()}.html`;
35306
- link.click();
35307
- window.URL.revokeObjectURL(url);
35308
- }
35309
35327
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: HtmlViewerModalComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
35310
35328
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: HtmlViewerModalComponent, isStandalone: true, selector: "val-html-viewer-modal", inputs: { html: "html", title: "title" }, ngImport: i0, template: `
35311
35329
  <ion-header>
@@ -35319,9 +35337,6 @@ class HtmlViewerModalComponent {
35319
35337
  <ion-button fill="clear" color="primary" (click)="printContent()" title="Imprimir">
35320
35338
  <ion-icon name="print-outline" slot="icon-only" />
35321
35339
  </ion-button>
35322
- <ion-button fill="clear" color="primary" (click)="downloadContent()" title="Descargar">
35323
- <ion-icon name="download-outline" slot="icon-only" />
35324
- </ion-button>
35325
35340
  </ion-buttons>
35326
35341
  </ion-toolbar>
35327
35342
  </ion-header>
@@ -35345,9 +35360,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
35345
35360
  <ion-button fill="clear" color="primary" (click)="printContent()" title="Imprimir">
35346
35361
  <ion-icon name="print-outline" slot="icon-only" />
35347
35362
  </ion-button>
35348
- <ion-button fill="clear" color="primary" (click)="downloadContent()" title="Descargar">
35349
- <ion-icon name="download-outline" slot="icon-only" />
35350
- </ion-button>
35351
35363
  </ion-buttons>
35352
35364
  </ion-toolbar>
35353
35365
  </ion-header>