This repository has no description
0

Configure Feed

Select the types of activity you want to include in your feed.

fix 2

+69 -29
app/public/.DS_Store

This is a binary file and will not be displayed.

+69 -29
app/src/lib/bluesky-api.ts
··· 122 122 dpopNonce = probeNonce; 123 123 } else { 124 124 // Try to parse the response body for a nonce in the error message 125 + let probeText = ''; 125 126 try { 126 - const probeData = await probeResponse.json(); 127 - if (probeData.error === 'use_dpop_nonce' && probeData.nonce) { 128 - console.log('[TOKEN REFRESH] Got nonce from error body:', probeData.nonce); 129 - dpopNonce = probeData.nonce; 127 + // First try to get the response as text to avoid consuming the body 128 + probeText = await probeResponse.text(); 129 + 130 + // Then try to parse it as JSON 131 + try { 132 + const probeData = JSON.parse(probeText); 133 + if (probeData.error === 'use_dpop_nonce' && probeData.nonce) { 134 + console.log('[TOKEN REFRESH] Got nonce from error body:', probeData.nonce); 135 + dpopNonce = probeData.nonce; 136 + } 137 + } catch (jsonError) { 138 + console.warn('[TOKEN REFRESH] Failed to parse probe response as JSON:', jsonError); 130 139 } 131 140 } catch (e) { 132 - console.warn('[TOKEN REFRESH] Failed to parse probe response:', e); 141 + console.warn('[TOKEN REFRESH] Failed to get probe response text:', e); 133 142 } 134 143 } 135 144 } catch (directError) { ··· 271 280 }) 272 281 }); 273 282 283 + // Read the retry response body ONLY ONCE and store it 284 + let retryData; 285 + let retryErrorMessage = ''; 286 + 287 + try { 288 + // Try to parse as JSON first 289 + retryData = await retryResponse.json(); 290 + retryErrorMessage = JSON.stringify(retryData); 291 + } catch (e) { 292 + console.warn('[TOKEN REFRESH] Failed to parse retry response as JSON'); 293 + retryData = {}; // Default to empty object 294 + retryErrorMessage = 'Non-JSON response'; 295 + } 296 + 274 297 if (!retryResponse.ok) { 275 - const errorText = await retryResponse.text(); 276 - console.error('[TOKEN REFRESH] Token refresh retry failed:', retryResponse.status, errorText); 277 - throw new Error(`Token refresh retry failed: ${retryResponse.status}, ${errorText}`); 298 + console.error('[TOKEN REFRESH] Token refresh retry failed:', retryResponse.status, retryErrorMessage); 299 + throw new Error(`Token refresh retry failed: ${retryResponse.status}, ${retryErrorMessage}`); 278 300 } 279 301 280 - const tokenData = await retryResponse.json(); 281 302 console.log('[TOKEN REFRESH] Successfully refreshed token on retry'); 282 303 283 304 // Store the new nonce for future requests ··· 287 308 288 309 // Return the new tokens and nonce 289 310 return { 290 - accessToken: tokenData.access_token, 291 - refreshToken: tokenData.refresh_token || refreshToken, 311 + accessToken: retryData.access_token, 312 + refreshToken: retryData.refresh_token || refreshToken, 292 313 dpopNonce: newNonce 293 314 }; 294 315 } 295 316 } 296 317 297 - if (!response.ok) { 298 - const errorText = await response.text(); 299 - console.error('[TOKEN REFRESH] Token refresh failed:', response.status, errorText); 300 - throw new Error(`Token refresh failed: ${response.status}, ${errorText}`); 318 + // Read the response body ONLY ONCE and store it 319 + let responseData; 320 + let errorMessage = ''; 321 + 322 + try { 323 + // Try to parse as JSON first 324 + responseData = await response.json(); 325 + errorMessage = JSON.stringify(responseData); 326 + } catch (e) { 327 + // If JSON parsing fails, handle as regular text 328 + console.warn('[TOKEN REFRESH] Failed to parse response as JSON, will use raw response'); 329 + responseData = {}; // Default to empty object 330 + errorMessage = 'Non-JSON response'; 301 331 } 302 332 303 - const tokenData = await response.json(); 333 + if (!response.ok) { 334 + console.error('[TOKEN REFRESH] Token refresh failed:', response.status, errorMessage); 335 + throw new Error(`Token refresh failed: ${response.status}, ${errorMessage}`); 336 + } 304 337 305 338 // Get any nonce from the response headers 306 339 const responseNonce = response.headers.get('DPoP-Nonce'); ··· 314 347 315 348 // Return the new tokens and nonce 316 349 return { 317 - accessToken: tokenData.access_token, 318 - refreshToken: tokenData.refresh_token || refreshToken, 350 + accessToken: responseData.access_token, 351 + refreshToken: responseData.refresh_token || refreshToken, 319 352 dpopNonce: responseNonce || dpopNonce 320 353 }; 321 354 } catch (error) { ··· 420 453 return true; 421 454 } 422 455 423 - // Log detailed error information 456 + // Log detailed error information and store the response body text ONCE 457 + let responseText = ''; 458 + let responseBody = {}; 459 + 424 460 try { 461 + responseText = await response.text(); 425 462 console.error('Auth check response:', response.status, response.statusText); 426 - const errorData = await response.text(); 427 - console.error('Auth check error data:', errorData); 463 + console.error('Auth check error data:', responseText); 464 + 465 + // Try to parse as JSON if it looks like JSON 466 + if (responseText.trim().startsWith('{')) { 467 + try { 468 + responseBody = JSON.parse(responseText); 469 + } catch (jsonError) { 470 + console.warn('Error data is not valid JSON, using as text'); 471 + } 472 + } 428 473 } catch (parseError) { 429 - console.error('Could not parse error response:', parseError); 474 + console.error('Could not read response body:', parseError); 430 475 } 431 476 432 477 if (response.status === 401) { 433 - // Try to parse error response 434 - let responseBody; 435 - try { 436 - responseBody = await response.json(); 437 - } catch (e) { 438 - responseBody = {}; 439 - } 478 + // We already have the response body from above 479 + console.log('Handling 401 error in auth check'); 440 480 441 481 const nonce = response.headers.get('DPoP-Nonce'); 442 482 if (nonce) {