Skip to content

Commit 268ca6b

Browse files
committed
fix(webview): harden postMessageToWebview with try/catch; replace magic 10ms with INCREMENTAL_SEND_DELAY_MS; guard Task message send calls with non-fatal errors
1 parent 336cccc commit 268ca6b

File tree

2 files changed

+43
-12
lines changed

2 files changed

+43
-12
lines changed

src/core/task/Task.ts

Lines changed: 30 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -545,7 +545,13 @@ export class Task extends EventEmitter<TaskEvents> {
545545
this.clineMessages.push(message)
546546
const provider = this.providerRef.deref()
547547
// Send only the new message instead of the entire state
548-
await provider?.postMessageToWebview({ type: "messageCreated", clineMessage: message })
548+
if (provider) {
549+
try {
550+
await provider.postMessageToWebview({ type: "messageCreated", clineMessage: message })
551+
} catch (error) {
552+
// provider.postMessageToWebview already logs; leave as non-fatal
553+
}
554+
}
549555
this.emit("message", { action: "created", message })
550556
await this.saveClineMessages()
551557

@@ -567,7 +573,13 @@ export class Task extends EventEmitter<TaskEvents> {
567573

568574
private async updateClineMessage(message: ClineMessage) {
569575
const provider = this.providerRef.deref()
570-
await provider?.postMessageToWebview({ type: "messageUpdated", clineMessage: message })
576+
if (provider) {
577+
try {
578+
await provider.postMessageToWebview({ type: "messageUpdated", clineMessage: message })
579+
} catch (error) {
580+
// provider.postMessageToWebview already logs; leave as non-fatal
581+
}
582+
}
571583
this.emit("message", { action: "updated", message })
572584

573585
const shouldCaptureMessage = message.partial !== true && CloudService.isEnabled()
@@ -1449,10 +1461,14 @@ export class Task extends EventEmitter<TaskEvents> {
14491461
await this.saveClineMessages()
14501462
// Send only the updated API request message instead of the entire state
14511463
if (provider && lastApiReqIndex >= 0) {
1452-
await provider.postMessageToWebview({
1453-
type: "messageUpdated",
1454-
clineMessage: this.clineMessages[lastApiReqIndex],
1455-
})
1464+
try {
1465+
await provider.postMessageToWebview({
1466+
type: "messageUpdated",
1467+
clineMessage: this.clineMessages[lastApiReqIndex],
1468+
})
1469+
} catch {
1470+
// non-fatal
1471+
}
14561472
}
14571473

14581474
try {
@@ -1716,10 +1732,14 @@ export class Task extends EventEmitter<TaskEvents> {
17161732
await this.saveClineMessages()
17171733
// Send only the updated API request message instead of the entire state
17181734
if (provider && lastApiReqIndex >= 0) {
1719-
await provider.postMessageToWebview({
1720-
type: "messageUpdated",
1721-
clineMessage: this.clineMessages[lastApiReqIndex],
1722-
})
1735+
try {
1736+
await provider.postMessageToWebview({
1737+
type: "messageUpdated",
1738+
clineMessage: this.clineMessages[lastApiReqIndex],
1739+
})
1740+
} catch {
1741+
// non-fatal
1742+
}
17231743
}
17241744

17251745
// Now add to apiConversationHistory.

src/core/webview/ClineProvider.ts

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@ import axios from "axios"
99
import pWaitFor from "p-wait-for"
1010
import * as vscode from "vscode"
1111

12+
// Small delay used for incremental message delivery to the webview
13+
const INCREMENTAL_SEND_DELAY_MS = 10
14+
1215
import {
1316
type GlobalState,
1417
type ProviderName,
@@ -669,7 +672,15 @@ export class ClineProvider
669672
}
670673

671674
public async postMessageToWebview(message: ExtensionMessage) {
672-
await this.view?.webview.postMessage(message)
675+
try {
676+
await this.view?.webview.postMessage(message)
677+
} catch (error) {
678+
// Guard against unhandled promise rejections from webview messaging
679+
const errMsg =
680+
error instanceof Error ? error.message : typeof error === "string" ? error : JSON.stringify(error)
681+
this.log(`[postMessageToWebview] failed to post message '${message.type}': ${errMsg}`)
682+
// Non-fatal: continue without throwing to avoid crashing extension host
683+
}
673684
}
674685

675686
private async getHMRHtmlContent(webview: vscode.Webview): Promise<string> {
@@ -1346,7 +1357,7 @@ export class ClineProvider
13461357
for (const message of currentCline.clineMessages) {
13471358
await this.postMessageToWebview({ type: "messageCreated", clineMessage: message })
13481359
// Small delay to prevent overwhelming the webview
1349-
await delay(10)
1360+
await delay(INCREMENTAL_SEND_DELAY_MS)
13501361
}
13511362
} else {
13521363
// Normal state update for new tasks or tasks without messages

0 commit comments

Comments
 (0)