Browse Source

Only initialize puppeteer if user mentions url

Saoud Rizwan 1 year ago
parent
commit
ee8e64eece
3 changed files with 14 additions and 12 deletions
  1. 0 5
      src/extension.ts
  2. 4 0
      src/providers/ClaudeDevProvider.ts
  3. 10 7
      src/utils/UrlScraper.ts

+ 0 - 5
src/extension.ts

@@ -40,11 +40,6 @@ export function activate(context: vscode.ExtensionContext) {
 
 	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(
 		vscode.window.registerWebviewViewProvider(ClaudeDevProvider.sideBarId, sidebarProvider, {
 			webviewOptions: { retainContextWhenHidden: true },

+ 4 - 0
src/providers/ClaudeDevProvider.ts

@@ -13,6 +13,7 @@ import { getTheme } from "../utils/getTheme"
 import { openFile, openImage } from "../utils/open-file"
 import WorkspaceTracker from "../integrations/WorkspaceTracker"
 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
@@ -53,12 +54,14 @@ export class ClaudeDevProvider implements vscode.WebviewViewProvider {
 	private view?: vscode.WebviewView | vscode.WebviewPanel
 	private claudeDev?: ClaudeDev
 	private workspaceTracker?: WorkspaceTracker
+	private urlScraper?: UrlScraper
 	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) {
 		this.outputChannel.appendLine("ClaudeDevProvider instantiated")
 		ClaudeDevProvider.activeInstances.add(this)
 		this.workspaceTracker = new WorkspaceTracker(this)
+		this.urlScraper = new UrlScraper(this.context)
 		this.revertKodu()
 	}
 
@@ -104,6 +107,7 @@ export class ClaudeDevProvider implements vscode.WebviewViewProvider {
 		}
 		this.workspaceTracker?.dispose()
 		this.workspaceTracker = undefined
+		this.urlScraper = undefined
 		this.outputChannel.appendLine("Disposed all disposables")
 		ClaudeDevProvider.activeInstances.delete(this)
 	}

+ 10 - 7
src/utils/UrlScraper.ts

@@ -11,11 +11,14 @@ import PCR from "puppeteer-chromium-resolver"
 const PUPPETEER_DIR = "puppeteer"
 
 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
-		const globalStoragePath = context?.globalStorageUri?.fsPath
+	}
+
+	private async ensureChromiumExists(): Promise<void> {
+		const globalStoragePath = this.context?.globalStorageUri?.fsPath
 		if (!globalStoragePath) {
 			throw new Error("Global storage uri is invalid")
 		}
@@ -36,8 +39,8 @@ export class UrlScraper {
 		}
 	}
 
-	static async urlToMarkdown(url: string): Promise<string> {
-		await this.ensureChromiumExists(this.context)
+	async urlToMarkdown(url: string): Promise<string> {
+		await this.ensureChromiumExists()
 
 		const globalStoragePath = this.context?.globalStorageUri?.fsPath
 		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
 	// https://stackoverflow.com/questions/52497252/puppeteer-wait-until-page-is-completely-loaded/61304202#61304202
-	private static async waitTillHTMLRendered(page: Page, timeout = 10_000) {
-		const checkDurationMsecs = 1000
+	private async waitTillHTMLRendered(page: Page, timeout = 10_000) {
+		const checkDurationMsecs = 500
 		const maxChecks = timeout / checkDurationMsecs
 		let lastHTMLSize = 0
 		let checkCounts = 1