Only initialize puppeteer if user mentions url

This commit is contained in:
Saoud Rizwan
2024-09-18 17:42:15 -04:00
parent e3144996fb
commit ee8e64eece
3 changed files with 14 additions and 12 deletions

View File

@@ -40,11 +40,6 @@ export function activate(context: vscode.ExtensionContext) {
const sidebarProvider = new ClaudeDevProvider(context, outputChannel) const sidebarProvider = new ClaudeDevProvider(context, outputChannel)
// Installs chromium for puppeteer url scraping
UrlScraper.ensureChromiumExists(context).catch((error) => {
outputChannel.appendLine(`Error installing Chromium: ${JSON.stringify(error)}`)
})
context.subscriptions.push( context.subscriptions.push(
vscode.window.registerWebviewViewProvider(ClaudeDevProvider.sideBarId, sidebarProvider, { vscode.window.registerWebviewViewProvider(ClaudeDevProvider.sideBarId, sidebarProvider, {
webviewOptions: { retainContextWhenHidden: true }, webviewOptions: { retainContextWhenHidden: true },

View File

@@ -13,6 +13,7 @@ import { getTheme } from "../utils/getTheme"
import { openFile, openImage } from "../utils/open-file" import { openFile, openImage } from "../utils/open-file"
import WorkspaceTracker from "../integrations/WorkspaceTracker" import WorkspaceTracker from "../integrations/WorkspaceTracker"
import { openMention } from "../utils/context-mentions" import { openMention } from "../utils/context-mentions"
import { UrlScraper } from "../utils/UrlScraper"
/* /*
https://github.com/microsoft/vscode-webview-ui-toolkit-samples/blob/main/default/weather-webview/src/providers/WeatherViewProvider.ts https://github.com/microsoft/vscode-webview-ui-toolkit-samples/blob/main/default/weather-webview/src/providers/WeatherViewProvider.ts
@@ -53,12 +54,14 @@ export class ClaudeDevProvider implements vscode.WebviewViewProvider {
private view?: vscode.WebviewView | vscode.WebviewPanel private view?: vscode.WebviewView | vscode.WebviewPanel
private claudeDev?: ClaudeDev private claudeDev?: ClaudeDev
private workspaceTracker?: WorkspaceTracker private workspaceTracker?: WorkspaceTracker
private urlScraper?: UrlScraper
private latestAnnouncementId = "sep-14-2024" // update to some unique identifier when we add a new announcement private latestAnnouncementId = "sep-14-2024" // update to some unique identifier when we add a new announcement
constructor(readonly context: vscode.ExtensionContext, private readonly outputChannel: vscode.OutputChannel) { constructor(readonly context: vscode.ExtensionContext, private readonly outputChannel: vscode.OutputChannel) {
this.outputChannel.appendLine("ClaudeDevProvider instantiated") this.outputChannel.appendLine("ClaudeDevProvider instantiated")
ClaudeDevProvider.activeInstances.add(this) ClaudeDevProvider.activeInstances.add(this)
this.workspaceTracker = new WorkspaceTracker(this) this.workspaceTracker = new WorkspaceTracker(this)
this.urlScraper = new UrlScraper(this.context)
this.revertKodu() this.revertKodu()
} }
@@ -104,6 +107,7 @@ export class ClaudeDevProvider implements vscode.WebviewViewProvider {
} }
this.workspaceTracker?.dispose() this.workspaceTracker?.dispose()
this.workspaceTracker = undefined this.workspaceTracker = undefined
this.urlScraper = undefined
this.outputChannel.appendLine("Disposed all disposables") this.outputChannel.appendLine("Disposed all disposables")
ClaudeDevProvider.activeInstances.delete(this) ClaudeDevProvider.activeInstances.delete(this)
} }

View File

@@ -11,11 +11,14 @@ import PCR from "puppeteer-chromium-resolver"
const PUPPETEER_DIR = "puppeteer" const PUPPETEER_DIR = "puppeteer"
export class UrlScraper { export class UrlScraper {
private static context?: vscode.ExtensionContext private context: vscode.ExtensionContext
static async ensureChromiumExists(context?: vscode.ExtensionContext): Promise<void> { constructor(context: vscode.ExtensionContext) {
this.context = context this.context = context
const globalStoragePath = context?.globalStorageUri?.fsPath }
private async ensureChromiumExists(): Promise<void> {
const globalStoragePath = this.context?.globalStorageUri?.fsPath
if (!globalStoragePath) { if (!globalStoragePath) {
throw new Error("Global storage uri is invalid") throw new Error("Global storage uri is invalid")
} }
@@ -36,8 +39,8 @@ export class UrlScraper {
} }
} }
static async urlToMarkdown(url: string): Promise<string> { async urlToMarkdown(url: string): Promise<string> {
await this.ensureChromiumExists(this.context) await this.ensureChromiumExists()
const globalStoragePath = this.context?.globalStorageUri?.fsPath const globalStoragePath = this.context?.globalStorageUri?.fsPath
if (!globalStoragePath) { if (!globalStoragePath) {
@@ -77,8 +80,8 @@ export class UrlScraper {
// page.goto { waitUntil: "networkidle0" } may not ever resolve, and not waiting could return page content too early before js has loaded // page.goto { waitUntil: "networkidle0" } may not ever resolve, and not waiting could return page content too early before js has loaded
// https://stackoverflow.com/questions/52497252/puppeteer-wait-until-page-is-completely-loaded/61304202#61304202 // https://stackoverflow.com/questions/52497252/puppeteer-wait-until-page-is-completely-loaded/61304202#61304202
private static async waitTillHTMLRendered(page: Page, timeout = 10_000) { private async waitTillHTMLRendered(page: Page, timeout = 10_000) {
const checkDurationMsecs = 1000 const checkDurationMsecs = 500
const maxChecks = timeout / checkDurationMsecs const maxChecks = timeout / checkDurationMsecs
let lastHTMLSize = 0 let lastHTMLSize = 0
let checkCounts = 1 let checkCounts = 1