transloadit/uppy · info · Error
Companion request failed: ${response.statusText}
Error message
Companion request failed: ${response.statusText} What it means
The logout controller cleans the session and returns 400 when no provider instance is available — meaning Companion cannot perform a server-side token revocation for that provider, though it still clears the local session first (cleanSession()).
Source
Thrown at packages/@uppy/aws-s3/src/s3-client/CompanionS3.ts:23
/**
* S3Companion is an S3Client that interacts with a Companion server to perform S3 operations.
*/
class S3Companion extends S3Client {
readonly companionEndpoint: string
constructor({
companionEndpoint,
requestAbortTimeout,
}: { companionEndpoint: string; requestAbortTimeout?: number | undefined }) {
super({ requestAbortTimeout })
this.companionEndpoint = companionEndpoint
}
private async _fetch(path: string, opts?: RequestInit) {
const response = await fetch(`${this.companionEndpoint}/s3${path}`, opts)
if (!response.ok) {
throw new Error(`Companion request failed: ${response.statusText}`)
}
return response
}
private async _request({
url,
method,
data,
onProgress,
signal,
contentType,
}: {
url: string
method: IT.HttpMethod
data?: XMLHttpRequestBodyInit
onProgress?: IT.OnProgressFn
signal?: AbortSignal
contentType?: stringView on GitHub (pinned to 5d4dedd02a)
Solutions
- Align the providers configured on Companion with what the client uses
- Ensure the request carries a valid provider session token
- If the goal is only local cleanup, treat 400 as acceptable — the session was still cleaned server-side
Example fix
// before
const res = await fetch('/companion/box/logout', { method: 'POST' })
if (!res.ok) throw new Error('logout failed')
// after
const res = await fetch('/companion/box/logout', { method: 'POST' })
// 400 still means the local session was cleaned; provider revocation was skipped Defensive patterns
Strategy: fallback
Validate before calling
const res = await fetch(`${companionUrl}/${provider}/logout`, { method: 'POST' })
// 400 still means local session was cleaned; treat as success for local logout Try / catch
try {
await logout()
} catch {
// best-effort: clear local state regardless of server response
clearLocalSession()
} Prevention
- Treat logout as best-effort; always clear client-side tokens
- Only expect full revocation when the provider is configured server-side
When it happens
Trigger: Calling /logout for a provider that is not configured on this Companion instance, or when the provider session middleware failed to instantiate the provider (bad/expired token).
Common situations: Frontend and backend provider lists out of sync; logging out after the provider config was removed; token already expired so provider was not attached.
Related errors
- Missing S3 object key for aborting upload
- Missing S3 object key for resuming upload
- Missing S3 object key for uploading part
- companionEndpoint must be a string
- s3Endpoint must be a string
AI-assisted analysis of transloadit/uppy@5d4dedd02a (2026-08-28).
Data as JSON: /api/errors/0726173f8f231432.
Report an issue: GitHub.