mirror of
https://github.com/openclaw/openclaw.git
synced 2026-05-05 06:10:21 +00:00
fix: restore bootstrap tokens after send failure (#60221)
This commit is contained in:
committed by
Peter Steinberger
parent
5e3a3c42ca
commit
39361d13be
@@ -5,6 +5,7 @@ import { loadConfig } from "../../../config/config.js";
|
||||
import {
|
||||
getDeviceBootstrapTokenProfile,
|
||||
redeemDeviceBootstrapTokenProfile,
|
||||
restoreDeviceBootstrapToken,
|
||||
revokeDeviceBootstrapToken,
|
||||
verifyDeviceBootstrapToken,
|
||||
} from "../../../infra/device-bootstrap.js";
|
||||
@@ -215,6 +216,17 @@ export function attachGatewayWsMessageHandler(params: {
|
||||
logWsControl,
|
||||
} = params;
|
||||
|
||||
const sendFrame = async (obj: unknown): Promise<void> =>
|
||||
await new Promise<void>((resolve, reject) => {
|
||||
socket.send(JSON.stringify(obj), (err) => {
|
||||
if (err) {
|
||||
reject(err);
|
||||
return;
|
||||
}
|
||||
resolve();
|
||||
});
|
||||
});
|
||||
|
||||
const configSnapshot = loadConfig();
|
||||
const trustedProxies = configSnapshot.gateway?.trustedProxies ?? [];
|
||||
const allowRealIpFallback = configSnapshot.gateway?.allowRealIpFallback === true;
|
||||
@@ -1150,14 +1162,9 @@ export function attachGatewayWsMessageHandler(params: {
|
||||
);
|
||||
}
|
||||
|
||||
logWs("out", "hello-ok", {
|
||||
connId,
|
||||
methods: gatewayMethods.length,
|
||||
events: events.length,
|
||||
presence: snapshot.presence.length,
|
||||
stateVersion: snapshot.stateVersion.presence,
|
||||
});
|
||||
|
||||
let consumedBootstrapTokenRecord:
|
||||
| Awaited<ReturnType<typeof revokeDeviceBootstrapToken>>["record"]
|
||||
| undefined;
|
||||
if (
|
||||
authMethod === "bootstrap-token" &&
|
||||
bootstrapProfile &&
|
||||
@@ -1174,6 +1181,7 @@ export function attachGatewayWsMessageHandler(params: {
|
||||
const revoked = await revokeDeviceBootstrapToken({
|
||||
token: bootstrapTokenCandidate,
|
||||
});
|
||||
consumedBootstrapTokenRecord = revoked.record;
|
||||
if (!revoked.removed) {
|
||||
logGateway.warn(
|
||||
`bootstrap token revoke skipped after profile redemption device=${device.id}`,
|
||||
@@ -1186,7 +1194,31 @@ export function attachGatewayWsMessageHandler(params: {
|
||||
);
|
||||
}
|
||||
}
|
||||
send({ type: "res", id: frame.id, ok: true, payload: helloOk });
|
||||
try {
|
||||
await sendFrame({ type: "res", id: frame.id, ok: true, payload: helloOk });
|
||||
} catch (err) {
|
||||
if (consumedBootstrapTokenRecord) {
|
||||
try {
|
||||
await restoreDeviceBootstrapToken({
|
||||
record: consumedBootstrapTokenRecord,
|
||||
});
|
||||
} catch (restoreErr) {
|
||||
logGateway.warn(
|
||||
`bootstrap token restore failed after hello send error device=${device?.id ?? "unknown"}: ${formatForLog(restoreErr)}`,
|
||||
);
|
||||
}
|
||||
}
|
||||
setCloseCause("hello-send-failed", { error: formatForLog(err) });
|
||||
close();
|
||||
return;
|
||||
}
|
||||
logWs("out", "hello-ok", {
|
||||
connId,
|
||||
methods: gatewayMethods.length,
|
||||
events: events.length,
|
||||
presence: snapshot.presence.length,
|
||||
stateVersion: snapshot.stateVersion.presence,
|
||||
});
|
||||
void refreshGatewayHealthSnapshot({ probe: true }).catch((err) =>
|
||||
logHealth.error(`post-connect health refresh failed: ${formatError(err)}`),
|
||||
);
|
||||
|
||||
Reference in New Issue
Block a user