diff --git a/src/extension.ts b/src/extension.ts index 219d91e..5d89006 100644 --- a/src/extension.ts +++ b/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 }, diff --git a/src/providers/ClaudeDevProvider.ts b/src/providers/ClaudeDevProvider.ts index cdd5546..063bb3a 100644 --- a/src/providers/ClaudeDevProvider.ts +++ b/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) } diff --git a/src/utils/UrlScraper.ts b/src/utils/UrlScraper.ts index cf4bf92..fe220f3 100644 --- a/src/utils/UrlScraper.ts +++ b/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 { + constructor(context: vscode.ExtensionContext) { this.context = context - const globalStoragePath = context?.globalStorageUri?.fsPath + } + + private async ensureChromiumExists(): Promise { + 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 { - await this.ensureChromiumExists(this.context) + async urlToMarkdown(url: string): Promise { + 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