mirror of
https://github.com/openclaw/openclaw.git
synced 2026-03-12 07:20:45 +00:00
fix(gateway): land #38725 from @ademczuk
Source: #38725 / 533ff3e70b by @ademczuk.
Thanks @ademczuk.
Co-authored-by: ademczuk <andrew.demczuk@gmail.com>
This commit is contained in:
@@ -5,7 +5,10 @@ import {
|
||||
type GatewayClientMode,
|
||||
type GatewayClientName,
|
||||
} from "../../../src/gateway/protocol/client-info.js";
|
||||
import { readConnectErrorDetailCode } from "../../../src/gateway/protocol/connect-error-details.js";
|
||||
import {
|
||||
ConnectErrorDetailCodes,
|
||||
readConnectErrorDetailCode,
|
||||
} from "../../../src/gateway/protocol/connect-error-details.js";
|
||||
import { clearDeviceAuthToken, loadDeviceAuthToken, storeDeviceAuthToken } from "./device-auth.ts";
|
||||
import { loadOrCreateDeviceIdentity, signDevicePayload } from "./device-identity.ts";
|
||||
import { generateUUID } from "./uuid.ts";
|
||||
@@ -50,6 +53,29 @@ export function resolveGatewayErrorDetailCode(
|
||||
return readConnectErrorDetailCode(error?.details);
|
||||
}
|
||||
|
||||
/**
|
||||
* Auth errors that won't resolve without user action — don't auto-reconnect.
|
||||
*
|
||||
* NOTE: AUTH_TOKEN_MISMATCH is intentionally NOT included here because the
|
||||
* browser client has a device-token fallback flow: a stale cached device token
|
||||
* triggers a mismatch, sendConnect() clears it, and the next reconnect retries
|
||||
* with opts.token (the shared gateway token). Blocking reconnect on mismatch
|
||||
* would break that fallback. The rate limiter still catches persistent wrong
|
||||
* tokens after N failures → AUTH_RATE_LIMITED stops the loop.
|
||||
*/
|
||||
export function isNonRecoverableAuthError(error: GatewayErrorInfo | undefined): boolean {
|
||||
if (!error) {
|
||||
return false;
|
||||
}
|
||||
const code = resolveGatewayErrorDetailCode(error);
|
||||
return (
|
||||
code === ConnectErrorDetailCodes.AUTH_TOKEN_MISSING ||
|
||||
code === ConnectErrorDetailCodes.AUTH_PASSWORD_MISSING ||
|
||||
code === ConnectErrorDetailCodes.AUTH_PASSWORD_MISMATCH ||
|
||||
code === ConnectErrorDetailCodes.AUTH_RATE_LIMITED
|
||||
);
|
||||
}
|
||||
|
||||
export type GatewayHelloOk = {
|
||||
type: "hello-ok";
|
||||
protocol: number;
|
||||
@@ -135,7 +161,9 @@ export class GatewayBrowserClient {
|
||||
this.ws = null;
|
||||
this.flushPending(new Error(`gateway closed (${ev.code}): ${reason}`));
|
||||
this.opts.onClose?.({ code: ev.code, reason, error: connectError });
|
||||
this.scheduleReconnect();
|
||||
if (!isNonRecoverableAuthError(connectError)) {
|
||||
this.scheduleReconnect();
|
||||
}
|
||||
});
|
||||
this.ws.addEventListener("error", () => {
|
||||
// ignored; close handler will fire
|
||||
|
||||
Reference in New Issue
Block a user