axios+telemetry cleanup
This commit is contained in:
@@ -12,7 +12,7 @@
|
||||
* - API returns empty settings for users without managed settings
|
||||
*/
|
||||
|
||||
import axios from 'axios'
|
||||
import { isHttpError, nativeRequest, classifyHttpError } from '../../utils/http.js'
|
||||
import { createHash } from 'crypto'
|
||||
import { open, unlink } from 'fs/promises'
|
||||
import { getOauthConfig, OAUTH_BETA_HEADER } from '../../constants/oauth.js'
|
||||
@@ -23,7 +23,7 @@ import {
|
||||
} from '../../utils/auth.js'
|
||||
import { registerCleanup } from '../../utils/cleanupRegistry.js'
|
||||
import { logForDebugging } from '../../utils/debug.js'
|
||||
import { classifyAxiosError, getErrnoCode } from '../../utils/errors.js'
|
||||
import { getErrnoCode } from '../../utils/errors.js'
|
||||
import { settingsChangeDetector } from '../../utils/settings/changeDetector.js'
|
||||
import {
|
||||
type SettingsJson,
|
||||
@@ -248,40 +248,38 @@ async function fetchWithRetry(
|
||||
async function fetchRemoteManagedSettings(
|
||||
cachedChecksum?: string,
|
||||
): Promise<RemoteManagedSettingsFetchResult> {
|
||||
// Ensure OAuth token is fresh before fetching settings
|
||||
// This prevents 401 errors from stale cached tokens
|
||||
await checkAndRefreshOAuthTokenIfNeeded()
|
||||
|
||||
// Use local auth header getter to avoid circular dependency with getSettings()
|
||||
const authHeaders = getRemoteSettingsAuthHeaders()
|
||||
if (authHeaders.error) {
|
||||
// Auth errors should not be retried - return a special flag to skip retries
|
||||
return {
|
||||
success: false,
|
||||
error: `Authentication required for remote settings`,
|
||||
skipRetry: true,
|
||||
}
|
||||
}
|
||||
|
||||
const endpoint = getRemoteManagedSettingsEndpoint()
|
||||
const headers: Record<string, string> = {
|
||||
...authHeaders.headers,
|
||||
'User-Agent': getClaudeCodeUserAgent(),
|
||||
}
|
||||
|
||||
// Add If-None-Match header for ETag-based caching
|
||||
if (cachedChecksum) {
|
||||
headers['If-None-Match'] = `"${cachedChecksum}"`
|
||||
}
|
||||
|
||||
try {
|
||||
// Ensure OAuth token is fresh before fetching settings
|
||||
// This prevents 401 errors from stale cached tokens
|
||||
await checkAndRefreshOAuthTokenIfNeeded()
|
||||
|
||||
// Use local auth header getter to avoid circular dependency with getSettings()
|
||||
const authHeaders = getRemoteSettingsAuthHeaders()
|
||||
if (authHeaders.error) {
|
||||
// Auth errors should not be retried - return a special flag to skip retries
|
||||
return {
|
||||
success: false,
|
||||
error: `Authentication required for remote settings`,
|
||||
skipRetry: true,
|
||||
}
|
||||
}
|
||||
|
||||
const endpoint = getRemoteManagedSettingsEndpoint()
|
||||
const headers: Record<string, string> = {
|
||||
...authHeaders.headers,
|
||||
'User-Agent': getClaudeCodeUserAgent(),
|
||||
}
|
||||
|
||||
// Add If-None-Match header for ETag-based caching
|
||||
if (cachedChecksum) {
|
||||
headers['If-None-Match'] = `"${cachedChecksum}"`
|
||||
}
|
||||
|
||||
const response = await axios.get(endpoint, {
|
||||
const response = await nativeRequest(endpoint, {
|
||||
method: 'GET',
|
||||
headers,
|
||||
timeout: SETTINGS_TIMEOUT_MS,
|
||||
// Allow 204, 304, and 404 responses without treating them as errors.
|
||||
// 204/404 are returned when no settings exist for the user or the feature flag is off.
|
||||
validateStatus: status =>
|
||||
status === 200 || status === 204 || status === 304 || status === 404,
|
||||
responseType: 'json',
|
||||
})
|
||||
|
||||
// Handle 304 Not Modified - cached version is still valid
|
||||
@@ -337,7 +335,7 @@ async function fetchRemoteManagedSettings(
|
||||
checksum: parsed.data.checksum,
|
||||
}
|
||||
} catch (error) {
|
||||
const { kind, status, message } = classifyAxiosError(error)
|
||||
const { kind, status, message } = classifyHttpError(error)
|
||||
if (status === 404) {
|
||||
// 404 means no remote settings configured
|
||||
return { success: true, settings: {}, checksum: '' }
|
||||
|
||||
Reference in New Issue
Block a user