@@ -377,35 +377,26 @@ export class ProfileManager {
377377 }
378378 }
379379
380- private async resolveTokenForUrl ( url : string ) : Promise < string > {
381- // Check if URL matches a cached realm token
380+ private async getRealmTokenForUrl ( url : string ) : Promise < string | undefined > {
382381 let realmToken = this . findRealmTokenForUrl ( url ) ;
383382 if ( realmToken ) {
384383 return realmToken ;
385384 }
386385
387- // Fetch all realm tokens and try again
388- await this . fetchAndStoreAllRealmTokens ( ) ;
389- realmToken = this . findRealmTokenForUrl ( url ) ;
390- if ( realmToken ) {
391- return realmToken ;
386+ try {
387+ await this . fetchAndStoreAllRealmTokens ( ) ;
388+ } catch {
389+ // Token prefetch failed (e.g. expired server token) — caller will handle 401 retry
390+ return undefined ;
392391 }
393-
394- // Fall back to server token for server-level endpoints
395- return this . getOrRefreshServerToken ( ) ;
392+ return this . findRealmTokenForUrl ( url ) ;
396393 }
397394
398- async authedFetch (
395+ private buildHeaders (
399396 input : string | URL | Request ,
400- init ?: RequestInit ,
401- ) : Promise < Response > {
402- let url =
403- input instanceof Request
404- ? input . url
405- : input instanceof URL
406- ? input . href
407- : input ;
408- let token = await this . resolveTokenForUrl ( url ) ;
397+ init : RequestInit | undefined ,
398+ token : string ,
399+ ) : Headers {
409400 let baseHeaders =
410401 input instanceof Request ? new Headers ( input . headers ) : new Headers ( ) ;
411402 let initHeaders = new Headers ( init ?. headers ) ;
@@ -415,20 +406,68 @@ export class ProfileManager {
415406 if ( ! baseHeaders . has ( 'Authorization' ) ) {
416407 baseHeaders . set ( 'Authorization' , token ) ;
417408 }
409+ return baseHeaders ;
410+ }
418411
419- let response = await fetch ( input , { ...init , headers : baseHeaders } ) ;
412+ async authedRealmFetch (
413+ input : string | URL | Request ,
414+ init ?: RequestInit ,
415+ ) : Promise < Response > {
416+ let url =
417+ input instanceof Request
418+ ? input . url
419+ : input instanceof URL
420+ ? input . href
421+ : input ;
422+
423+ let token = await this . getRealmTokenForUrl ( url ) ;
424+ if ( ! token ) {
425+ throw new Error (
426+ `No realm token available for ${ url } . The server token may have expired or the realm is not accessible.` ,
427+ ) ;
428+ }
429+ let headers = this . buildHeaders ( input , init , token ) ;
430+ let response = await fetch ( input , { ...init , headers } ) ;
420431
421432 if ( response . status === 401 ) {
422- // Clear cached tokens and retry
423433 let active = this . getActiveProfile ( ) ;
424434 if ( active ) {
425435 active . profile . realmTokens = { } ;
426436 active . profile . realmServerToken = undefined ;
427437 this . saveConfig ( ) ;
428438 }
429- token = await this . resolveTokenForUrl ( url ) ;
430- baseHeaders . set ( 'Authorization' , token ) ;
431- response = await fetch ( input , { ...init , headers : baseHeaders } ) ;
439+ try {
440+ await this . fetchAndStoreAllRealmTokens ( ) ;
441+ } catch {
442+ throw new Error (
443+ `Failed to refresh realm token for ${ url } . The server token may have expired.` ,
444+ ) ;
445+ }
446+ token = this . findRealmTokenForUrl ( url ) ;
447+ if ( ! token ) {
448+ throw new Error (
449+ `No realm token available for ${ url } after refresh. The realm may not be accessible.` ,
450+ ) ;
451+ }
452+ headers = this . buildHeaders ( input , init , token ) ;
453+ response = await fetch ( input , { ...init , headers } ) ;
454+ }
455+
456+ return response ;
457+ }
458+
459+ async authedRealmServerFetch (
460+ input : string | URL | Request ,
461+ init ?: RequestInit ,
462+ ) : Promise < Response > {
463+ let token = await this . getOrRefreshServerToken ( ) ;
464+ let headers = this . buildHeaders ( input , init , token ) ;
465+ let response = await fetch ( input , { ...init , headers } ) ;
466+
467+ if ( response . status === 401 ) {
468+ token = await this . refreshServerToken ( ) ;
469+ headers = this . buildHeaders ( input , init , token ) ;
470+ response = await fetch ( input , { ...init , headers } ) ;
432471 }
433472
434473 return response ;
0 commit comments