This commit is contained in:
oogway 2026-01-30 13:09:00 +00:00 committed by GitHub
commit b8d102e0d5
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 32 additions and 2 deletions

1
openclaw Submodule

@ -0,0 +1 @@
Subproject commit 0639c7bf1f37bafeb847afc9e422f05f3bb084a3

View File

@ -10,8 +10,9 @@ export async function writeOAuthCredentials(
agentDir?: string, agentDir?: string,
): Promise<void> { ): Promise<void> {
// Write to resolved agent dir so gateway finds credentials on startup. // Write to resolved agent dir so gateway finds credentials on startup.
const emailStr = typeof creds.email === "string" ? creds.email : "default";
upsertAuthProfile({ upsertAuthProfile({
profileId: `${provider}:${creds.email ?? "default"}`, profileId: `${provider}:${emailStr}`,
credential: { credential: {
type: "oauth", type: "oauth",
provider, provider,

View File

@ -148,6 +148,19 @@ export async function startGatewayServer(
port = 18789, port = 18789,
opts: GatewayServerOptions = {}, opts: GatewayServerOptions = {},
): Promise<GatewayServer> { ): Promise<GatewayServer> {
// Install global unhandled rejection handler to prevent gateway crashes
// from background promises (e.g., Telegram polling, network operations)
const handleUnhandledRejection = (reason: unknown, _promise: Promise<unknown>) => {
const formatted = reason instanceof Error ? reason.message : String(reason);
log.error(`unhandled promise rejection: ${formatted}`);
// Log additional details for debugging
if (reason instanceof Error && reason.stack) {
log.debug(`rejection stack: ${reason.stack}`);
}
// Don't crash the gateway - log and continue
};
process.on("unhandledRejection", handleUnhandledRejection);
// Ensure all default port derivations (browser/canvas) see the actual runtime port. // Ensure all default port derivations (browser/canvas) see the actual runtime port.
process.env.OPENCLAW_GATEWAY_PORT = String(port); process.env.OPENCLAW_GATEWAY_PORT = String(port);
logAcceptedEnvOption({ logAcceptedEnvOption({
@ -572,6 +585,9 @@ export async function startGatewayServer(
return { return {
close: async (opts) => { close: async (opts) => {
// Remove unhandled rejection handler on shutdown
process.off("unhandledRejection", handleUnhandledRejection);
if (diagnosticsEnabled) { if (diagnosticsEnabled) {
stopDiagnosticHeartbeat(); stopDiagnosticHeartbeat();
} }

View File

@ -161,7 +161,12 @@ export async function monitorTelegramProvider(opts: MonitorTelegramOpts = {}) {
const runner = run(bot, createTelegramRunnerOptions(cfg)); const runner = run(bot, createTelegramRunnerOptions(cfg));
const stopOnAbort = () => { const stopOnAbort = () => {
if (opts.abortSignal?.aborted) { if (opts.abortSignal?.aborted) {
void runner.stop(); // Properly await runner.stop() to prevent unhandled rejections
runner.stop().catch((err) => {
(opts.runtime?.error ?? console.error)(
`telegram: runner stop failed: ${formatErrorMessage(err)}`,
);
});
} }
}; };
opts.abortSignal?.addEventListener("abort", stopOnAbort, { once: true }); opts.abortSignal?.addEventListener("abort", stopOnAbort, { once: true });
@ -194,6 +199,13 @@ export async function monitorTelegramProvider(opts: MonitorTelegramOpts = {}) {
} }
} finally { } finally {
opts.abortSignal?.removeEventListener("abort", stopOnAbort); opts.abortSignal?.removeEventListener("abort", stopOnAbort);
// Ensure runner is stopped to prevent lingering promises
try {
await runner.stop();
} catch {
// Suppress errors from runner.stop() in finally block
// (already logged by stopOnAbort if abort-triggered)
}
} }
} }
} }